我有一个可以通过以下玩具示例很好地说明的方案。假设我有四个班级:
public class Animal {
public Animal(String a_name){
this.name = a_name;
}
public String name;
}
public class Mammal extends Animal{
public Mammal(String a_name, String a_nickname) {
super(a_name);
this.nick_name = a_nickname;
}
String nick_name;
}
public class Animal_Groomer{
public Animal_Groomer(Animal an_animal){
this.the_animal = an_animal;
}
public void print_name() {
System.out.println(the_animal.name);
}
public Animal the_animal;
}
public class Mammal_Groomer extends Animal_Groomer{
public Mammal_Groomer(Mammal a_mammal){
super(a_mammal);
}
public void print_nickname(){
System.out.println(the_animal.nick_name);
}
public Mammal the_animal;
}
现在,如果我的主要程序是
Mammal a_mammal = new Mammal("Tiger", "Bob");
Mammal_Groomer MG = new Mammal_Groomer(a_mammal);
MG.print_name();
MG.print_nickname();
MG.print_name()输出“ Tiger”,但是MG.print_nickname()给我一个java.lang.NullPointerException异常。有没有办法修复构造函数或MG.print_nickname()方法以打印nick_name?谢谢。
最佳答案
在继承中,方法将被覆盖,而字段和静态成员将被阴影/隐藏。
因此,如果在父级中初始化字段,则在子级中定义相同的字段时,对子级不会有任何影响,因为它会被遮盖。
您没有初始化子字段,该子字段隐藏了您的父字段并具有值null
。您需要在子构造函数中单独初始化子类的成员。
public Mammal_Groomer(Mammal a_mammal){
super(a_mammal);
this.the_animal = a_mammal;
}
了解有关阴影/隐藏和覆盖的更多信息:Overriding vs Hiding Java - Confused