对于java类,使用" new"之间有什么区别?在构造函数内部并使用" new"课外?

时间:2016-03-02 18:19:14

标签: java

对于java类,使用" new"之间有什么区别?在构造函数内部并使用" new"课外?举个例子,

Sub test1()

Dim ws As Worksheet
Dim res As Worksheet
Dim val As String

Set ws = ActiveSheet
Sheets.Add
Set res = ActiveSheet
res.Name = "Results"
ws.Select
Range("B1").Select

While ActiveCell.Value <> ""

If Len(ActiveCell.Value) = 12 Then

val = ActiveCell.Value
res.Select
ActiveCell.Value = val
ActiveCell.Offset(1, 0).Select
ws.Select
ActiveCell.Offset(1, 0).Select

Else

ActiveCell.Offset(1, 0).Select

End If

Wend

res.Select
Columns("A:A").EntireColumn.AutoFit
Range("A1").Select

End Sub

maxPower是在构造函数外部的类中创建的。但是,movingEnergy在构造函数中实例化。这两种方法有什么不同。

4 个答案:

答案 0 :(得分:3)

字段的新操作(构造函数外部)在构造函数之前执行。

答案 1 :(得分:0)

关键字new以您正在创建的对象的大小分配内存。例如,int[] arr = new int[5];将为arr分配5 * 4字节的内存。

你在做什么没有区别。

答案 2 :(得分: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. 静态变量初始化和静态初始化块,in   文本顺序,如果该类以前没有被初始化。
  2.   
  3. 构造函数中的super()调用,无论是显式还是隐式。
  4.   
  5. 实例变量初始化程序和实例初始化程序段,按文本顺序排列。
  6.   
  7. super()之后的剩余构造函数体。
  8.         

    请参阅Java虚拟机规范的第2.17.5-6节。

答案 3 :(得分: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);
    }
}