使用 System.out.println() 打印对象时出现连接问题;

Concatenating issue when printing out objects with System.out.println();

我正在 Codecademy 上学习编码,并不断提出连接问题。 例如,当我写:

System.out.println(lemonadeStand + cookieShop);

我找回了错误:

Store.java:32: error: bad operand types for binary operator '+' System.out.println(lemonadeStand + cookieShop);

但是当我写的时候:

System.out.println(lemonadeStand);
System.out.println(cookieShop);

代码有效。有人能告诉我为什么第一个不起作用吗? (谢谢)

---编辑--- 谢谢各位的帮助!这是我第一次在这里发布问题,我对社区的友好和乐于助人感到惊讶!

请在连接两个变量之前确认它们是 同类型 或者试试 System.out.println(first + " " + second);

因为单独的单个变量会调用它们的 .toString() 方法。当您在两个非字符串变量之间添加操作数时,它不确定您的意思。你有时会看到这个...

System.out.println(lemonadeStand + cookieShop + "");

那里的 + "" 确认这一切都归结为一个字符串(如果可以从技术上向您解释的话。)

同样有用的是...

System.out.println(lemonadeStand.toString() + cookieShop);
or...
System.out.println(String.valueOf(lemonadeStand) + cookieShop);

这取决于这些变量实际上是什么。但是,如果它们不是字符串……那么您要告诉它做什么是模棱两可的……也许将它们加在一起?

在某处放置一个 + "" 是强制将其全部解释为字符串连接的常用方法。

希望用非技术术语解释它。

范围太广...
但是,一个接受字符串的方法需要一个字符串作为参数。
println 在 PrintStream class 中被重载,因此它接受所有原始类型,String 和 Object 类型。

bad operand types for binary operator '+'

重点在"binary"运算符中。加号“+”通常被认为是两个数字之间的算术(二进制)运算符。其次,可以将“+”视为字符串连接运算符。 [旁注,Java 不允许运算符重载]
二元运算符、算术运算符、逻辑运算符和按位运算符需要为它们自身定义的类型。
在“+”运算符的情况下,它最常被认为是加法运算符。
如果需要,numeric 类型的表达式将自动提升为更大的基本类型。

因此,对 a + b 的调用只能使用数字或字符串操作数。如果 ab 之一不是数字或字符串操作数,将抛出错误。
PrintStream class 的 println/print 方法的实现尝试为给定参数获取 toString 方法的默认结果。
System.out.print(...) 是一种对象和调用的组合。 System 是表示运行时环境中系统的静态对象,out 表示当前线程的标准输出流,print 是在 out PrintStream 上调用的方法。有几种不同的流,例如 err 是标准错误输出流。
标准 printprintln 方法被重载以接受 Object 类型,其中这些方法尝试调用给定 Object 上的 toString 方法作为参数。但如果整个表达式未评估为 Number 或 String,则它无法使用 + 操作数评估给定表达式。

切入正题, “+”最初用作算术运算符,如果下一个运算符是字符串,它将表达式的其余部分转换为字符串。
当“+”有两个对象或不兼容的运算符时,它无法确定应该如何处理操作数。它如何将列表添加到数组或简单地添加 true + true?对于第二个 (true + true),必须使用逻辑 &&
在您的情况下,当您尝试 + 不同类型之间时, println 给了您一个错误,因为“+”只能连接字符串或对继承自 Number 的两个操作数求和class。

@Moyebang 的回答不错,因为 printnl 方法中作为参数给出的表达式的计算结果为 String 类型。 @Lotsa 的答案不是很好,因为操作数是从左到右求值的,所以如果 + 之前的操作数不兼容,程序会抛出错误(答案的第二部分没问题)。

此类表达式首先在其编译时求值。
从左到右根据标准基础对其进行评估:

System.out.println(1 + 1 + ""); //this gives 2
System.out.println("" + 1 + 1); //this gives 11
System.out.println(1 + "" + new ArrayList<>()); //this gives 1[]
System.out.println(new ArrayList<>() + "" + 1); //this gives []1
System.out.println(new ArrayList<>() + 1 + ""); //and this gives an error

因此,从左边开始计算数学方程式,当它是一个字符串时,其他方程式将被添加到该字符串。最后一个显示错误,因为首先将 ArrayList 对象添加到“1”,其中没有关于如何添加 List 的通用方法到一个对象。