对象和String对象之间的区别?

时间:2017-01-20 20:20:17

标签: java string operator-overloading

让我们举个例子:

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的值?

4 个答案:

答案 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;,则代码根本无效,objectob都将取消选中。