2016-03-02 30 views
2

對於java類,在構造函數中使用「new」和在類之外使用「new」有什麼區別?舉例如下,對於java類,在構造函數中使用「new」和在類之外使用「new」有什麼區別?

abstract class PowerStat{ 
    final int numOfComponent = UserProperty.numOfComponent; 
    final int windowSize = 8; 

    CircularFifoQueue<ArrayList<Double>> movingEnergy; 
    CircularFifoQueue<Double> movingStartTimes; 
    CircularFifoQueue<Double> movingEndTimes; 

    private double [] maxPower = new double[numOfComponent]; 
    private double [] minPower = new double[numOfComponent]; 

    public ArrayList<Double> intervalEnergy = new ArrayList<Double>(numOfComponent); 

    private ArrayList<UsageNode> usageList = new ArrayList<UsageNode>(); 

    public PowerStat(){ 
     setUsageList(new ArrayList<UsageNode>()); 
     for (int i = 0; i < numOfComponent; i++) { 
      intervalEnergy.add(0.0); 
     } 

     movingEnergy = new CircularFifoQueue<ArrayList<Double>>(windowSize); 
     movingStartTimes = new CircularFifoQueue<Double>(windowSize); 
     movingEndTimes = new CircularFifoQueue<Double>(windowSize); 
    } 
} 

maxPower是在構造函數外的類中創建的。但是,movingEnergy在構造函數中實例化。這兩種方法有什麼區別。

回答

3

字段的新操作(構造函數外部)在構造函數之前執行。

+0

當做字段(構造函數外)執行?當Powerstat類未實例化時,是否創建了maxPower的空間?每個實例都有其自己的maxPower空間? –

+0

變量是實例變量。它們只在調用構造函數時才創建;那麼它們在執行構造函數之前被填充。您可以將它們視爲每個構造函數的不可見部分。 –

+0

這個答案在技術上並不正確。如果構造函數調用了'super()',那麼字段初始值設定項會在調用'super()'之後執行*,但在構造函數體的其餘部分之前執行。 – Andreas

0

關鍵字new以您正在創建的對象的大小分配內存。例如int[] arr = new int[5];將爲arr分配5 * 4字節的內存。

你在做什麼沒有區別。

0
private double [] maxPower = new double[numOfComponent]; 

創建一個新double陣列numOfComponent數目的元素。

movingEnergy = new CircularFifoQueue<ArrayList<Double>>(windowSize); 

這裏,new關鍵字調用構造函數CircularFifoQueue,從而創造了新的CircularFifoQueue對象並將其分配給movingEnergy可變

如果你有興趣的執行順序,見Are fields initialized before constructor code is run in Java?

  1. 靜態變量initialisers和靜態初始化塊, 文本順序,如果類以前尚未初始化。
  2. 構造函數中的super()調用,無論是顯式還是隱式。
  3. 實例變量初始化程序和實例初始化塊,按照文本順序。
  4. super()後的構造函數的主體。

請參見Java虛擬機規範的§2.17.5-6部分。

+0

此答案包括更多詳細信息:http://stackoverflow.com/a/23094875/5221149 – Andreas

+0

@Andreas是的好, JVM規範包含* most *細節:) – radoh

0

邏輯上,編譯器將您的代碼重新排列爲以下代碼。它添加了您沒有指定的調用super(),並將所有初始化器移動到構造函數中。

因此,真的沒有什麼區別。

然而,在構造函數中初始化字段將允許您使用構造函數參數和/或中間計算。如果你不需要這些,你是否在字段聲明或構造函數中初始化字段沒有什麼區別。

至於確切順序對象對象初始化,看到這樣的回答:https://stackoverflow.com/a/23094875/5221149

abstract class PowerStat{ 
    final int numOfComponent; 
    final int windowSize; 

    CircularFifoQueue<ArrayList<Double>> movingEnergy; 
    CircularFifoQueue<Double> movingStartTimes; 
    CircularFifoQueue<Double> movingEndTimes; 

    private double [] maxPower; 
    private double [] minPower; 

    public ArrayList<Double> intervalEnergy; 

    private ArrayList<UsageNode> usageList; 

    public PowerStat(){ 
     super(); 
     this.numOfComponent = UserProperty.numOfComponent; 
     this.windowSize = 8; 
     this.maxPower = new double[this.numOfComponent]; 
     this.minPower = new double[this.numOfComponent]; 
     this.intervalEnergy = new ArrayList<Double>(this.numOfComponent); 
     this.usageList = new ArrayList<UsageNode>(); 

     setUsageList(new ArrayList<UsageNode>()); 
     for (int i = 0; i < numOfComponent; i++) { 
      intervalEnergy.add(0.0); 
     } 

     movingEnergy = new CircularFifoQueue<ArrayList<Double>>(windowSize); 
     movingStartTimes = new CircularFifoQueue<Double>(windowSize); 
     movingEndTimes = new CircularFifoQueue<Double>(windowSize); 
    } 
} 
+0

我認爲_Java編譯器只將初始化塊複製到每個構造函數_中。 –

相關問題