Java学习笔记之----多态,向上向下转型

Java学习笔记之-----多态,向上向下转型

多态

多态:多种形态,即对象的多态性。


//构建一个抽象类animal,定义一个抽象方法eat
abstract class animal{
	abstract void eat();
}
//子类bird继承父类
class bird extends animal{
	//覆盖eat方法
	void eat(){
		System.out.println("warm");
	}
}	
	public class PolyDemo{
		public static void main(String args[]){
			//实例化bird,此时会出现一个问题,当new有多个bird对象时,需要依次调用eat方法,代码的冗余性较大
			//可以构建一个method方法,需要时调用此方法即可
			bird b1 = new bird();
			bird b2 = new bird();
			bird b3 = new bird();
			//b1.eat();
			//b2.eat();
			//b3.eat();
			method(b1);
			method(b2);
			method(b3);
			
		}	
	public static void method(bird b){
		b.eat();
	}
}

在这里插入图片描述

  • 但是此时会有一个问题,如果不是bird类调用eat方法呢,如果是dog,cat或者其他具有eat方法的呢,如果还是使用method方法,此时代码仍旧冗余
  • 这里可以使用多态的思想,eat属于这些类的共有方法,我们可以将父类animal作为method中的参数,使用父类调用eat方法,这样就提高了代码的扩展性。
//构建一个抽象类animal,定义一个抽象方法eat
abstract class animal{
	abstract void eat();
}
//子类bird继承父类
class bird extends animal{
	void eat(){
		System.out.println("warm");
	}
}
//另一个子类
class cat extends animal{
	void eat(){
		System.out.println("fish");
	}
}
	
	public class PolyDemo{
		public static void main(String args[]){
			//实例化bird,此时会出现一个问题,当new有多个bird对象时,需要			   依次调用eat方法,代码的冗余性较大
			//可以构建一个method方法,需要时调用此方法即可
			//使用多态的思想
			animal a1 = new bird();
			animal a2 = new bird();
			animal a3 = new cat();
			animal a4 = new cat();
			method(a1);
			method(a2);
			method(a3);
			method(a4);

			//bird b1 = new bird();
			//bird b2 = new bird();
			//bird b3 = new bird();
			//b1.eat();
			//b2.eat();
			//b3.eat();
			//method(b1);
			//method(b2);
			//method(b3);			
		}	
	public static void method(animal a){
		a.eat();
	}
}

在这里插入图片描述

  • 多态在程序中的体现:父类的引用或者接口的引用指向了子类的对象
  • 好处:多态提高了代码的拓展性
  • 弊端:不能使用子类的特有方法,只能使用子类的共有方法
  • 多态的前提
    • 必须有关系,继承或者实现。
    • 通常有覆盖。

向上向下转型

//父类
abstract class Animal{
	abstract void eat();
}
//dog类
class Dog extends Animal{
	void eat() {
		System.out.println("骨头");
	}
	void lookhome() {
		System.out.println("lookhome");
	}
}
//cat类
class Cat extends Animal{
	void eat() {
		System.out.println("鱼");
	}
	void catchmouse() {
		System.out.println("catchmmouse");
	}
}

public class Poly {
	public static void main(String args[]) {
		//向上转型,调用dog中的eat方法
		//Dog d = new Dog();
		//d.eat();
		Animal a = new Dog();
		a.eat();
		//向下转型
		//可以在使用向上转型后将对象向下转型,这样可以不用再实例化一个对象
		Dog d = (Dog)a;
		d.lookhome();
	}
}

向上转型好处及弊端

  • 好处是隐藏了子类型,提高了代码的扩展性。
  • 弊端是只能使用父类中的功能,不能使用子类中的特有功能,功能被限定了。
  • 如果不需要面对子类型,通过提高扩展性或者使用父类的功能即可完成操作,就使用向上转型。

向下转型好处及弊端

  • 好处是可以使用子类的特有功能
  • 弊端是面向具体的子类型,向下转型有风险。容易发生ClassCastException,即转换类型和对象类型不匹配就会发生
		//Cat中没有lookhome方法,Cat类型和Dog类型不匹配,但编译可以通过
		Animal a = new Cat();//ClassCastException
		Dog d = (Dog)a;
		d.lookhome();

在这里插入图片描述

  • 想要确定安全,需要进行判断,判断一个对象是否匹配某一个类型
  • 使用关键字instanceof 即 对象 instanceof 类型
		Animal a = new Cat();//ClassCastException
		//判断对象是否匹配类型
		if(!(a instanceof Dog))
			throw new ClassCastException(a.getClass().getName()+"类型不匹配");
		//向下转型
		//可以在使用向上转型后将对象向下转型,这样可以不用再实例化一个对象
		Dog d = (Dog)a;
		d.lookhome();

在这里插入图片描述

  • 当需要用到子类型的特有方法时使用向下转型,但一定要判断
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值