方法覆盖中的Java静态变量

时间:2018-04-21 02:29:13

标签: java static

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

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

请告诉我我错在哪里..

3 个答案:

答案 0 :(得分:2)

静态变量不会在java中继承。 varibale 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作为输出。

答案 1 :(得分:0)

A b = new B();

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

static String a = "subclass";

其次,即使是这种情况,您也可以立即覆盖此类B开头的String a的值。您特别将其设置为"子类"在打印它的值之前,当然你已经用这个新的值覆盖原始值。

最后,尝试用更多种类的东西来命名是个好主意。对于您或回答您问题的人来说,A类和字符串a对于可读性没有多大帮助。

答案 2 :(得分:0)

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