Родительская переменная Java access возвращает значение null

#java #inheritance

Вопрос:

Я пытаюсь получить доступ к родительской переменной из дочернего класса, но она возвращает значение null.

Я явно вызвал родительский конструктор и присвоил ему значение, но в дочернем классе я получаю нулевые значения.

Мне интересно, может ли это сработать или нам придется использовать Getter/Setter ?

 public class Parent {
    public static String name;

    public Parent() {
        System.out.println("Parent constructor is called");
        this.name = "Adam";
    }
}

public class Child extends Parent{
    static final String parentName = Parent.name;

    public static void main(String[] args) {
        Child c = new Child();
        System.out.println(parentName);
    }
}
 

Выход:

 Parent constructor is called
null
 

Комментарии:

1.Вам следует ознакомиться с модификаторами и порядком инициализации. В вашем случае parentName будет инициализирован при загрузке Child класса (т. е. определение класса) и в этот момент Parent.name также будет иметь значение null. Установка этого статического поля в конструкторе происходит позже, когда создается экземпляр, но в любом случае это неправильно, так как name это не поле экземпляра, а поле уровня класса. Удалите static ключевые слова для начала и измените назначение на parentName = name . Затем вам нужно получить parentName его из Child созданного вами экземпляра, c.parentName т. е.

Ответ №1:

В вашем случае, если вы хотите получить доступ к имени родительской переменной, удалите ключевое слово final из дочернего класса и назначьте родителя.Имя переменной ParentName после создания экземпляра дочернего класса. Значение становится нулевым, потому что вы пытаетесь присвоить значение родительской переменной перед созданием объекта.

 public class Parent {
    public static String name;

    public Parent() {
        System.out.println("Parent constructor is called");
        this.name = "Adam";
    }
}

public class Child extends Parent{
    static String parentName;
    public static void main(String[] args) {
        Child c = new Child();
        parentName = Parent.name;
        System.out.println(parentName);
    }
}
 

Комментарии:

1. Вы абсолютно правы: «Значение становится нулевым, потому что вы пытаетесь присвоить значение родительской переменной перед созданием объекта». Спасибо вам за редактирование вашего первоначального ответа. 1 после ваших изменений 🙂 На самом деле здесь есть несколько разных — одинаково важных — вопросов, надеюсь, ОП внимательно прочтет комментарий Томаса выше и примет его близко к сердцу.