2 lug0701 lug0701 于 2016.09.24 15:50 提问

java中常量在子类的继承问题

各位大神帮忙看看:
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里面能被覆盖

4个回答

quasimodo_es
quasimodo_es   2016.09.24 16:18
已采纳

语法就是如此啊:
final类不能被继承。
final方法不能被子类的方法覆盖,可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。子类可以覆盖,但是不常用。

a541995149
a541995149   2016.09.24 17:44

覆盖本来就是这个意思,A继承了B,那么A中有跟B一样的内容,就会调用A中的内容,如2楼所说,这就是语法啊。
你可能以为Base的final FOO变量被修改了,其实没有,你通过((Base) Sub).FOO还是可以得到Base变量初始化的FOO,他们属于两个不同类对象的静态变量。你通过Sub.FOO就得到子类的FOO

lovehoney19
lovehoney19   2016.09.24 16:07

子类把那个常量继承过来,重写了吧

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.09.24 18:21
 首先,static修饰的成员属性是类属性,就是直接通过类名访问的属性,它不存在集成这种概念的。
其次,final修饰的String类型是字符串常量,它的值在类加载的时候被赋值初始化之后,是不允许再次修改的。
Csdn user default icon
上传中...
上传图片
插入图片