当前位置: 首页 > 知识库问答 >
问题:

创建了多少个对象和引用?

史商震
2023-03-14

我厌倦了下面的片段,得到了3个对象和3个引用的答案。但在回答键中说,这是4个对象和3个参考。我不知道是我错了还是回答键错了。请有人帮忙。

String str1=new String("Java"); //line 1
String str2=new String("GFT");  //line 2
String str3=str1;               //line 3 
str1=str1.concat(str2);         //line 4
str3=str2.toUpperCase();        //line 5

我的答案解释:

参考文献:str1、str2、str3。因此引用数=3。

对象:最初创建的对象计数=0。

  • 第1行创建值为Java并引用str1的新对象。对象创建计数=1。
  • 第2行创建值为“GFT”并引用“str2”的新对象。对象创建计数=2。
  • 第3行创建新引用“str3”,它不创建新对象

是这样吗?

共有1个答案

施旭东
2023-03-14

因为只有三个唯一的变量名,每个变量名都是一个引用,所以有三个引用是对的。

然而,在Java(和许多其他语言)中,字符串是不可变的,这意味着对字符串的任何操作都会返回一个全新的字符串。

您的误解似乎与字符串有关。toUpperCase()。如果字符串已经完全大写,则返回一个与原始字符串相等的新字符串。您可以测试

String strA = "ABC";
String strB = strA.toUpperCase();
// two objects that are technically different, though they look and act the same as each other

print(strA == strB);       // false - they are not the same string 
print(strA.equals(strB));  // true  - however, they are equal to each other

Java这对于任何Object*都是true-==检查将比较两个引用的内存位置,如果它们都指向内存中的相同位置,则返回true。同时,. equals()可以为对象自定义行为。如果没有覆盖,这将返回==检查,但String覆盖该行为并返回true如果字符串相同。

因此,总共创建了四个对象:

  • 新字符串("Java")
  • 新字符串(“GFT”)
  • str1.concat(str2)
  • str2.toUpperCase()//与str2相同,但技术上不是相同的对象

*注意:这对于intDouble等原语不成立,它们没有. equals()方法,因为它们不是对象。

 类似资料:
  • 所以我不确定是0还是2。 如果有人知道请告诉我。

  • 如果我们使用 那么创建了多少对象,它们驻留在哪里?

  • 问题内容: 我有以下Java代码: 问题很简单:调用此方法将创建多少个对象? 一开始我回答说创建了5个String对象,但是我的书回答说只有3个对象被创建,没有给出解释(这是一个SCJP问题)。 从我的角度来看,有5个对象:“ Fred”,“ 47”,“ Fred47”,“ ed4”,“ ED4”。 我也在SCJP模拟考试中找到了这个问题,答案是3。 问题答案: “ Fred”和“ 47”将来自字

  • 问题内容: 假设我有三节课: 当我创建类C的实例时,它将调用超类的构造函数。那么,是否有多个对象正在创建?如果仅创建一个对象,那么super()像另一个类的构造函数如何?super()方法是否在内部创建对象?我所知道的是,构造函数也是一种方法(我可能错了)。 我的问题是: 在这种情况下创建了多少个对象? 如果创建了一个对象,那么Super()如何在内部调用父类的构造函数? 问题答案: 好问题。您要

  • 我知道,当我们使用下面给出的字符串文本时,字符串对象是在字符串池中创建的(如果它不存在的话)。 在上述情况下,池中只会创建一个字符串对象。 但是,当我们使用new关键字时,它总是在堆内存中创建一个新的String对象(即使String池中有一个) 在这里,我有一个困惑,关于在下面的情况下将创建多少对象,以及在哪里(池或堆内存)。

  • 给定以下代码,在main()中创建了多少对象,在执行第15行之后,有多少对象符合垃圾回收机制? 3个已创建,0个符合条件 4个已创建,1个符合条件 5个创建,2个符合条件 3个已创建,2个符合条件 以上都不是 好的,首先,请不要把它标记为家庭作业。这是我大学的一个测试题。根据我的说法,应该有两个创建的对象,第15行之后有一个符合垃圾收集的条件。这是因为只有两个新的操作符用于创建对象,而“d”在开始