2013-11-12 4 views
0
package com.test; 

public class Main { 

    public static void main(String[] args) { 

     System.out.println(new B().toString()); 
    } 
} 


package com.test; 

class A { 

    @Override 
    public String toString() { 
     // TODO Auto-generated method stub 
     return this.getClass().getName(); 
    } 
} 

package com.test; 

public class B extends A { 

} 

Эта программа дает выходной com.test.B но если я изменю метод ToString класса А вПоясните вывод следующей программы Java

@Override 
public String toString() { 
    return "hello"; 
} 

Затем распечатать привет. Зачем?

+0

Почему выход удивляет вас? – Jesper

+0

Я бы пообещал хорошие деньги, что причина изменилась, потому что вы изменили ее. –

+0

Ах, вы меняете метод печати «привет», и тогда вы удивляетесь, что это печатает это? Секрет этого называется переписыванием метода. – Matthias

ответ

3

В своем первом вызове функции, когда метод:

@Override 
public String toString() { 
     // TODO Auto-generated method stub 
     return this.getClass().getName(); 
} 

Поскольку этот метод вызывается из экземпляра класса В, то this.getClass() относится к B объекту класса. Таким образом getName() функция печатает

com.test.B

Если же функция была бы вызвать путем создания A объект класса, то выход был бы,

com.test.

И когда вы измените функцию toString на это:

@Override 
public String toString() { 
    return "hello"; 
} 

вернет hello, как вы вернули hello в качестве возвращаемого значения.

Теперь, если вы действительно хотите, чтобы понять @Override затем добавить этот код класса B и в классе пусть функция, возвращающая hello там

@Override 
public String toString() { 
    // TODO Auto-generated method stub 
    return this.getClass().getName(); 
} 

Попробуйте код выше, и вызвать toString функцию из класса A и экземпляр класса B. Тогда будет более ясно, что делает @Override и как он работает

1

В этом toString метода:

@Override 
public String toString() { 
     // TODO Auto-generated method stub 
     return this.getClass().getName(); 
} 

вы возвращающийся this.getClass().getName(), который возвращает имя объекта (класс, интерфейс, класс массива, примитивный типа, или пустоты), представленный этот объект класса, как Строка.

И когда вы меняете toString к этому:

@Override 
public String toString() { 
    return "hello"; 
} 

его возвращение hello, потому что у вас есть "hello" как возвращаемое значение.

2

Ну, вы звоните toString() по экземпляру B и распечатываете это. B не имеет собственного toString(), но наследует его от A. toString(), определенный в A, возвращает имя класса. Поэтому, когда используется B, имя класса равно com.test.B, что и было возвращено.
Если вы измените реализацию в A, чтобы вернуть «привет», это то, что она вернет.

Возможно, вы ожидали, что первая версия будет напечатана com.test.A, поэтому я объясню, почему этого не происходит.
Это не то, что B спрашивает A «что это результат toString(), B спрашивает A», что я должен сделать, чтобы получить результат toString(). В первом случае A сообщает B «просто верните свое (класс) имя», а во втором случае A сообщает B «просто скажите« привет ».

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