Java,关于ToString方法调用的一道题 求高手帮忙看看
作为一名合格的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对象之间不能先与 拼接 而进行 +运算
求专业解答
意外刷到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对象之间不能先与 拼接 而进行 +运算
求专业解答

...全文
相关推荐
java中的tostring方法的具体用法
主要介绍了java中的tostring方法的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧
浅析JAVA中toString方法的作用
以下是对在JAVA中toString方法的作用进行了详细的分析介绍,需要的朋友可以参考下
java tostring方法重写代码示例
主要介绍了java tostring方法重写代码示例,具有一定参考价值,需要的朋友可以了解下。
Java中构造方法set/get和toString的使用详解
主要介绍了Java中构造方法set/get和toString的使用详解,构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化,需要的朋友可以参考下
List调用toString()方法后,去除两头的中括号实例
下面小编就为大家带来一篇List调用toString()方法后,去除两头的中括号实例。希望对大家有所帮助。一起跟随小编过来看看吧



