1.final类:不允许任何类继承,并且不允许其他人对这个类进行任何改动;
当被某个类设置为final类时,类中的所有方法都被隐式的设置为final形式,但是final类中的成员变量既可以被定义为final形式,又可以被定义为非final形式。
例1:使用final修饰五星红旗类,输出“五星红旗是由红色的旗面和5颗黄色的五角星组成的”,运行效果如下:
public final class FiveStarRedFlag { int starNum; String starColor; String backgroundColor; public FiveStarRedFlag(int starNum,String starColor,String backgroundColor){ this.starNum=starNum; this.starColor=starColor; this.backgroundColor=backgroundColor; } public static void main(String[] args){ FiveStarRedFlag fg=new FiveStarRedFlag(5,"黄色","红色"); System.out.println("五星红旗是由"+fg.backgroundColor+"的旗面和"+fg.starNum+"颗"+fg.starColor+"的五角星组成的"); } }
2.final方法:不能被重写 。
将方法定义为final类型可以防止子类修改该方法的定义与实现方式,同时final方法的执行效率要高于非final方法。如果一个父类的某个方法被设置为private修饰符,子类将无法访问该方法,自然无法覆盖该方法,所以一个定义为 private的方法隐式被指定为final类型,这样无须将一个定义为private的方法再定义为final类型。
练习:编写交通类,将遵守交通规则的方法设为final()方法,不管是行人,非机动车辆,还是机动车辆,遵守的交通规则都是一样的,例如红灯停,绿灯行等。运行效果如下:
class Traffic{ String TrafficRule; public Traffic(String TrafficRule){ this.TrafficRule=TrafficRule; } public final String Obey(){ return this.TrafficRule+"要遵守交通规则,红灯停,绿灯行,黄灯需要等一等!"; } } class Pedestrian extends Traffic{ public Pedestrian(String TrafficRule){ super(TrafficRule); } } class motorvehicle extends Traffic{ public motorvehicle(String TrafficRule){ super(TrafficRule); } } class nonmotorvehicle extends Traffic{ public nonmotorvehicle(String TrafficRule){ super(TrafficRule); } } public class TrafficFinalMethod { public static void main(String[] args){ Pedestrian p=new Pedestrian("行人"); System.out.println(p.Obey()); motorvehicle m=new motorvehicle("机动车"); System.out.println(m.Obey()); nonmotorvehicle n=new nonmotorvehicle("非机动车"); System.out.println(n.Obey()); } }
3.final变量:可用于修饰变量,一旦变量被final修饰,就不可以再改变变量的值。通常,把被final修饰的变量称作常量。
final修饰变量时,必须在声明时对其进行赋值操作。final除了可以修饰基本数据类型的常量,还可以修饰对象引用,例如被final修饰的数组。一旦一个对象引用被final修饰后,它只能恒定指向一个对象,无法指向另一个对象。一个既是static又是final的字段占据了一段不能改变的存储空间。
练习1:动车组每节车厢只有108个座位,共有10节车厢,现有旅客1189人,从控制台输出滞留旅客的人数。运行效果如下:
public class TravelPeople { final int num=10;//声明一个常量,10节车厢 int seatnum=108; //每节车厢108个座位 int peoplenum=1189; //现有旅客1189人 public void travel(){ int A; //滞留人员数量 A=peoplenum-(seatnum *num); System.out.println("滞留旅客的人数是:"+A); } // public static void main(String[] args){ TravelPeople t=new TravelPeople(); t.travel(); } }
练习2:将π的值设为常量,在控制台输入水泥柱的底面周长后,输出该水泥柱的直径。运行效果如下:
import java.util.Scanner; public class Yuanzhu { final double pi=3.14; double d; public void calculate(double num){ d=num/pi; System.out.println("水泥柱的直径是"+d); } public static void main(String[] args){ Yuanzhu y=new Yuanzhu(); Scanner sc=new Scanner(System.in); System.out.println("请输入水泥柱的地面周长:"); double ZhouChang=sc.nextDouble(); y.calculate(ZhouChang); } }