Java 使用继承时出现NullPointerException

Java 使用继承时出现NullPointerException,java,inheritance,Java,Inheritance,我有一个场景,可以通过下面的玩具示例来最好地说明。假设我有四个班: 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) { s

我有一个场景,可以通过下面的玩具示例来最好地说明。假设我有四个班:

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_昵称给我一个java.lang.NullPointerException异常。有没有办法修复构造函数或MG.print\u昵称方法来打印nick\u名称?谢谢。

你忘了这一点;在哺乳类梳理器的构造函数中。

您从未在哺乳类梳理器中初始化过动物,因此它为null,并且在方法调用时出现NullPointerException。您应该在超级呼叫后进行初始化,如下所示:

public Mammal_Groomer(Mammal a_mammal){
    super(a_mammal);
    this.the_animal = a_mammal;
}
public Mammal_Groomer(Mammal a_mammal){
    super(a_mammal);
    this.the_animal = a_mammal;
}

“哺乳动物”类的“动物”梳理器没有对任何哺乳动物对象的引用,导致空引用和NullPointerException。

在继承中,方法被重写,而字段和静态成员被隐藏/隐藏

所以,若您在父级中初始化一个字段,若您在子级中定义相同的字段,它将不会对子级产生任何影响,因为它将被隐藏

您没有初始化隐藏父字段且值为空的子字段。您需要在子构造函数中单独初始化子类的成员

public Mammal_Groomer(Mammal a_mammal){
    super(a_mammal);
    this.the_animal = a_mammal;
}

了解更多有关隐藏和覆盖的信息:

继承就像辣椒味啤酒。理论上听起来不错,但通常会导致比你预期的更多的问题。备选方案:组成。接口有效地完全抽象基类