我对以下代码的输出感到困惑:
public class Cat {
public String typeCode = "Cat";
public String toString(){
return "Cat";
}
public static void printTypes(Cat c1, Cat c2){
System.out.println(c1.typeCode + " " + c2.typeCode);
}
public static void main(String[] args){
Cat c1 = new Cat();
SubCat s1 = new SubCat();
Cat c2 = s1;
System.out.println(s1.typeCode);
Cat.printTypes(c1, s1);
SubCat.printTypes(c1, s1);
SubCat.printTypes(c2, c1);
SubCat.printTypes(c1, c2);
System.out.println(c2 + " " + c1);
}
}
public class SubCat extends Cat{
public String typeCode = "SubCat";
public String toString(){
return "SubCat";
}
public static void printTypes(Cat c1, Cat c2){
System.out.println(c1 + " " +c2.typeCode);
}
}
Eclipse给了我这个输出:
SubCat
Cat Cat
Cat Cat
SubCat Cat
Cat Cat
SubCat Cat
但在我看来,我认为第二行和第三行应该是
Cat SubCat
Cat SubCat
由于s1是一个subcat而且它的类型代码是SubCat,那么为什么输出是Cat?
而且,这一行之后会发生什么: Cat c2 = s1? 这是否意味着s1和c2将是完全相同的对象或s1和c2将在RAM中具有相同的引用或地址? c2是Cat还是SubCat并且会将s1更改为subcat?
提前致谢!
答案 0 :(得分:1)
您有两个不同的 typeCode
字段;每个班级一个。
在派生类中创建具有相同名称的字段不会影响基类中定义的字段。
要获得您期望的行为,您应该删除派生类中的重复字段定义,而是分配到派生构造函数中的原始字段。