2016-03-02 113 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编译器只将初始化块复制到每个构造函数_中。 –

相关问题