Java中是否可以进行匿名对象实例化?

时间:2013-09-17 03:16:46

标签: java

有人能告诉我下面两行代码之间的区别吗?

ArrayList<Car> dat;
dat = (new DataSource()).getCar();

DataSource ds = new DataSource();
dat = ds.getCar(); 

new DataSource()括在括号中是什么意思?

最后,这两种情况下dat的结果是什么?

 ArrayList<Car> dat;

 ArrayList<Car> dat = new ArrayList();

注意: getCar辅助函数将ArrayList返回dat

3 个答案:

答案 0 :(得分:4)

您发布的代码的两个版本之间没有实际差异。 <{1}}在两种情况下都是相同的值。

您发布的代码的第二个版本对人类更具可读性,因此在代码维护和可读性方面,您可能希望使用该版本。

此外,在第一个版本中,您将无法在其他任何地方使用(new DataSource())的值,因为您没有存储对(new DataSource())结果的引用。如果您不需要代码中的任何其他位置的结果,这当然不是问题。

至于问题的第二部分,在java中,您可以认为datArrayList<Car> dat;相同。当您声明这样的引用时,它不指向任何内容。但是,当您将其声明为ArrayList<Car> dat = null;时,您正在创建一个新的ArrayList对象,并使ArrayList<Car> dat = new ArrayList<Car>;引用它。

答案 1 :(得分:4)

ArrayList<Car> dat;
dat = (new DataSource()).getCar();

圆括号是多余的。你可以同样写

dat = new DataSource().getCar();

在你引用的另一个版本中,你正在做一件额外的事情 - 制作一个引用你DataSource的变量,以备日后使用。

回答你的第二个问题,

ArrayList<Car> dat;

不会创建对象。这里没有ArrayList,只是一个不引用任何内容的变量。另一方面,

ArrayList<Car> dat = new ArrayList();

创建一个ArrayList和一个引用它的变量。

答案 2 :(得分:2)

唯一的区别是,在第二个示例中,您在方法调用期间保留对DataSource对象的引用。外括号也是无关的。