双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

Java,关于ToString方法调用的一道题 求高手帮忙看看

BUG写手樱桃老爷爷 BUG写手樱桃老爷爷 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
作为一名合格的BUG写手,前两天好容易休息日,翻QQ。
意外刷到10年前老同学的QQ相册。才发现原来也是同行。
少不了一顿寒暄得知原来他在某学校做老师。还顺便扔了一题给我看看。
原题如下:

不运行代码,直接说出打印结果,并解释原因。
public class ToStringTest{
static inti= 1;
public static void main(String args[]){
System.out.println("love " + new ToStringTest());
ToStringTest a = new ToStringTest();
a.i++;
System.out.println("me " + a.i);
}
public String toString(){
System.out.print("I ");
return "java ";
}
}


第一遍读题我也是萌比的,觉得这位同学就是故意想绕晕我。于是我放弃攻题,直接单步运行,先看结果。
但不过程中 运行语句上窜下跳,先看看运行结果:
I I I I love java
I I I me 2

看到这结果,我认为其中必有蹊跷。
于是直接完整运行了一次。
结果如下:
I love java
me 2

这样的结果才像样嘛,嗯。

这个时候我已经被绕进去了。
就想弄清楚这当中的运行顺序。
于是对原题进行了大量增删改同时观察报错情况。
最后整理出一下结论。
希望路过的大佬能帮我看看。这当中有没有总结的对的地方···
菜鸟真心求专业解答。本来不喜欢研究这些钻牛角尖的问题。
但是既然做出了总结,就很担心自己的总结是错的,反而中了那个同学的下怀被他给坑了。。。

以下:
public class ToStringTest{
/* static int i= 1;*/ //排除不重要的干扰因素
public static void main(String args[]){
Object a = new ToStringTest();// 此处创建了 多态对象 因为 ToStringTest 对象相加会直接报错
Object b = new ToStringTest();// 暂且可以当做 和原题中 创建匿名对象 的效果相似
String c = "love ";
if (a!="1"+a){ // 这当中 每增加一个 加号 结果中就多一个 I
if(a!=a+"1"+a+a){ // 这当中 不能让对象相加 优先于 对象与字符串 或 字符串与对象 拼接
b= a+/*c="love "*/c+a; // 否则 也会报错 比如 “a+a+“1”” 或 “1+(a+a)” 都不行
}
}
System.out.println( b/*new ToStringTest()*/); // 从结果上来看 a+ 和 +a 都相当于 "java "
/* a.i++;
System.out.println("me " + a.i);*/ // 排除不重要的干扰因素
}
public String toString(){ // 这里重写了 toString 的方法 是本次研究的关键
System.out.print("I "); // 每次调用 toString 方法 都会 打印 一个 “I ”
return "java "; // *** toString 方法中的的 (参数对象) 会被当做"java "用来拼接
} // *** obj对象+ 或 +obj对象 都会调用toString 方法
} // *** obj对象+ 或 +obj对象 会被toString 的返回值代替 然后和字符串拼接
// *** obj对象之间不能先与 拼接 而进行 +运算

求专业解答

...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
BUG写手樱桃老爷爷
Java 51,407 成员 86,133 内容