相关疑难解决方法(0)

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

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();
}
Run Code Online (Sandbox Code Playgroud)

功能doIt将打印"爸爸".有没有办法让它打印"儿子"?

java inheritance overriding

152
推荐指数
8
解决办法
18万
查看次数

为什么Java为重写的静态方法强制执行返回类型兼容性?

根据这个答案答案,Java静态方法不是虚拟的,不能被覆盖.因此,直观地说,这应该有效(即使在99%的情况下,这是危险的编程):

class Foo
{
    public static String frob() {
        return "Foo";
    }
}

class Bar extends Foo
{
    public static Number frob() {
        return 123;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在实践中,这会让你:

Foo.java:10: frob() in Bar cannot override frob() in Foo; attempting to use incompatible return type
found   : java.lang.Number
required: java.lang.String
    public static Number frob() {
                         ^
Run Code Online (Sandbox Code Playgroud)

天真地,似乎Foo.frob()并且Bar.frob()应该与彼此无关; 然而Java坚持认为他们这样做.为什么?

(Nb:我不想听到为什么以这种方式编码是个坏主意,我想听听Java和/或JVM设计中的内容,这使得这个限制成为必要.)


更新以添加:对于那些认为编译器会因为在实例上调用静态方法而感到困惑的人,如果你允许这样做:它不会.它已经在方法签名的情况下算出这个兼容的:

class Foo
{
    static String frob() {
        return "Foo";
    }
} …
Run Code Online (Sandbox Code Playgroud)

java static overriding

30
推荐指数
1
解决办法
3403
查看次数

标签 统计

java ×2

overriding ×2

inheritance ×1

static ×1