对象转型(casting):
1:一个基类的引用类型变量可以“指向”其子类的对象。
2:一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
3:可以使用 引用 变量instanceof类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
4:子类的对象可以当做基类的对象来使用乘坐向上转型(upcasting),反之称为向下转型(downcasting)
实例:
class Animal{
public String name;
Animal (String name){
this.name = name;
}
}
class Cat 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") //a是父类的引用,但是指向子类(Dog)
System.out.println(a.name); //bigyellow
System.out.println( a.furname ); //无法打印
System.out.println(a instanceof Animal ); //true
System.out.println(a instanceof Dog); //true
Dog d1 = (Dog)a; //要加强制转换符,这样d1就指向了子类(Dog)。但是Dog无法强制转换为Cat
System.out.println(d1.furColor); //yellow
}
}
实例二:
public class Test {
public static void main(String [] args){
Test test = new Test();
Animal a = new Cat("name");
Cat c = new Cat ("catname" , "black");
Dog d = new Dog("dogname" , "black");
test.f(a) ;
test.f(b) ;
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+" fur ")
}
}
}