2016-03-17 70 views
0

我正在試圖做簡單的封裝程序。來源在下面給出。爲什麼對象未被初始化全局使用Java?

package encap; 
public class Encap 
    { 

    public static void main(String[] args) 
     { 
      NewClass1 call = new NewClass1(3); 
      call.PrintNumber(); 
     } 

    } 



package encap; 
public class NewClass1 
    { 
    private int numberNewClass1; 

    NewClass call = new NewClass(getNumberNewClass1()); 
    public NewClass1(int number) 
     { 
      setNumberNewClass1(number); 
     } 

    public void PrintNumber() 
     { 
//   NewClass call = new NewClass(getNumberNewClass1()); 

      System.out.println("NewClass1"); 
      System.out.println(getNumberNewClass1()); 

      System.out.println("NewClass"); 
      System.out.println(call.getNumber()); 
     } 

    public int getNumberNewClass1() 
     { 
     return numberNewClass1; 
     } 
    public void setNumberNewClass1(int numberNewClass1) 
     { 
     this.numberNewClass1 = numberNewClass1; 
     } 
    } 

package encap; 
public class NewClass 
    { 
    private int number; 

    public NewClass(int number) 
     { 
      setNumber(number); 
     } 

    public int getNumber() 
     { 
     return number; 
     } 

    public void setNumber(int number) 
     { 
     this.number = number; 
     } 
    } 

在創建Newclass1的對象我給值3,如應該在Newclass1的私有變量numberNewClass1設置,因爲我已經叫NewClass1構造內的setNumberNewClass1我的知識。

然後,我通過給getNumberNewClass1()方法作爲NewClass的構造函數參數,在全局的「NewClass」中創建了另一個對象「call」。

現在我的問題是,當我打電話NewClass1的PrintNumber()方法中通過調用對象的NewClass的的getNumber()方法,則返回0。但是,如果我創建對象 PrintNumber()方法中,那麼它將返回已發送的值。 PrintNumber()方法在類Encap中調用。

現在我的問題是如果對象crated全局然後NewClass的私有變量沒有被初始化,但如果它是在本地創建然後私人變量獲取價值,爲什麼?

+2

我不知道是什麼你認爲'全球'意味着Java,但這並不意味着什麼。如果你使用了更多不同的類名,你的代碼將會更容易理解。 – EJP

+0

首先,瞭解「全球」所指的是重要的。你的意思是使用公共修飾符或製作靜態對象/變量?你的問題不是很清楚 –

+0

試試'靜'請 –

回答

2

問題是初始化的順序;首先numberNewClass1字段的初始0然後call構造(與0)–這裏

private int numberNewClass1; 
NewClass call = new NewClass(getNumberNewClass1()); //<-- currently 0. 

你可以的call移動初始化成NewClass1構造,這將解決您的問題。喜歡的東西,

private int numberNewClass1; 
private NewClass call; 

public NewClass1(int number) 
    { 
     setNumberNewClass1(number); 
     call = new NewClass(number); //<-- now it is safe to call 
            // getNumberNewClass1(), but 
            // we know it is "number". 
    } 
+0

是否有任何問題,如果我們使用getNumberClass1(),call = new NewClass(getNumberClass1()); – Green

+0

它應該沒問題(但有點*毫無意義*)*** as-long-因爲***你調用'setNumberClass1' * first *。 –

+0

它會丟失封裝嗎?其實這個結構我將用在我的下一個項目中。 – Green

0

實例變量callNewClass1已經執行構造函數之前被初始化,因此你在你的main方法傳遞值永遠不會到達callNewClass1

相關問題