- 定义:终极的,不可修改的。可以修饰类方法和变量
- 修饰变量:
基本数据类型:被修饰的成员变量表示常量,只能被赋值一次,赋值后值不再改变。final修饰一个成员变量(属性),必须要显示初始化。一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
//public final int a = 10;
public final int a ;
public final int b = 10;
public Demo()
{
a= 10;//构造函数里面初始化
// b = 20;//报错,不可以重新赋值
}
引用数据类型:当其修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。final修饰的值是当前对象的地址不在改变。
final Student s1 = new Student();
// s1 = new Student();//报错 被final修饰的对象引用只有一个不会改变。
s1.id = 1;
s1.name = "yang";
System.out.println(s1.toString());
s1.id = 2;
System.out.println(s1.toString());
打印结果:
Student{id=1, name='yang'}
Student{id=2, name='yang'}
- 修饰方法:
被final修饰的方法不可以被重写。如果父类的方法为private修饰,则子类中可以有和父类中此方法名相同的方法,此时不是子类重写了父类的方法,而是父类此方法的访问权限为私有,子类并未继承得到。
class Father{
public int id;
public String name;
public final void test()//如果为 private final void test()则子类中的test()方法就可以。此时不是子类重写了父类的方法,而是父类此方法的访问权限为私有,子类并未继承得到。
{ }
}
class Son extends Father{
public Son()
{ super();}
public void test()//报错,不可以重写父类的方法
{}
}
- 修饰类
被final修饰的类不可以被其他类继承。