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

2022-08-31 06:52:06
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

简而言之,不,没有办法重写类变量。

不要在Java中覆盖类变量,而是隐藏它们。例如,重写是方法。隐藏不同于覆盖。

在你给出的示例中,通过在类 Son 中声明名为“me”的类变量,可以隐藏它从其超类爸爸继承的类变量,该类变量具有相同的名称“me”。以这种方式隐藏变量不会影响超类 Dad 中类变量“me”的值。

对于您问题的第二部分,如何使其打印“son”,我将通过构造函数设置值。尽管下面的代码与您最初的问题背道而驰,但我会这样写;

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println(name);
    }
}

JLS 在 8.3 节 - 字段声明中提供了有关隐藏的更多详细信息


答案 2

是的。但是,就变量而言,它被覆盖(为变量赋予新值。为函数提供新的定义是 Override)。只是不要声明变量,而是在构造函数或静态块中初始化(更改)。

在父类的块中使用时,该值将得到反映

如果变量是静态的,则在初始化期间使用静态块更改值,

class Son extends Dad {
    static { 
       me = "son"; 
    }
}

否则,构造函数中的更改。

您也可以稍后在任何块中更改该值。它将在超级类中得到体现


推荐