一、对象转型的介绍
在java中,一个基类的引用类型变量可以指向其子类的对象。可以分为向上转型和向下转型。
(一)向上转型(upcasting):子类的对象可以当作基类的对象来使用,
格式:父类名称 对象名 = new 子类对象名称():如下
Animal aa = new Dog("JiaJia","black");
表示创建一个子类对象(Dog对象)aa,当作父类对象(Animal)使用。
(1)一个基类的引用不可以访问其子类对象新增加的成员变量和方法。(向上转型相当于失去一部分属性和方法)
否则会出错:
(2)可以访问子类继承的方法和子类重写的方法
如下均有父类和子类均有info()方法,当向上转型调用时,调用的是子类的info(根本原因是,调用方法时,用的是实际类,而不是父类,指向的是子类的方法,详细的参看多态那篇文章)。
向下转型(downcasting):基类的对象可以当作子类的对象来使用
二、对象转型的使用
(一)、强制转型
可以将对象的向上转型强制转型为一个子类对象,这样这个子类对象就又具备了子类的对象的所有属性和方法。
格式:
子类名称 对象名 = (子类名称)向上转向的对象名
向上转型的对象不能强转为其它子类,否则会报错。
(二)instanceof判断隶属(实际是:XX是一个XX)
判断引用类型变量所指向的对象是否属于该类或该类的子类,可使用
语法:引用变量 instanceof 类名
返回值是:true或false
三、对象转型的使用
当一个基类有多个子类,要判断某个子类的一些特征时,可以先定义为父类,之后再判断是哪个子类,这样可实现程序的可扩展性。
class Animal{
public String name;
Animal(String name ){
this.name = name;
}
public String info(){
return "name:"+this.name;
}
}
class Dog extends Animal{
public String furColor;
Dog(String name,String furColor) {
super(name);
this.furColor = furColor;
}
@Override
public String info() {
return super.info() + " furColor:" + furColor ;
}
}
class Cat extends Animal{
public String eyesColor;
Cat(String name,String eyesColor) {
super(name);
this.eyesColor = eyesColor;
}
}
public class CastingTest {
public static void main(String[] args) {
CastingTest ct = new CastingTest();
Animal a = new Animal("HumanFriend");
Cat c = new Cat("BeiBei", "Blue");
Dog d = new Dog("DaHuang", "yellow");
System.out.println("___________Animal a___________");
ct.f(a);
System.out.println("___________Cat c___________");
ct.f(c);
System.out.println("___________Dog d___________");
ct.f(d);
}
public void f(Animal a){
System.out.println("name:" + a.name);
if (a instanceof Cat){
Cat a1 = (Cat) a;
System.out.println("eyesColor: " + ((Cat) a).eyesColor);
}
else if (a instanceof Dog){
Dog d1 = (Dog)a;
System.out.println("furColor: "+ ((Dog) a).furColor);
}
}
}
运行结果: