【问题标题】:Java static variable in method overriding [duplicate]方法覆盖中的Java静态变量[重复]
【发布时间】:2018-04-21 02:29:13
【问题描述】:

我有一个代码,我希望输出与实际输出不同。由于静态变量是基于引用的,我希望输出是“超类”,但我得到的是“子类”。代码:

class TestClass {
    public static void main(String args[] ) throws Exception {
        A b = new B(); // Since the reference is A, "superclass" should be the output
        b.test();
    }
}
abstract class A{
    static String a = "superclass";
    abstract void test();
}
class B extends A{
    static String a = "subclass";
    void test(){
        System.out.println(a); // Output subclass
    }
}

请告诉我我哪里错了..

【问题讨论】:

  • 如果您写了System.out.println(b.a),它确实会打印“超类”,因为变量b 的类型为A(因此b.a 与静态变量的A.a 相同)。您指的是B 类内部方法中的变量a,因此它等同于B.a
  • 这里和其他地方有很多答案声称静态变量不是继承的。他们都错了,这很容易证明。
  • 您没有资格亲自向我提出这个问题。您已经询问了整个 SO 社区。你也没有资格称呼我为“先生”。我不是王国的骑士。

标签: java static


【解决方案1】:

静态变量在 java 中不被继承。你变量 static String a 是静态的,它将它与一个类相关联。 Java 继承不适用于static 变量。

如果你绝对想要你可以使用的超类变量:

System.out.println(super.a);

这是您可能希望看到的继承:

abstract class A {
     String a = "superclass";

    abstract void test();
}

class B extends A {
    void test() {
        System.out.println(a); // Output superclass
    }
}

我删除了static 标识符并删除了变量a 的子类实现。如果你运行它,你会得到superclass 作为输出。

【讨论】:

  • 先生能详细说明一下吗?
  • 已编辑请看。
  • 谢谢您,先生.. 但是请告诉我.. 在这种情况下,当我们将 B 类的静态变量称为“子类”时,是否违反了静态变量基于引用的事实?跨度>
  • “静态变量是基于引用的”我不确定你的意思是什么?也许stackoverflow.com/questions/9898097/… 会有所帮助?
  • 'Java 中不继承静态变量'为假。如果您不这么认为,请引用 JLS 中的说明。
【解决方案2】:
A b = new B();

首先,Java 中不继承静态变量。这意味着当您将对象创建为 new B() 时,即使该类扩展了类 A,它也不会保留您的 String a 的定义。

static String a = "subclass";

其次,即使是这种情况,您也会立即在此类 B 的开头覆盖 String a 的值。您在打印其值之前专门将其设置为“子类”,所以您当然可以已经用这个新值覆盖了原始值。

最后,尝试用更多种类命名事物将是一个绝妙的主意。对于您或回答您问题的人来说,有一个 A 类和一个 String a 对可读性没有多大帮助。

【讨论】:

  • “Java 中不继承静态变量”为假。如果您不这么认为,请引用 JLS 中的说明。
【解决方案3】:
public abstract class A
{ static int a = 1; }

public class B extends A
{ static int a = 2; public A() { } }

public static void main(String argv[])
{
    A var1 = new B();

    System.out.println(var1.a)
    // Re-cast the variable to type "class B"
    // This is the SAME VARIABLE
    // It is occupying the SAME MEMORY SPACE
    // This println will produce the same output...
    System.out.println(((B) var1).a)
}

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多