各位大神帮忙看看:
public class Base {
public static final String FOO = "foo";
}
class Sub extends Base {
public static final String FOO="bar";
}
public static void main(String[] args) {
Base b = new Base();
Sub s = new Sub();
System.out.print(Base.FOO);
System.out.print(Sub.FOO);
}
结果 foobar
常量在Base里面已经初始化,为什么在子类Sub里面能被覆盖
语法就是如此啊:
final类不能被继承。
final方法不能被子类的方法覆盖,可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。子类可以覆盖,但是不常用。
子类把那个常量继承过来,重写了吧
覆盖本来就是这个意思,A继承了B,那么A中有跟B一样的内容,就会调用A中的内容,如2楼所说,这就是语法啊。
你可能以为Base的final FOO变量被修改了,其实没有,你通过((Base) Sub).FOO还是可以得到Base变量初始化的FOO,他们属于两个不同类对象的静态变量。你通过Sub.FOO就得到子类的FOO
首先,static修饰的成员属性是类属性,就是直接通过类名访问的属性,它不存在集成这种概念的。
其次,final修饰的String类型是字符串常量,它的值在类加载的时候被赋值初始化之后,是不允许再次修改的。