#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 после ваших изменений 🙂 На самом деле здесь есть несколько разных — одинаково важных — вопросов, надеюсь, ОП внимательно прочтет комментарий Томаса выше и примет его близко к сердцу.