final关键字可以用来修饰类、方法和变量(成员变量和局部变量)
被final修饰过的类叫做最终类,无法被继承,不会有子类
final 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修饰的方法,不可被重写(覆盖)
//父类 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(); } }
报错:Zi中的show()无法覆盖Fu中的show()
常量分为 1.字面值常量 “hello” “10” “meme” “michi”
2.自定义常量 final int x =10;
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分配值 //y = 100; System.out.println(y); // 10 System.out.println("--------------"); //局部变量是引用数据类型 Student s = new Student(); System.out.println(s.age); // 10 s.age = 100; System.out.println(s.age); // 100 System.out.println("--------------"); final Student ss = new Student(); System.out.println(ss.age); // 10 ss.age = 100; System.out.println(ss.age); // 100 //重新分配内存空间 //无法为最终变量ss分配值 ss = new Student(); } }
被final修饰的变量只能赋值一次,1.是在定义的时候赋值,
2.在构造方法完毕前赋值(非静态常量)
class Demo { //int num = 10; //final int num2 = 20; int num; final int num2; { //num2 = 10; } 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); } }