Для конкретной программы я по существу имею абстрактный суперкласс с несколькими различными подклассами. Однако у меня возникают проблемы с затенением полей, как показано ниже.
abstract class Super {
String name;
String getName() {
return name;
}
}
Теперь я создаю подклассы, каждый из которых имеет свое "имя".
class Sub extends Super {
name = "Subclass";
}
Однако создание экземпляров подкласса, а затем вызов унаследованного метода getName() приведет к null из-за затенения поля.
Есть ли простой способ избежать этой проблемы и позволить каждому подклассу иметь уникальное поле, к которому можно получить доступ с помощью унаследованного метода?
Вы можете попробовать этот механизм (бонус оставлен читателю, расширьте код, чтобы получить имя класса напрямую). В коде используется конструктор абстрактных классов для установки имени. Вы также можете определить функцию setName в классе Super и использовать это.
Суперкласс (аннотация)
package stackShadow;
public abstract class Super {
String name;
public Super(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Первый подкласс класса Shadow1
package stackShadow;
public class Shadow1 extends Super {
public Shadow1() {
super("Shadow1");
}
}
Второй подкласс класса Shadow2
package stackShadow;
public class Shadow2 extends Super {
public Shadow2() {
super("Shadow2");
}
}
Тест-класс для проверки getName- пакета stackShadow;
public class Test {
public static void main(String[] args) {
Shadow1 one = new Shadow1();
Shadow2 two = new Shadow2();
System.out.println("Name for one is: " + one.getName());
System.out.println("Name for two is: " + two.getName());
}
}
Сделать поле видимым в дочернем классе и инициализировать его в конструкторе подкласса или в инициализаторе экземпляра подкласса.