对象转型(casting)
◇一个基类的引用类型变量可以"指向"其子类的对象
◇一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)
◇可以使用 引用变量 instanceof 类名 来判断该引用型变量所"指向"的对象是否属于该类或该类的子类
◇子类的对象可以当做基类的对象来使用,称作向上转型(upcasting),反之称为向下转型(downcasting)
实例1:
classAnimal {
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;
}
}
public class Test {
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(a instanceof Animal); //true
System.out.println(c instanceof Animal); //true
System.out.println(d instanceof Animal); //true
System.out.println(a instanceof Cat); //false
a = new Dog("bigyellow","yellow");
System.out.println(a.name); //bigyellow
System.out.println(a.furColor); //!error
System.out.println(a instanceof Animal); //true
System.out.println(a instanceof Dog); //true
Dog d1 = (Dog)a; //要加强制转换符
System.out.println(d1.furColor); //yellow
}
}
a实际上是指向了这只狗的,但是a只看到了Dog里面作为Animal的这一项,如棕色线。当进行强转后,通过d1来访问,就可以看到furColor。
根据上例,提出可扩展性更好的实例2:
public class Test {
public static void main(String args[]) {
Test test = new Test(); //要使用里面的方法,所以要new一个对象出来
Animal a = new Animal("name");
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
test.f(a);
test.f(c);
test.f(d);
}
public void f(Animal a) {//要求传入动物类型,其实传入动物的子类也是可以的
System.out.println("name: "+a.name);
if(a instanceof Cat) {
Cat cat = (Cat)a;
System.out.println(" "+cat.eyesColor+" eyes");
}else if(a instanceof Dog) {
Dog dog = (Dog)a;
System.out.println(" "+dog.furColor+" fur");
}
}
}