JAVA中字符串输出和拼接问题?重写了toString方法,结果为什么是ilovejava,而不是lovejavai。代码如下

public class Test {

public String toString() {//重写toString方法
System.out.print("I ");//输出字符"I"
return "java ";//返回“Java”字符串
}

public static void main(String[] args) {
System.out.println("LOVE "+new Test());
}
}

这个类似于四则混合运算里的运算顺序的问题,System.out.println("LOVE "+new Test()),中,new Test()的优先级更高,所以会先构造Test实例。然后调用字符串的"+"运算,+的底层我记得还是使用了StringBuilder,所以"LOVE "+new Test()可以等价于:
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("LOVE").append(new Test().toString());
return stringBuilder.toString();
调用你的toString()方法时首先输出了"I ",返回"java"然后stringBuilder实际返回为:
stringBuilder.append("LOVE").append("java ").toString();
所所以你的System.out.println("LOVE "+new Test())等价于System.out.println("LOVE java"),加上先输出的"I ",最终结果就是"I LOVE java "了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-18

你在toString中先在控制台输出的I后return的java,那么实际执行的时候一定是先执行输出I再执行return操作,所以I输出在java之前这是没有毛病的

整个System.out.println("LOVE "+new Test());的执行过程是这样的:

    发现println()方法中有调用其他方法,先执行其他方法

    执行new Test()创建Test类的实例

    执行Test类的实例的toString()方法

    toString() 执行到 System.out.print("I "), 输出 "I"

    toString() 返回字符串"java",toString()出栈,回到println()方法

    执行 System.out.println("LOVE "+"java)"); 输出"LOVEjava"

    println()方法出栈

    main()方法出栈

    执行结束

本回答被提问者采纳
第2个回答  2019-10-18
System.out.println("LOVE "+new Test())
可以理解为:
StringBuilder sb = new StringBuilder();
sb.append("LOVE ").append(new Test());
System.out.println(sb.toString());
根据你Test类的toString 再次分解:
StringBuilder sb = new StringBuilder();
sb.append("LOVE ");
System.out.print("i ");
sb.append("java "); //此时sb为 “LOVE java”
System.out.println(sb.toString());