final 让子类无法重写final修饰的方法
final 可以修饰:
类: 最终类 无法被继承
方法: 最终方法 无法被重写
变量: final修饰变量, 该变量不能被重新赋值,因为这个变量是常量
常量:
字面值常量:
“hello”,10,true
自定义常量
final int x = 10;
final修饰局部变量的问题
基本类型:基本类型的值不能发生改变
引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的.
例:
class Student{
int a = 10;
}
class FinalDemo{
public static void main(String[] args){
// 局部变量是基本数据类型
int x = 10;
x = 100;
System.out.println(x);
final int y = 10;
// 无法为最终变量x分配值
// y = 100;
System.out.println(y);
System.out.println("-------------");
// 局部变量是引用数据类型
Student s = new Student();
System.out.println(s.a);
s.a = 100;
//s = new Student(); 可以重新分配对象地址
System.out.println(s.a);
System.out.println("-------------");
final Student ss = new Student();
System.out.println(ss.a);
ss.a = 100;
System.out.println(ss.a);// 不会报错 最终打印ss.a = 100;
System.out.println("-------------");
//ss = new Student(); //报错 无法为最终变量ss分配值
//final修饰的引用数据类型的成员变量,表示其地址值不能被修改
}
}
final 修饰变量的初始化时机
被final修饰的变量只能赋值一次
在构造方法完毕前(非静态)
例:
class Demo{
int num;
final int num2;
{
//num2 = 10; // 只可以赋值一次,在这里也可以
}
public Demo(){
num = 100;
// 可以赋值一次
num2 = 200;
}