让我们举个例子:
class Class
{
String object;
Class ob;
void display()
{
object= object+1;
ob = ob+1;
System.out.println(object +" "+ ob );
}
public static void main (String args[])
{
Class obj = new Class();
obj.display();
}
}
这会产生编译时错误: 二元运算符+的坏操作数类型 第一种类型;第二种类型:int 。 此错误指向我的代码 ob = ob + 1; 。
的这一行但是,当我消除这一行时,程序以适当的方式执行(将String打印为null1)。
现在我的问题是,该对象和ob分别是类的对象字符串和类Class,那么为什么/我如何能够将1添加到对象的null值而不是ob的值?
答案 0 :(得分:1)
这之所以有效,是因为java编译器具有String
类的特定知识,并且知道如何使用它进行特殊处理,其中之一就是添加。
当您向字符串对象添加内容时,java编译器会将您的添加内容替换为将操作数转换为字符串的代码(通过调用toString()
),然后发出对String.concat()
的调用。如果您在一个语句中添加多个字符串,它将创建一个StringBuilder
并多次调用append()
,然后获取toString()
的{{1}}。
答案 1 :(得分:0)
Java不支持运算符重载。您只能使用+
,-
,*
,/
,<<
,>>
,|
,{等运营商原始类型和^
对象上的{1}},>>>
,<<
等。您无法在自己的类的实例上实现这些运算符。
请参阅this question以了解为什么java不允许覆盖此行为。
答案 2 :(得分:0)
假设你有这个课程
class Foo {
provate int x;
private int y;
}
如果您 Foo myFoo + = 1 ,您接受什么作为逻辑上正确的结果操作? myFoo.x+=1;
?? ,myFoo.y+=1;
??或者myFoo.x+=1 and myFoo.y+=1;
??
Java不支持一元运算符的重载,如
class Foo {}
Foo +=1;
无效且无法编译(直到现在)无论Foo是否具有支持该操作的字段,String类是允许您执行此操作的一个例外
答案 3 :(得分:0)
完整的答案是,对于类变量,Java使用基元+ String的特殊值初始化它们,并为每个其他对象使用null。 对于局部变量(例如在方法中定义),Java不对它们做任何事情。您获得的错误是由于缺少基元或字符串之类的任何其他类型的+运算符。
如果您在方法中移动定义String object;
,则代码根本无效,object
和ob
都将取消选中。