对象转型:
一个基类的引用类型变量可以指向其子类的对象(要求传个动物,传给狗是可以的,狗是动物)
一个基类的引用不可以访问其子类对象的新增成员(狗会游泳不代表所有的动物都会游泳,把狗当作动物来看时不可访问狗游泳方法)
子类对象可以当作基类的对象来使用称向上转型,反之称为向下转型。
class Animal{
public String name;
Animal(String name){
this.name=name;
}
}
class Cat extends Animal{
public String eyesColor;
Cat(String n,String c){
super(n);eyesColor=c;
}
}
class Dog extends Animal{
public String furColor;
Dog(String n,String c){
super(n);furColor=c;
}
}main函数:
public static void main(String args[]){
Animal a=new Animal("name");
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
System.out.println(d instance of Animal); //true 狗是动物
System.out.println(a instanceof Dog); //False 动物是狗,显然逻辑错误,狗是动物,不能代表动物
a=new Dog("bigyellow","yellow"); //内存分析见下图1
System.out.println(a.name); //bigyellow
System.out.println(a.furname); //a是动物,new一个狗出来是把狗当作动物看,不可访问狗的特殊成员变量,上文第二条
System.out.println(a instanceof Dog); //true new出来的实际是Dog
//非要用a访问dog的成员变量,必须强制转换
Dog d1=(Dog)a; //内存分析见下图2
System.out.println(d1.furColor); //yellow
}
图1:狗当作普通animal,a只能看见animal共有的东西,看不见狗毛色属性
图2:强制转换,定义一个d1=a,在内存中分配一块区间d1指向与a指向的相同的对象,d1是Dog类型的,所以可以看见dog的所有属性