Наследование полей в подклассе Java. Нет полей хотя класс является наследником

Здравствуйте совсем запутался с наследованием полей в Java. Ситуация у меня такая, что подкласс LastName наследуется от суперкласса Name, в родительском классе описано поле name, но в подклассе LastName его попросту нет, у меня не получается его вызвать хотя стоит модификатор доступа protected. Совсем новичок в Java если укажите где ошибка буду очень благодарен)!

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Nowhere Man

в подклассе 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
→ Ссылка