这里对final关键字进行总结。
final类
当类声明为final时,就不能定义这个类的子类。因为final类的类无法定义子类,所以final类声明的所有方法不会被覆盖(override)。
final方法
若将实例方法声明为final时,这个方法无法被子类所覆盖(override)。
若将类方法(static方法)声明为final时,这个方法无法被子类所隐藏(hide)。对隐藏这个术语不熟,本文最后会加上。
final字段(final属性)
final字段的值只能指定一次。
final实例字段的值只能在定义时或者在构造器中指定。
如:
class A{
final int i = 1;
}
class A{
final int i;
public A(){
this.i = 2;
}
}
final类字段的值只能在定义是或者在static块(静态初始化块)中指定。
class A{
static final int i = 12;
}
class A{
static final int i;
static{
i = 12;
}
}
final局部变量和final参数
final局部变量的值只能指定一次。
final参数的值在方法被调用时,由实参指定,不能再次指定(实际上也满足被指定一次的原则)。
下面对java中类的继承中的覆盖(override)和隐藏(hide)进行总结。
在《Java核心技术卷一》中对隐藏是采用的访问限定符(如public,private,protected)来实现的。这里的隐藏不是采用访问限定符来实现的,而是采用子类和父类有同名的类方法和字段(实例字段和静态字段)来实现的。在实际编程中,隐藏一般只用于类方法,即父类的类方法被子类中同名(这里的同名指方法名和参数都一样,其实返回值也必须一样,可以试一试)的类方法隐藏。
这里继续总结一下:
- 子类可以覆盖父类的实例方法(方法名、参数和返回值都一样),另外,这里还有一个重载(overload)的概念,重载是一个静态的概念,是在编译时根据方法名和参数来确定的,重载是一个类自身的一个属性,和继承没有关系。
- 子类可以隐藏父类的类方法(方法名、参数和返回值都一样)
- 子类可以隐藏父类的字段(实例字段和静态字段)(通过在子类中定义字段名相同(类型可和父类不一样)的字段即可)。
覆盖是动态的概念,是在运行时决定的。重载和隐藏是静态的概念,是在编译时决定的。
参考:
- 《Java多线程设计模式》中国铁道出版社 2005
文章来源:
http://localhost/wp2/?p=61