[英]Java - Arraylist implementation doubtt
我已经初始化了一个如下的arraylist:
private ArrayList<Automobile> car = new ArrayList();
然后在构造函数中,我有以下内容:
public vehicles() {
car = new ArrayList();
}
有人可以告诉我,构造器工具(car = new ArrayList();)的第二部分确实需要吗? 它有什么作用?
重新初始化car
,您已经丢弃了一个List
,并且使用的是Raw Types 。 请不要 使用菱形运算符<>
代替,
private ArrayList<Automobile> car = new ArrayList<>();
同样,类名应以大写字母开头,因此vehicles
实际上应为Vehicles
(或Vehicle
)。
对象创建的初始化顺序为
1)初始化字段
2)执行构造函数。
在您的情况下,当您创建vehicles
类对象时。 第一场初始化将发生
private ArrayList<Automobile> car = new ArrayList<>();
然后它将执行构造函数。
public vehicles() {
car = new ArrayList<>();
}
因此,参考car
将使用新的ArrayList对象重新初始化。
因此,您可以避免字段初始化或构造函数中的初始化。
因为只有一辆参考车,所以编码不会出现任何问题。 汽车参考将指向构造函数创建的对象。 由field创建的对象将由垃圾回收器接收,但它是不必要的。
不需要 您要初始化car
变量两次。 第二次初始化(在构造函数中)覆盖对在car
成员的声明中初始化的列表的引用。 因此,您正在创建两个对象,其中一个从未使用过,并且可以立即被垃圾回收(因为您没有对其进行任何引用)。
没有它不需要。 相同的arraylist将被初始化两次。 所以将要发生的是:
当您尝试说实例化您的类时,它将首先尝试创建在构造函数之外定义的实例。
接下来,当调用构造函数时,您将再次覆盖先前在构造函数中创建的引用。
如果要强制执行而不能有意或无意地实例化,请在将final关键字定义为类成员时使用它。 这样,您最终不会在构造函数中创建对象。
即使您不实例化最终成员变量,编译器也不会高兴,并且会要求您在您创建的默认构造函数中实例化它。
如果仅声明变量,则需要在构造函数中进行初始化
私有ArrayList汽车;
但是,如果要对其进行初始化,则无需在构造函数中进行
私有ArrayList汽车= new ArrayList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.