对象转型

对象转型(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");
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值