У меня два класса
public class Person {
public String name = "person";
public String getName(){
return name;
};
}
public class Teacher extends Person{
public String name ="teacher";
public static void main(String[] args) {
Teacher teacher = new Teacher();
System.out.println(teacher.name);
}
}
- вывод "человек", почему?
** неважно, изменение свойства имени является частным или общедоступным, результатом всегда является «человек», но то, что я узнал до сих пор, сказало мне, что если подкласс наследуется от суперкласса, он также содержит методы из суперкласса, поэтому, когда я вызываю метод объекта подкласса, имя в методе должно быть this.name, и это должен быть учитель, верно?, но почему я все еще получаю имя суперкласса? **
2 ответа
В основном это вопрос охвата. Переменные private
доступны только для определяющего класса. В вашем случае за реализацию геттер-функции отвечает базовый класс, и он будет знать только о своих переменных.
Базовый класс не может знать о переменных, определенных в подклассах (это, возможно, чрезмерное упрощение, как и некоторые пояснительные детали в предложениях ниже, но, по крайней мере, должно направить вас на правильный путь).
Если вы хотите, чтобы подклассы могли изменять значение переменной, а не только функцию, вам потребуется одно из следующих действий:
- Сделайте переменную
protected
(видимой только для класса и подклассов) и назначьте ее в конструкторе подкласса. или же, - Предоставьте функцию установки в своем базовом классе и вызовите ее в своем конструкторе. Это можно защитить, если вы хотите ограничить доступ к подклассам и не разрешать классам вне пакета изменять его. или же,
- Просто переопределите функцию получения в вашем подклассе. (Кроме того, если вам не нужно, чтобы переменная была изменяемой, вы можете просто
return "teacher";
)
Переменная с именем name
в вашем подклассе скрывает переменную с таким же именем в суперклассе. См. https://docs.oracle.com /javase/specs/jls/se8/html/jls-8.html#d5e12172
Вы, вероятно, захотите иметь только одно поле name
в суперклассе и хотите установить его при создании объекта:
class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
class Teacher extends Person {
public Teacher(String name) {
super(name);
}
public static void main(String[] args) {
Teacher teacher = new Teacher("teacher");
System.out.println(teacher.getName());
}
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.