java对象造型问题

来源:百度知道 编辑:UC知道 时间:2024/09/21 07:56:25
public class TestCasting{
public static void main(String []args){
Animal a=new Animal("name");
Dog d=new Dog("dogname","yellow");
Cat c=new Cat("catname","blue");

a=new Dog("bigyellow","yellow");
System.out.println(a.name); //输出bigyellow

Dog d1=(Dog)a;

System.out.println(d1.name); //输出null
System.out.println(d1.furColor); //输出 yellow
}
}
class Animal{
public String name;
Animal(String name){
this.name=name;
}
}

class Dog extends Animal{
public String name;
public String furColor;
Dog(String name,String furColor){
super(name);
this.furColor=furColor;
}
}

class Cat extends Animal{
public String name;
public String eyesColor;
Cat(String name,String eyesColor){
super(name);
this.eyesColor=eyesC

Dog d1=(Dog)a;
因为这一句的定义是把父类对象强制转换为子类对象,又因为子类对象有name和furColor两个属性,所以可以去调用,而"bigyellow"已经被赋给了父类的name属性,所以你再调用子类的name属性时就没有了,只能是null.
其实你程序里把子类都又重新定义一个name属性是多余的.
应该这样写.子类不要再定义name属性,而是直接super(name),这样的话,父类和子类都通用一个name属性,就不会出现错误了.而更加符合继承的思想.

这个问题,我也曾很疑惑。

问题在于 方法的调用 是 子类 覆盖 父类 的方法,而实现多态的。

而 属性 的调用则没有多态现象。

【更正】

Dog(String name,String furColor){
super(name);
this.furColor=furColor;
this.name = name; //【在这里设定子类的 name 】
}

分析下程序的执行过程如下:
一、首先: Animal a=new Animal("name");
定义一个引用a指向new Animal("name")

二、然后:a=new Dog("bigyellow","yellow");
把引用a指向新的对象new Dog("bigyellow","yellow");,此时调用子类Dog的构造函数,即:
Dog(String name,String furColor){
super(name);
this.furColor=furColor;
},构造函数super(name);,表示把Dog(String name,String furColor)中的形参name传入,并通过super(name);赋值给父类构造函数,即