я следующие классы, определенные:.Использование GetClass() GetName() в ToString() методы
class BaseClass {
public String toString()
{
return "I am a: " + getClass().getName();
}
}
class DerivedClass {
public String toString()
{
return super.toString();
}
}
В моей основной функции() У меня есть следующий код:
BaseClass b = new BaseClass();
DerivedClass d = new DerivedClass();
System.out.println(b);
System.out.println(d); // not sure why/how this works!
As ожидается, я получаю правильные типы классов во время выполнения при выполнении этого кода:
I am a: BaseClass
I am a: DerivedClass
Мой вопрос, как именно вызов toString()
в моей работе DerivedClass? В моем переопределении DerivedClass от toString()
я звоню в super.toString()
, который кажется, что он должен фактически вернуть «Я: BaseClass», потому что мы вызываем toString()
в родительский класс.
Я подозреваю, что это может иметь какое-то отношение к тому факту, что мой базовый класс toString()
использует getClass().getName()
, так что, когда я вызываю его через объект подкласса, Java должен обнаруживать мой фактический тип объекта - но я не знаю, как он знает это сделать ...
Извините, если это звучит как вопрос о нобе, но я все еще обнимаю концепцию полиморфизма. Если бы кто-нибудь мог объяснить, почему это работает так, как я понимаю, я был бы признателен за любое понимание.
'getClass(). GetName()' вернет тип ** runtime **. –
https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass-- –
Когда вы вызываете метод экземпляра, в него неявно передается объект с именем 'this' , В этом случае 'this' является экземпляром' DerivedClass'. Поэтому вызов 'this.getClass()' (который вы вызываете) возвращает класс для 'DerivedClass'. – khelwood