执行此代码时会创建多少个对象? - java

时间:2017-12-13 11:49:46

标签: java object

MyTest[] dates = new MyTest[3];
dates[0] = new MyTest("a");
dates[1] = new MyTest("b");

我认为创造了五个物体 老师认为有三个 我想知道创建了多少个对象。

3 个答案:

答案 0 :(得分:2)

这就是这个问题的第三个答案。长话短说:我们不能给你一个确定的答案,因为它取决于你的数量和方式。

长篇故事: 至少创建了两个对象,即通过显式调用MyTest的构造函数创建的对象:

dates[0] = new MyTest("a");
dates[1] = new MyTest("b");

您是否计算MyTest[] dates = new MyTest[3];取决于您是否将数组定义为对象。如果将数组计为对象,则至少创建三个对象。

Arrays are objects in Java以来,您算上

MyTest[] dates = new MyTest[3];

同样,我们至少有三个对象。感谢@Eran的提示。

实际上还有两个对象,即String s "a""b",它们作为参数传递给MyTest的构造函数。现在Java使用称为常量字符串池的优化。每当编译器遇到String中写的"时,它将创建该值的String。如果已存在具有该值的String - 常量,则将重复使用该常量。这就是为什么

String a = "Hello";
String b = "Hello";
String c = "Hell" + "o";
System.out.println(a == b);
System.out.println(b == c);

将产生输出 1

true
false

因此,如果计算那些String - 常量,则会创建另外两个对象。

因此,答案是创建3个或5个对象,具体取决于您的计算方式。

1 Never ever ever use == to compare Strings或任何类型的对象,除非您确切知道自己在做什么以及为什么这样做。

答案 1 :(得分:1)

至少3或5是正确的答案:这就是我认为课程的样子。

class MyTest(){
   /*Constructor that takes an argument.*/
   MyTest(String test){
     //do something here.
   }
}

MyTest[] dates = new MyTest[3]; //Created as array object of size 3 but it holds null references so far.

dates[0] = new MyTest("a"); //Creates a new object using the constructor and assign to index 0 of data[]

dates[1] = new MyTest("b"); //Creates a new object using the constructor and assign to index 1 of data[]

传递给构造函数的字符串可以是新对象,也可以存在于字符串池中。因此,对象的范围可以是3-5。

String strObject = new String("Java");
and
String strLiteral = "Java";

两个表达式都为您提供了String对象,但它们之间存在细微差别。使用new()运算符创建String对象时,它总是在堆内存中创建一个新对象。另一方面,如果使用String文字语法创建对象,例如“Java”,它可能会返回String池中的现有对象(Perm gen空间中的String对象的缓存,现在已移至最近Java版本中的堆空间),如果它已经存在的话。否则,它将创建一个新的字符串对象并放入字符串池中以供将来重用。

了解详情:Reference

Some insight on array being objects in Java

答案 2 :(得分:0)

问题是主要基于意见,因为使用了两个字符串"a""b"

那么"a""b"是什么?

String Literals对象?

  

字符串文字是对String类实例的引用。

Java Language Specification只说

  

此外,字符串文字始终引用类String的相同实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实例化”以便使用String.intern方法共享唯一实例。

这表明String Literals是内部常量,必须在执行代码的某一部分之前创建。

但是问题是执行此代码时会创建多少个对象,您可以在这里争论,因为必须在显示之前创建String Literals代码被执行。