使用继承时出现NullPointerException

时间:2015-03-17 05:21:47

标签: 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) {
        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?谢谢。

4 个答案:

答案 0 :(得分:3)

在继承中,当字段和静态成员被遮蔽/隐藏时,方法被覆盖。

因此,如果您在父级中初始化某个字段,如果您在子级中定义相同的字段,它将不会对子级产生任何影响,因为它将被遮蔽。

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

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

详细了解阴影/隐藏和覆盖:Overriding vs Hiding Java - Confused

答案 1 :(得分:2)

您已忘记this.the_animal = a_mammal;的构造函数中的Mammal_Groomer

答案 2 :(得分:2)

您从未在the_animal中初始化Mammal_Groomer,因此它是null并且在方法调用上提升NullPointerException。您应该在超级调用之后将其初始化为:

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

答案 3 :(得分:1)

the_animal

Mammal_Groomer没有引用任何Mammal对象,导致NULL引用和NullPointerException。