2016-08-15 77 views
0

我在Java中很新,我希望有人能幫我解決這個問題。Java - 靜態類及其父初始化

我必須創建一個方法,將按以下方式調用: Child.getI();

Parent.java

package MyTest; 

public class Parent { 

    private static int i; 
    public Parent(int x){ 
     i = x; 
    } 

    public static int getI(){ 
     return i; 
    } 
} 

Child.java

package MyTest; 

public class Child extends Parent { 

    public Child(int x) { 
     super(x); 
    } 
} 

我應該如何設計我的課,所以當我打電話Child.getI(),它會首先初始化Child類?這絕對不會像我這樣做。

+4

你應該真的檢查'static'的含義。如果你這樣做了,你會注意到'我應該如何設計我的類,所以當我調用Child.getI()時,它將首先初始化Child類'沒有什麼意義,並且設置'static' 'Parent''Constructor'中的變量'i'不應該是正確的。 – SomeJavaGuy

+1

'static'字段和方法不會被繼承。 'i'和'getI()'僅屬於'Parent'。如果這是你想要做的事情,那麼它會表明你的設計存在問題。通過這樣做你究竟在做什麼? – JonK

+4

我認爲你的第一個錯誤是從構造函數中設置靜態變量。這可以完成並且有時是有用的,但是如果您將其作爲初學者來使用,這意味着您不瞭解構造函數應該做什麼。它應該初始化類的當前實例,而不是靜態常見的資源。這些應該使用初始化程序或靜態塊進行初始化,並使用靜態方法進行更改。 – RealSkeptic

回答

0

當您調用Child.getI()時,您不會調用類實例的方法(不會創建新的對象實例),但是您可以在Class<Child>上調用它。

當java運行庫首次發現Child時,類加載器將加載Child類及其基類,然後執行類靜態字段並阻止init。你的代碼沒有更多。

-2

你可以這樣設計你的代碼。這是靜態方法的一種解決方案,也是一種沒有靜態方法的解決方案

Parent.java

package MyTest; 

public class Parent { 

    private int i; 
    private static int i2; 
    public Parent(int x){ 
     i = x; 
     i2 = x; 
    } 

    public int getI(){ 
     return i; 
    } 

    public static int getI2() { 
     return i2; 
    } 
} 

Child.java

package MyTest; 

    public class Child extends Parent { 

     public Child(int x) { 
      super(x); 
     } 

     public static int getI() { 
      final int i = 3; 
      final Parent parent = new Child(i); 
      return parent.getI(); 
     } 

     public static int getI2() { 
      final int i = 3; 
      final Parent parent = new Child(i); 
      return parent.getI2(); 
     } 

    } 
0
  1. 感謝大家。看起來我的問題沒有真正正確的答案,我必須學習更好的Java基礎知識(如靜態和繼承概念)。
  2. 我打算使用Therkon建議的解決方法。這仍然給了我改變多個類的行爲的可能性,當我只需要改變父類方法時,它仍然使方法變爲靜態,所以我可以用我想要的方式調用它 - Child.getI();

Parent.java

包MyTest的;

公共類父{

private static int i; 
public Parent(int x){ 
    i = x; 
} 

public static int getI(){ 
    return i; 
} 

}

Child.java

包MyTest的;

public class Child extends Parent { 

    public Child(int x) { 
    super(x); 
} 

public static int getI() { 
    final int i = 3; 
    return ((Parent)new Child(i)).getI(); 
} 

}