我只是从一个例子开始,它很好地解释了这一点:

public abstract class A{
    static String str;
}

public class B extends A{
    public B(){
        str = "123";
    }
}

public class C extends A{
    public C(){
        str = "abc";
    }
}

public class Main{

    public static void main(String[] args){
        A b = new B();
        A c = new C();
        System.out.println("b.str = " + b.str);
        System.out.println("c.str = " + c.str);
    }
}

这将打印出:

b.str = abc

c.str = abc

但是我想要一个解决方案,其中实例化父类(super class)的每个子类都有自己的自己的类变量,同时我希望能够通过抽象中定义的标识符或方法调用来引用该类变量。超一流。

所以我希望输出是:

b.str = 123

c.str = abc

那可行吗?

最佳答案

如果要让类B和C具有单独的静态变量,则需要在这些类中声明变量。基本上,静态成员和多态性不会并存。

请注意,就可读性而言,通过引用访问静态成员是一个非常糟糕的主意-它看起来好像依赖于引用的值,而实际上并非如此。因此,当您将str移至B和C时,您当前的代码甚至都不会编译。相反,您需要

System.out.println("b.str = " + B.str);
System.out.println("c.str = " + C.str);

如果您确实需要多态访问值(即通过A的实例),则一种方法是创建多态getter:
public class A {
    public abstract String getStr();
}

public class B extends A {
    private static String str = "b";

    @Override public String getStr() {
        return str;
    }
}

(与C相同)。

这样,就可以在每个实例没有单独变量的情况下获得所需的行为,但仍可以多态使用它。实例成员返回这样的静态值有点奇怪,但是基本上,您将值用于类型的多态性...

10-06 09:06
查看更多