使用继承时出现 NullPointerException
NullPointerException when using inheritence
我有一个可以通过以下玩具示例最好地说明的场景。假设我有四个 类:
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?谢谢。
您在 Mammal_Groomer
的构造函数中忘记了 this.the_animal = a_mammal;
。
您从未在 Mammal_Groomer
中初始化 the_animal
,因此它是 null
并在方法调用时抛出 NullPointerException
。你应该在超级调用之后初始化它:
public Mammal_Groomer(Mammal a_mammal){
super(a_mammal);
this.the_animal = a_mammal;
}
class Mammal_Groomer
的 the_animal
没有引用任何 Mammal
对象,导致 NULL 引用和 NullPointerException。
在继承中,方法被覆盖,而字段和静态成员得到 shadowed/hidden。
因此,如果您在父级中初始化一个字段,如果您在子级中定义相同的字段,则不会对子级产生任何影响,因为它会被隐藏。
您没有初始化子字段,它隐藏了您的父字段并且具有值 null
。您需要在子构造函数中单独初始化子 class 的成员。
public Mammal_Groomer(Mammal a_mammal){
super(a_mammal);
this.the_animal = a_mammal;
}
阅读更多关于 shadowing/hiding 和覆盖的信息:Overriding vs Hiding Java - Confused
我有一个可以通过以下玩具示例最好地说明的场景。假设我有四个 类:
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?谢谢。
您在 Mammal_Groomer
的构造函数中忘记了 this.the_animal = a_mammal;
。
您从未在 Mammal_Groomer
中初始化 the_animal
,因此它是 null
并在方法调用时抛出 NullPointerException
。你应该在超级调用之后初始化它:
public Mammal_Groomer(Mammal a_mammal){
super(a_mammal);
this.the_animal = a_mammal;
}
Mammal_Groomer
的 the_animal
没有引用任何 Mammal
对象,导致 NULL 引用和 NullPointerException。
在继承中,方法被覆盖,而字段和静态成员得到 shadowed/hidden。
因此,如果您在父级中初始化一个字段,如果您在子级中定义相同的字段,则不会对子级产生任何影响,因为它会被隐藏。
您没有初始化子字段,它隐藏了您的父字段并且具有值 null
。您需要在子构造函数中单独初始化子 class 的成员。
public Mammal_Groomer(Mammal a_mammal){
super(a_mammal);
this.the_animal = a_mammal;
}
阅读更多关于 shadowing/hiding 和覆盖的信息:Overriding vs Hiding Java - Confused