问题
class Dad
{
protected static String me = "dad";
public void printMe()
{
System.out.println(me);
}
}
class Son extends Dad
{
protected static String me = "son";
}
public void doIt()
{
new Son().printMe();
}
功能doIt将打印"爸爸"。有没有办法让它打印"儿子"?
#1 热门回答(91 赞)
简而言之,不,没有办法覆盖类变量。
你不会在Java中覆盖隐藏它们的类变量。覆盖是例如方法。隐藏不同于重写。
在你给出的示例中,通过在类Son中声明名为"me"的类变量,你可以隐藏它将从其超类Dad继承的类变量,其名称为"me"。以这种方式隐藏变量不会影响超类爸爸中类变量"我"的值。
对于你的问题的第二部分,如何使它打印"儿子",我将通过构造函数设置值。虽然下面的代码与你原来的问题背道而驰,但我会写出类似的东西;
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
JLS在第8.3 - Field Declarations节中提供了更多关于隐藏的细节
#2 热门回答(48 赞)
是。但是就变量而言,它是覆盖(给变量赋予新值。给函数赋予新的定义是覆盖).Just don't declare the variable but initialize (change) in the constructor or static block.
在父类的块中使用时,将反映该值
如果变量是静态的,那么在初始化期间使用静态块更改值,
class Son extends Dad {
static {
me = 'son';
}
}
或者改变构造函数。
你也可以稍后在任何块中更改该值。它将反映在超级课程中
#3 热门回答(31 赞)
是的,只需覆盖printMe()
方法:
class Son extends Dad {
public static final String me = "son";
@Override
public void printMe() {
System.out.println(me);
}
}