对象转型
- 一个基类的引用类型变量可以指向其子类的对象
- 一个基类的引用不可以访问其子类对象新增加的成员(属性,方法)
- 可以使用 引用 变量instanceof类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类
- 子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之则称为向下转型(downcasting)
class Animal{
public String name;
Animal(String name){
this.name = name;
}
}
class Cat extends Animal{
public String eyeColor;
Dog(String n,String c){
super(n);
eyeColor = c;
}
}
class Dog extends Animal{
public String furColor;
Dog(String n,String c){
super(n);
furColor = c;
}
}
public class TestCasting {
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.furname);//!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
}
}
重写TestCasting,即通过基类的引用类型变量可以指向其子类的对象,实现程序的可扩展性:
public class TestCasting {
public static void main(String[] args) {
Test test = new Test();
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.eyeColor+" eyes");
}else if(a instanceof Dog){
Dog dog = (Dog)a;
System.out.println(dog.furColor+" eyes");
}
}
}