JAVA的向上与向下转型

//多态

class Dog extends Animal 
{
	public void eat()
	{
		System.out.println("骨头");
	}
	public void lookHome()
	{
		System.out.println("看家");
	}
}

//描述猫
class Cat extends Animal 
{
	public void eat()
	{
		System.out.println("鱼");
	}
	public void catchMouse()
	{
		System.out.println("抓老鼠");
	}
}
//进行抽取。将共性的功能抽取到父类Animal中。
abstract class Animal
{
	public abstract void eat();
}

/*
多态:
	【体现】
		父类的引用或者接口的引用指向了自己的子类对象。
		Dog d = new Dog();//Dog对象的类型是Dog类型。
		Animal a = new Dog();//Dog对象的类型右边是Dog类型,左边Animal类型。
	【好处】
		提高了程序的扩展性。
	【弊端】
		通过父类引用操作子类对象时,只能使用父类中已有的方法,不能操作子类特有的方法。
	【前提】
		1,必须有关系:继承,实现。
		2,通常都有重写操作。
	【子类的特有方法如何调用呢?】
	Animal a = new Dog();//Animal是父类型,new Dog()是子对象。
	但是父类型引用指向子类对象时,这就是让子类对象进行了类型的提升(向上转型)。
	向上转型好处:提高了扩展性,隐藏了子类型。弊端:不能使用子类型的特有方法。
	如果要想使用子类的特有方法,只有子类型可以用。
	可以向下转型,强制转换。
	Animal a = new Dog();
	a.eat();
	Dog d = (Dog)a;//将a转型为Dog类型。向下转型。
	d.lookHome();
	向下转型什么时候用?当需要使用子类型的特有内容时。
	
	注意:无论向上还是向下转型,最终都是子类对象做着类型的变化。
	
	【向下转型的注意事项】
	Animal a = new Dog();
	//Cat c = (Cat)a;向下转型因为不明确具体子类对象类型,所以容易引发ClassCastException异常。
	所以为了避免这个问题,需要在向下转型前,做类型的判断。
	判断类型用的是关键字 instanceof
	if(a instanceof Cat)//a指向的对象的类型是Cat类型。
	{
		//将a转型Cat类型。
		Cat c = (Cat)a;
		c.catchMouse();
	}
	else if(a instanceof Dog)
	{
		Dog d = (Dog)a;
		d.lookHome();
	}

	【转型总结】
	1,什么时候使用向上转型呢?
		提高程序的扩展性,不关系子类型(子类型被隐藏)。
		需要用子类的特有方法吗?不需要,哦了。向上转型。
	2,什么时候使用向下转型呢?
		需要使用子类型的特有方法时。
		但是一定要使用 instanceof 进行类型的判断。避免发生 ClassCastException

*/

class DuoTaiDemo2
{
	public static void main(String[] args) 
	{
		Dog d = new Dog();
//		d.eat();
//		d.lookHome();

		/*
		Animal a = new Dog();
		a.eat();//可以的。
//		a.lookHome();//不可以的。
		*/

		method(d);
		Cat c = new Cat();
		method(c);
	}
	public static void method(Animal a)
	{
		
		a.eat();
//		Dog d = (Dog)a;//ClassCastException:类型转换异常。
//		d.lookHome();

//		a.lookHome();//不可以,因为动物不具备这个功能。
	}

}



类似博客:http://blog.csdn.net/mr_jj_lian/article/details/6860845

类似博客:http://blog.csdn.net/shanghui815/article/details/6088588

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值