final 具有“不可改变”的含义,他可以修饰非抽象类、非抽象成员方法和变量。
1、用final修饰的类不能被继承,没有子类。
2、用final修饰的方法不能被子类的方法重写或隐藏。
3、用final修饰的变量表示常量,只能被赋值一次。
4、父类中的用private修饰的方法不能被子类的方法重写,因此private类型的方法默认为是final类型的。
final类的使用
1、不是专门为继承而设计的类,类本身的方法之间有复杂的调用关系。如果随意创建这些类的子类,子类有可能错误的修改父类的细节。
2、出于安全的原因,类的实现细节不允许有任何改动。
3.、在创建对象模型时,确信这个类不会再被扩展。
final方法
假如父类允许子类继承父类的某些方法或重写某些方法,但保留某些方法,时这些方法不能被继承,那么父类可以将这些方法声明为final类型。如果父类的某个方法是private,子类将无法继承该方法,自然也就无法重写或隐藏该方法。
package javademo;
class Parent{
private final void method1(){//定义method1()方法为final方法
System.out.println("Parent.method1()");
}
final void method2(){
System.out.println("Parent.method2()");
}
public void method3(){
System.out.println("Parent.method3()");
}
}
class Son extends Parent{
public final void method1(){//在子类中定义一个method1()方法
System.out.println("Son.method1()");
}
// final void method2(){ //final方法不能被重写
// System.out.println("Son.method2()");
// }
public void method3(){
System.out.println("Son.method3()");
}
}
public class FinalMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.method1();
Parent p = s; //执行向上转型操作
// p.method1(); //不能调用private方法
p.method2();
p.method3();
}
}
作为final方法不能被子类重写或隐藏,例如method2()方法就不能在子类中被重写,但是在父类中定义了一个private final 的method1()方法,同时子类中也定义method1()方法,但这不是方法的重写。方法的重写的前提条件是只有子类能继承的实例方法才会被重写,而父类的method1()方法是不能被继承的,因此这个方法不能被重写,只是在子类中定义的新方法而已,着来年各个方法之间毫无法关系的。
final变量
一个变量被限定为final,其实是将它定义为一个符号常量。
final变量具有以下特点:
1、final修饰符可以修饰静态变量、实例变量、局部变量,分别表示静态常量、实例常量、局部常量。
2、final成员百年来那个应该是显式初始化,否则final类型的实例变量会导致编译错误