final关键字(掌握)
(1)是最终的意思,可以修饰类,方法,变量。
(2)特点:
A:它修饰的类,不能被继承。
B:它修饰的方法,不能被重写。
C:它修饰的变量,是一个常量。
(3)面试相关:
A:局部变量
a:基本类型 值不能发生改变
b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的
B:初始化时机
a:只能初始化一次。
b:常见的给值
定义的时候。(推荐)
构造方法中。
/* 继承的代码体现 由于继承中方法有一个现象:方法重写。 所以,父类的功能,就会被子类给覆盖调。 有些时候,我们不想让子类去覆盖掉父类的功能,只能让他使用。 这个时候,针对这种情况,Java就提供了一个关键字:final final:最终的意思。常见的是它可以修饰类,方法,变量。 */ class Fu { public final void show() { System.out.println("这里是绝密资源,任何人都不能修改"); } } class Zi extends Fu { // Zi中的show()无法覆盖Fu中的show() public void show() { System.out.println("这是一堆垃圾"); } } class ZiDemo { public static void main(String[] args) { Zi z = new Zi(); z.show();//异常 } } /* final可以修饰类,方法,变量 特点: final可以修饰类,该类不能被继承。 final可以修饰方法,该方法不能被重写。(覆盖,复写) final可以修饰变量,该变量不能被重新赋值。因为这个变量其实常量。 常量: A:字面值常量 "hello",10,true B:自定义常量 final int x = 10; */ //final class Fu //报错:无法从最终Fu进行继承 class Fu { public int num = 10; public final int num2 = 20; /* public final void show() { } */ } class Zi extends Fu { //报错:Zi中的show()无法覆盖Fu中的show() public void show() { num = 100; System.out.println(num); //报错:无法为最终变量num2分配值 //num2 = 200; System.out.println(num2); } } class FinalDemo { public static void main(String[] args) { Zi z = new Zi(); z.show(); } } 面试题:final修饰局部变量的问题: /* 面试题:final修饰局部变量的问题 基本类型:基本类型的值不能发生改变。 引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。 */ class Student { int age = 10; } class FinalTest { public static void main(String[] args) { //局部变量是基本数据类型 int x = 10; x = 100; System.out.println(x);//100 final int y = 10; //y = 100; System.out.println(y);//报错:无法为最终变量y分配值 //局部变量是引用数据类型 Student s = new Student(); System.out.println(s.age);//10 s.age = 100; System.out.println(s.age);//100 final Student ss = new Student(); System.out.println(ss.age);//10 ss.age = 100; System.out.println(ss.age);//100 //重新分配内存空间,就是给新的地址值 ss = new Student();//报错:无法为最终变量ss分配值 } }final修饰变量的初始化时机:
打印的是100
报错:无法为最终变量num2分配值,因为常量不能重新赋值
/* final修饰变量的初始化时机 A:被final修饰的变量只能赋值一次。 B:在构造方法完毕前。(仅仅针对非静态的常量,因为静态的早就加载了) */ class Demo { int num; final int num2; { //num2 = 10; } public Demo() { num = 100; num2 = 200; } } class FinalTest2 { public static void main(String[] args) { Demo d = new Demo(); System.out.println(d.num); System.out.println(d.num2); } }