关于自定义MyString类print方法返回对象却能输出内容的疑问
自定义MyString类print方法运行原理解答
你的代码实现
public class MyString { //instance variables char[] charArray; public MyString(char[] chars) { charArray = new char[chars.length]; for (int i = 0; i < chars.length; i++) { charArray[i] = chars[i]; } } public MyString print() { for (int i = 0; i < charArray.length; i++) { System.out.print(charArray[i]); } return new MyString(charArray); } class MyStringClient { public static void main(String[] args) { MyString str1 = new MyString(new char[] {'h', 'a', 'p', 'p', 'y'}); str1.print(); } } }
你的疑问
您好,我对这段代码的运行原理存在疑问。按照教材要求,我实现了自定义的String类MyString,并编写测试类MyStringClient。代码运行正常,执行后输出"happy",但我是通过试错才让它正常工作的。当我回头深入理解时,对MyString类的print方法感到困惑:教材要求该方法返回MyString对象,但通常打印对象引用会得到哈希值,为何此方法能显示对象的实际内容?
问题解析
别担心,这个疑问非常典型,咱们把它拆解开来看:
首先你要区分自定义方法行为和Java默认对象打印行为的本质区别:
你调用的
str1.print()是你自己实现的方法,不是Java内置的打印对象逻辑- 你的
print()方法里根本没有打印MyString对象本身,而是遍历了对象内部的charArray数组,逐个调用System.out.print(charArray[i])输出每个字符——这就是你能看到"happy"的核心原因。 - 方法最后返回新的
MyString对象只是满足教材的要求,但在你的main方法里并没有使用这个返回值,所以它完全不影响当前的输出结果。
- 你的
你说的"打印对象引用会得到哈希值"是另一种场景
比如如果你写System.out.println(str1);,这时候才会触发Java默认的对象打印逻辑:调用对象的toString()方法,而Object类的默认toString()实现就是返回类名@十六进制哈希值的格式。但你的代码里根本没这么做,自然不会出现这种结果。
举个直观的例子,如果修改main方法:
public static void main(String[] args) { MyString str1 = new MyString(new char[] {'h', 'a', 'p', 'p', 'y'}); MyString returnedStr = str1.print(); // 先执行自定义print输出"happy" System.out.println("\n" + returnedStr); // 这里才会打印类似MyString@1b6d3586的哈希值格式 }
运行这段代码,你就能同时看到两种不同的输出结果,更清楚两者的区别。
总结
- 你的
print()方法是自定义的输出逻辑,和Java默认的对象打印毫无关系 - 它的核心是直接操作内部字符数组输出内容,所以能显示字符串文本
- 返回
MyString对象只是满足教材要求,当前代码中这个返回值未被使用,不影响输出结果
内容的提问来源于stack exchange,提问作者Ryan Foster
相关产品推荐
相关产品推荐

