java - 有没有办法覆盖 Java 中的类变量?

标签 java inheritance overriding

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 将打印“dad”。有没有办法让它打印“儿子”?

最佳答案

简而言之,不,没有办法覆盖类变量。

您不会覆盖 Java 中的类变量,而是隐藏它们。覆盖是实例方法。隐藏不同于覆盖。

在您给出的示例中,通过在 Son 类中声明名为“me”的类变量,您隐藏了它将从其父类(super class) Dad 继承的具有相同名称的类变量“me”。以这种方式隐藏变量不会影响父类(super class) 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 部分提供了更多关于隐藏的详细信息

关于java - 有没有办法覆盖 Java 中的类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685300/

相关文章:

C++ 字符串覆盖链接错误

java - 如何将 Instagram 媒体对象中的created_at字段值转换为日期

java - 泛型中具有两个菱形括号的方法是什么意思?

swift - 奇怪的错误 "Declarations in extensions cannot override"

c++ - 具有任何返回类型和任何参数的 Derived Functor

inheritance - 覆盖 Swift 中的存储属性

java - 重写 setUI 中的 setIcon() 方法(new BasicComboBOxUI){}

java - 如何同时使用 && 和 ||在 if 语句中

java - hibernate 异常 : proxy handle is no longer valid after database violation error

javascript - 在 ES6 中使用原型(prototype)继承