MyTest[] dates = new MyTest[3];
dates[0] = new MyTest("a");
dates[1] = new MyTest("b");
我认为创造了五个物体 老师认为有三个 我想知道创建了多少个对象。
答案 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 String
s或任何类型的对象,除非您确切知道自己在做什么以及为什么这样做。
答案 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
答案 2 :(得分:0)
问题是主要基于意见,因为使用了两个字符串"a"
和"b"
。
那么"a"
和"b"
是什么?
String Literals
。 String Literals
对象?
字符串文字是对String类实例的引用。
此外,字符串文字始终引用类String的相同实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实例化”以便使用String.intern方法共享唯一实例。
这表明String Literals
是内部常量,必须在执行代码的某一部分之前创建。
但是问题是执行此代码时会创建多少个对象,您可以在这里争论,因为必须在显示之前创建String Literals
代码被执行。