Java面向对象(4) ——多态

多态的概念

多态是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。比如:猫吃鱼、狗吃肉、人吃米饭。

多态存在的三个必要条件:

  • 需要存在继承(extends)或实现(接口)关系
  • 同样的方法调用而执行不同操作、运行不用代码(重写)
  • 在运行时父类或者接口的引用变量可以引用其子类的对象

多态的作用:

  • 多态通过分类做什么(eat)和怎么做(猫和狗eat不一样),从一个角度将接口和实现进行分离
  • 多态消除了类型之间的耦合关系
  • 多态的存在提高了程序的拓展性和后期的可维护性

例子:(直接点击运行提示缺少cat类,右击run as运行成功 why?)

//或者:abstract class Animal
class Animal
{
	String name;
	public void eat();//或者:abstract public void eat();	
}

class Dog extends Animal
{
	
	public void eat(){//区分重写和重载
		System.out.println("狗啃骨头");
	}

}


class Cat extends Animal
{
	
	public void eat(){
		System.out.println("猫吃鱼");
	}
}

public class Test {
	public static void main(String[] args){
		
		Animal an1 = new Dog();//在运行时父类或者接口的引用变量可以引用其子类的对象
		Animal an2 = new Cat();//属于下面讲的向上转型 子类向父类转	 
		
		an1.eat();
		an2.eat();
		
	}
}

对象上下转型

  • 由子类转型成父类,在继承图上是向上移动的,一般称为向上转型

  • 向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集

  • 向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法

  • 与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)

例子:

//或者:abstract class Animal
class Animal
{
	String name;
	public void eat();//或者:abstract public void eat();	
}

class Dog extends Animal
{
	
	public void eat(){//区分重写和重载
		System.out.println("狗啃骨头");
	}

}


class Cat extends Animal
{
	
	public void eat(){
		System.out.println("猫吃鱼");
	}
	public void sleep(){
		System.out.println("猫睡觉");
	}
}

public class Test {
	public static void main(String[] args){
		
		Animal an1 = new Dog();
		Animal an2 = new Cat();
		
		an1.eat();
		
		//an2.sleep();  向上转型丢失方法
		Cat cat1 = new Cat();//这样就不会丢失方法
		cat1.sleep();
		
		if(an1 instanceof Cat){ //instanceof通过返回值(布尔值)指出对象是否是特定类或是它的一个子类
			System.out.println("aa");
		}
		if(an2 instanceof Cat){
			System.out.println("bb");
			Cat cat2 = (Cat)an2;//类型强转,类似C语言
			cat2.eat();
		}
	}
}

运行结果:

狗啃骨头
猫睡觉
bb
猫吃鱼

多态应用之打印机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行稳方能走远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值