无法访问已分配给超类引用的子类实例变量

时间:2018-08-19 11:06:10

标签: java variables inheritance subclass superclass

这已经困扰了我一段时间。我是认真的OOps概念的新手,并且遇到了。这是我所拥有的:

类猿:

public class ape {
String name;

public String getBehavior() {

    return "I am apeshit";

   }

}

人文课堂:

public class humano extends ape {
public String name;

public humano(String namevalue) {
    name = namevalue;
}

public String getBehavior() {
    return "I am a :" + name;
}

public String getName() {
    return name;
  }

}

neandarthal类:

public class neandarthal extends ape {

String name;

public neandarthal(String name) {
    super.name = name;
}

public String getBehavior() {
    return "I am  a :" + name;
}

public String getName() {
    return name;
  }

}

Species_Factory类:

公共类物种工厂{

static ape ap = null;

static ape getSpecies(String name) {
    if (name == "humano") {
        return new humano(name);
    }

    if (name == "neandarthal") {
        return new neandarthal(name);
    }

    else {
        return ap;
    }

}

}

最后是主要的物种:

public class species {
public static void main(String args[]) {
    ape a1 = species_factory.getSpecies("humano");
    ape a2 = species_factory.getSpecies("neandarthal");
    System.out.println(a1.name);
    System.out.println(a2.name);
    System.out.println(a1.getBehavior());
    System.out.println(a2.getBehavior());
    System.out.println(a1.getClass().getSuperclass().getName());

  }

}

输出:

null
neandarthal
I am a :humano
I am  a :null
ape

我有关于空值的查询。基本上,当我尝试显示System.out.println(a1.name)时。我看到null。为什么是这样?

我看到我在第三行中得到了值I am a :humano,这意味着我为字符串变量name传递的值被存储在humano实例中。

但是当我尝试使用语句System.out.println(a1.name)显示相同的变量时为什么不显示它?

抱歉,由于我缺乏理解,这可能是一个愚蠢的问题。但是非常感谢您答复。

1 个答案:

答案 0 :(得分:2)

  

基本上,当我尝试显示“ System.out.println(a1.name)”时,我看到的是null。为什么会这样?

这里的主要问题是,通过在namehumano中重新声明neandarthal,您正在 shadwing 出现在name字段中ape。这意味着humanoneandarthal创建的对象具有两个 name字段:一个由ape定义的字段,以及它们定义的单独的字段为自己。然后在代码中,您对于使用哪个name字段非常不一致。

您几乎可以肯定要删除namehumano中的neandarthal声明(然后在{{1}上使用this.而不是super. }),因此您使用的是name中声明的字段。

您看到的具体原因是:

  • 第一行(ape):"null"分配给它的 own humano字段,但是当您在{{ 1}},因为name被声明为a1.name,所以它使用main中的a1字段(仍为ape,没有分配任何内容它)。
  • 第二行(name):ape分配给null的{​​{1}}字段("neandarthal"),而不是它自己的字段。由于neandarthal被声明为ape,因此name使用该名称,您会看到分配的字符串。
  • 第三行(super.name = ...):a2的{​​{1}}使用其自己的ape字段,而不是a2.ape的字段,因此您会看到分配给它的构造函数。
  • 第四行("I am a :humano"):humano的{​​{1}}使用其 own getBehavior字段,该字段仍为{{1} },因为没有分配任何东西。
  • 第五行(name):我不认为您对此感到困惑,但是ape的超类是"I am a :null"