从静态方法实例化子类

时间:2010-06-30 14:08:31

标签: java inheritance static

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

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

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

2 个答案:

答案 0 :(得分: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 - 这是(几乎总是)遵循基类的良好做法。

答案 1 :(得分: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();
  }
}