这已经困扰了我一段时间。我是认真的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)
显示相同的变量时为什么不显示它?
抱歉,由于我缺乏理解,这可能是一个愚蠢的问题。但是非常感谢您答复。
答案 0 :(得分:2)
基本上,当我尝试显示“ System.out.println(a1.name)”时,我看到的是null。为什么会这样?
这里的主要问题是,通过在name
和humano
中重新声明neandarthal
,您正在 shadwing 出现在name
字段中ape
。这意味着humano
和neandarthal
创建的对象具有两个 name
字段:一个由ape
定义的字段,以及它们定义的单独的字段为自己。然后在代码中,您对于使用哪个name
字段非常不一致。
您几乎可以肯定要删除name
和humano
中的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"
。