Наследование полей в подклассе Java. Нет полей хотя класс является наследником
Здравствуйте совсем запутался с наследованием полей в Java. Ситуация у меня такая, что подкласс LastName наследуется от суперкласса Name, в родительском классе описано поле name, но в подклассе LastName его попросту нет, у меня не получается его вызвать хотя стоит модификатор доступа protected. Совсем новичок в Java если укажите где ошибка буду очень благодарен)!
Ответы (1 шт):
в подклассе
LastName
его [поляname
] попросту нет, у меня не получается его вызвать
В представленном коде поле name
в классе LastName
есть и прекрасно себя чувствует.
Ошибка в том, что в данном случае присваивание нового значения полю класса с использованием ключевого слова this
в левой части НЕ допускается за пределами блока кода, то есть вне конструктора или метода как указал в комментарии Алексей Шиманский или же вне блока инициализации.
Дело в том, что такой код this.name = "New Value";
противоречит синтаксису объявления нового поля (как указал RomanC), но к данному полю name
вполне можно обращаться при определении других полей для чтения или внутри различных блоков кода в конструкторе/методе/блоке нестатической инициализации как для чтения, так и записи.
Примеры работающего кода:
// добавим геттер для поля и переопределим метод toString
class Name {
protected String name = "Simon";
@Override public String toString() {
return this.getClass() + ": name=" + name + "; getter=" + getName();
}
public String getName() {
return this.name;
}
}
public class LastName extends Name {
// this.name "работает" при объявлении и инициализации (в правой части)
protected String foo = "foo: " + this.name;
// есть доступ в конструкторе
public LastName() {
System.out.println("LastName <ctor>");
this.name = "Constructed name";
}
// есть доступ в методе
public void lastName() {
this.name = "Method name";
}
// есть доступ в блоке инициализации
{
// чтение
System.out.println("init: " + getClass() + ": " + this.name);
System.out.println("init: " + this.foo);
// переприсваивание
this.name = "Init name";
System.out.println("chng: " + getClass() + ": " + this.name);
}
}
Вывод для следующего кода:
System.out.println(new Name());
System.out.println(new LastName());
// вызов toString для созданного экземпляра Name
class Name: name=Simon; getter=Simon
// создается экземпляр LastName
// вызов блока инициализации
init: class LastName: Simon // текущее значение name из класса предка
init: foo: Simon // вывод foo
chng: class LastName: Init name // изменили значение name в блоке
// вызов конструктора
LastName <ctor>
// вызов toString для созданного экземпляра LastName
// значение записанное последним в конструкторе
class LastName: name=Constructed name; getter=Constructed name