有没有办法在Java中覆盖类变量?

问题

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);
        }
}