You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于自定义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默认对象打印行为的本质区别:

  1. 你调用的str1.print()是你自己实现的方法,不是Java内置的打印对象逻辑

    • 你的print()方法里根本没有打印MyString对象本身,而是遍历了对象内部的charArray数组,逐个调用System.out.print(charArray[i])输出每个字符——这就是你能看到"happy"的核心原因。
    • 方法最后返回新的MyString对象只是满足教材的要求,但在你的main方法里并没有使用这个返回值,所以它完全不影响当前的输出结果。
  2. 你说的"打印对象引用会得到哈希值"是另一种场景
    比如如果你写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:45:17