【问题标题】:Calling subclass's static method from parent class从父类调用子类的静态方法
【发布时间】:2012-03-12 20:46:48
【问题描述】:

这是一个奇怪的问题,但我想知道是否有办法在子类中“覆盖”父类的静态方法并从父类调用该子类的静态方法。

看起来像这样

public class parentFoo {
    public static void <T extends parentFoo> printFoo () {
        T.printFoo();
    }
}

public class childFoo extends parentFoo {
    public static void printFoo() {
        System.out.println("Foo");
    }
}

所以你可以在你的代码中做这样的事情

 //print out "Foo"
 parentFoo.<childFoo>printFoo();

这对我不起作用,但我想知道是否有某种方法可以使这成为可能。现在我得到一个堆栈溢出,因为它只调用父类的 printFoo 方法。

【问题讨论】:

    标签: java


    【解决方案1】:

    您不能覆盖静态方法。但是,您可以定义同名的静态方法。如果你这样做,那么你可以指定从类类型中调用哪一个

    ChildFoo.printFoo(); // call child foo
    ParentFoo.printFoo(); // call parent foo
    
    ParentFoo foo1 = new ChildFoo();
    foo1.printFoo(); // ParentFoo still called because of type of reference foo1 not its value
    
    ChildFoo foo2 = new ChildFoo();
    foo2.printFoo(); // ChildFoo called because of type of reference foo2 not its value
    

    【讨论】:

    • 是的,你是对的。但我只是想知道是否有某种方法可以使用泛型指向子类的静态方法。
    【解决方案2】:

    无法基于泛型类型参数调用静态方法。

    以下问题的答案提供了一个合理的解决方法。

    【讨论】:

    • 是的,你是对的。但我想知道是否有某种方式使用泛型来使用具有相同名称的子类的静态方法。我不应该在我的问题中使用“覆盖”这个词,这是一个糟糕的选择。
    • 啊,好的。我想这就是我真正想问的。感谢您的链接。
    • @aioobe 我可以向您咨询一下这些方面的理论吗?实例化和子类化是有区别的。从我了解到的静态类不能被实例化——这是公平的。但是可以对静态类进行子类化,尽管对静态类进行子类化对我来说真的没有意义..除非我们只能在静态父类中使用少数不受限制的静态方法,并且我们需要添加更多新的/我们的应用程序特定的静态方法放到一个单独的静态子类中。简而言之,我们可以子类一个静态类吗? :-)
    • 实例化和子类化是有区别的——没错。这是两个不同的概念。实例化是运行时,子类化是编译时。 据我所知,静态类不能被实例化——当然可以。 但是可以对静态类进行子类化 -- 绝对可以。
    【解决方案3】:

    替换

    parentFoo.<childFoo>printFoo();
    

    childFoo.printFoo();
    

    为什么需要覆盖 static 方法? (这是不可能的)你想要完成什么?

    多态调用只对对象有意义。由于静态不是对象的一部分,而是类的一部分,所以它不是。

    【讨论】:

    • 这更多是为了满足我自己对Java泛型的好奇心。我不太确定它将用于什么,但我想知道它是否可能。我只是想知道您是否可以使用泛型来指示可以使用哪种静态方法。
    • @ScottShamus 我可以看到你会如何在 C++ 中做到这一点,但在 Java 中却不行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多