2017-01-20 3 views
0

Давайте этот пример:Разница между объектом и объектом String?

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;.

Однако, если I устранить эту строку, программа выполняет надлежащим образом (печать строки как null1).

Теперь мой вопрос в том, что объект и ob оба являются объектами объектов класса Строка и класс Класс соответственно так почему/как я могу добавить 1 к нулевому значению объекта, а не объекта ob?

+3

Потому что '+' определяется для строк и классов в штучной упаковке; но не для других классов. –

+0

Кроме того, пожалуйста, найдите время для более четкого форматирования кода и в идеале следуйте соглашениям об именах Java, чтобы избежать отвлечения потенциальных ответчиков. –

ответ

1

Причина, по которой это происходит, заключается в том, что java-компилятор имеет специфические знания класса String и знает, как с ним делать особые вещи, одним из которых является дополнение.

Когда вы добавляете что-то к строковому объекту, компилятор java заменит ваше дополнение кодом, который преобразует операнд в строку (вызывая toString()), а затем выдает вызов String.concat(). И если вы добавите много строк вместе в один оператор, он создаст StringBuilder и вызовет его append() несколько раз, затем возьмите toString()StringBuilder.

0

Java не поддерживает перегрузку оператора. Вы можете использовать только такие операторы, как +, -, *, /, <<, >>, |, ^, >>>, << и т.д. на примитивных типов и на String объектов. Вы не можете реализовать эти операторы в экземплярах своего собственного класса.

См. this question, чтобы понять, почему Java не позволяет переопределить это поведение.

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 имеет поле, сделать поддержку этой операции, класс Строка одно исключение, которое позволяет вы должны сделать это

0

Полный ответ заключается в том, что для переменных класса Java инициализирует их со специальными значениями для примитивов + String и с нулевым значением для каждого другого объекта. Что касается локальных переменных (например, определенных внутри метода), то Java ничего не делает с ними. Ошибка, которую вы получаете, вызвана отсутствием оператора + для любых других типов, кроме примитивов или строк.

Если вы переместите определение String object; внутри метода, ваш код не будет работать вообще, как object, так и ob не будут использоваться.

Смежные вопросы