/* final可以修饰类,方法,变量 特点: final(可以修饰类),该(类)(不能被继承)。一旦修饰了一个类,这个类就不能被继承了! final以修饰方法,该方法可以被继承但是不能被重写。(覆盖,复写) final可以修饰变量,该变量可以被继承但是不能被重新赋值。因为这个变量其实是常量。 常量: A:字面值常量 "hello",10,true B:自定义常量 final int x = 10; */ //final class Fu //无法从最终Fu进行继承,final是最终类,最终类是无法被继承的哦 class Fu { public int num = 10; public final int num2 = 20; } class Zi extends Fu { public void show() { num = 100;//注意这里是,num=100;不是int num = 100.该语句改变了num的值,即使使用super.num结果仍然是100(因为被重新赋值了)。没有被final修饰,不是最后的变量,还可以被重新赋值。 System.out.println(this.num); System.out.println(super.num); //无法为最终变量num2分配值,该变量不能被重新赋值。因为这个变量其实是常量 //num2 = 200; System.out.println(num2); } } class FinalDemo { public static void main(String[] args) { Zi z = new Zi(); z.show(); } }
/* final修饰变量的初始化时机 A:被final修饰的变量只能赋值一次。 B:在构造方法完毕前。(条件是非静态的常量) */ class Demo { //int num = 10; //final int num2 = 20;//常量,无法为最终变量num2分配值 int num; final int num2;//这样定义再给值是没有问题的 { num2 = 10;//num2赋值只能给一次 } public Demo() { num = 100; //无法为最终变量num2分配值 num2 = 200; } } class FinalTest2 { public static void main(String[] args) { Demo d = new Demo(); System.out.println(d.num); System.out.println(d.num2); } }
/* 继承的代码体现 由于继承中方法有一个现象:方法重写。 所以,父类的功能,就会被子类给覆盖调。 有些时候,我们(不想让子类去覆盖掉父类的功能),(只能让他使用),final修饰之后只能被继承不能被重写。 这个时候,针对这种情况,Java就提供了一个关键字:final final:最终的意思。常见的是它可以修饰类,方法,变量。 */ class Fu { public final void show() { System.out.println("这里是绝密资源,任何人都不能修改"); } } class Zi extends Fu { // Zi中的show()无法覆盖Fu中的show(),父类中的方法加上final后,子类没法对该方法进行重写了.报错 public void show() {//报错 System.out.println("这是一堆垃圾,你重写show方法就回报错"); } } class ZiDemo { public static void main(String[] args) { Zi z = new Zi(); z.show(); } }