代码之家  ›  专栏  ›  技术社区  ›  Blacktiger

从静态方法实例化子类

  •  4
  • Blacktiger  · 技术社区  · 16 年前

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

    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 回复  |  直到 16 年前
        1
  •  9
  •   Péter Török    16 年前

    您可以简单地定义一个单独的 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 -这(几乎总是)是基类遵循的良好实践。

        2
  •  0
  •   Jay    16 年前

    您可以不使用静态方法来实现这一点

    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();
      }
    }
    
    推荐文章