【问题标题】:Instantiate Subclasses from Static Methods从静态方法实例化子类
【发布时间】:2010-06-30 14:08:31
【问题描述】:

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

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”。但是,我看不到如何从静态上下文中执行此操作。感谢您的帮助。

我很清楚我可以在没有静态方法的情况下做到这一点,并且我可以将一个类传递给每个方法调用。我不想这样做,因为这需要在许多子类上重新定义几个静态方法。

【问题讨论】:

  • 您可能希望 Subclass 扩展 Super 以便它可以调用 print() 并让 print() 返回一个字符串或将其签名更改为 void...仅供参考。
  • 我将 extends Super 添加到我的示例中。我本来打算把它放在那里忘记了。

标签: java inheritance static


【解决方案1】:

您可以简单地使用所需的实现定义一个单独的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 中有没有实际的解决方案。
【解决方案2】:

你可以不使用静态方法来做到这一点

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多