从静态方法实例化子类

4

我想也许没有办法做到这一点,但我认为值得问一下。我想做以下类似的事情:

public class Super {
    public static String print() { System.out.println(new Super().getClass().getSimpleName()); }
    public Super() {}
}

public class Subclass extends Super {
    public Subclass() {}

    public void main(String[] args) {
        Super.print();
        Subclass.print();
    }
}

我希望Super.print()显示“Super”,Subclass.print()显示“Subclass”。然而,我不知道如何在静态环境下实现这一点。感谢您的帮助。

我很清楚可以通过非静态方法来做到这一点,并且可以将一个类传递到每个方法调用中。但是,我不想这样做,因为这需要重新定义许多子类的静态方法。


你可能想让子类继承超类,这样它就可以调用print()并且让print()返回一个字符串或者改变其签名为void...只是提供一下信息。 - Ian Dallas
我在我的示例中添加了extends Super。我最初打算把它放在那里,但忘记了。 - Blacktiger
2个回答

9
你可以简单地定义一个单独的 Subclass.print()方法,实现所需的功能。静态方法是类作用域的,因此每个子类都可以有自己的实现。
public class Subclass {
    public Subclass() {}
    public static String print() {
        System.out.println(Subclass.class.getSimpleName());
    }

    public void main(String[] args) {
        Super.print();
        Subclass.print();
    }
}

请注意,您的代码可以简化 - Super.class 可以代替 new Super().getClass()
另外请注意,静态方法不是多态的 - Super.print()Subclass.print() 总是调用各自类中的方法。这就是为什么它们绑定在一个类上而不是一个对象上的原因。
如果您有一个庞大的类层次结构,通过在每个类中实现单独的静态print(),您可能会出现大量重复的代码。相反,您可以定义一个单独的非静态方法来完成这项工作:
public abstract class Super {
    public final String print() {
        System.out.println(this.getClass().getSimpleName());
    }
    ...
}

请注意,这种方法甚至不需要多态性 - this.getClass() 总是返回实际的子类标记。
请注意,我将Super声明为abstract - 这几乎总是跟随基类的良好实践。

这是一个很好的答案,但不幸的是它并没有真正解决我希望解决的问题。我不确定在Java中是否有实际的解决方案。 - Blacktiger

0

您可以不使用静态方法来实现此操作

public class Parent {
  public print(){
    System.err.println(this.getSimpleName());
  }
}

public class Child extends Parent {
  public void main(String[] args) {
     Parent p = new Parent();
     p.print(); 
     Child c = new Child();
     c.print();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接