2010-06-30 135 views
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(),以顯示「超級」和Subclass.print(),以顯示「子類」。但是,我不知道如何從靜態上下文中做到這一點。謝謝您的幫助。

我很清楚,我可以在沒有靜態方法的情況下執行此操作,並且可以將類傳遞給每個方法調用。我不想這樣做,因爲這需要在許多子類上重新定義幾個靜態方法。

+0

您可能希望有子類來擴展超級做到這一點,因此它可以調用print(),並具有打印()返回一個字符串或改變其簽名無效.. 。只是一個FYI。 – 2010-06-30 14:13:01

+0

我在我的示例中添加了「超級超級」。我本來打算把它放在那裏,忘了。 – Blacktiger 2010-06-30 15:05:11

回答

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()總是返回實際子令牌。

還請注意,我宣稱Superabstract - 這是(幾乎總是)跟隨基類的良好實踐。

+0

這是一個很好的答案,但不幸的是,它並不能真正解決我希望解決的問題。我不確定在java中有實際的解決方案。 – Blacktiger 2010-06-30 16:11:08

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(); 
    } 
} 
相關問題