final是Java中的终结器,final修饰类这个类则不能被继承,final修饰方法这个方法则不能被覆写……
1.final修饰类
final修饰类则表示这个类是不能够extends继承。可以理解为这个类不能拥有子类,一旦这个类被final修饰则这个类中的所有方法都会默认被final修饰称为终结方法不能被覆写,而成员变量–属性则不会加上final关键字修饰。
通常JDK中的包装类以及工具类String,Integer类等都会被final修饰。
class A{
int a=0;
final class B{
void func(){
System.out.println("A:func");
}
}
}
class C extends A{
void func() {
new B().func();
}
}
public class Test{
public static void main(String[] args){
C c =new C();
c.func();
}
}
这个代码是没有问题的。虽然内部类被定义为final只是说明这个内部类不能通过extends继承子类,外部类继承后的子类是可以访问到父类的内部类的哦。
2.final修饰方法
当一个方法被final修饰,明确表示该方法不允许被覆写。当一个方法被定义为了private,相当于加上了一个final。
3.final修饰属性
被final修饰的成员变量必须在声明时初始化,并且初始化后值无法被修改。可以通过定义时直接赋值,可以通过构造函数初始化,可以通过构造块完成初始化。
因为final修饰的值和类型都不可以被改变,相当于常量。也就是说,final修饰的变量,不会发生类型提升。
final byte b1 =2;
final byte b2 =3;
byte b3=0;
byte b4 =4;
byte b5 =b1+b2;//不出错,因为b1+b2 被final修饰,没有方法类型提升。
byte b6 = b3 +b4;//出错,b3+b4有类型提升,int转byte 大转小需要强转。
建议写完全局变量public final static int B =1;
并且在类加载时初始化。及可以通过静态块初始化。这样的话,类名调用,效率较高。
命名规范规定:全局常量多个单词全部大写。单词间“_”分隔。
final修饰引用数据类型变量
final修饰的变量值不能改变,而引用数据类型变量存储的是地址,所以地址的值不能改变,也就是不能改变指向。
final String str ="hello";