多态

【1】多态一定建立在继承的基础上
【2】多态形式上表现为 父类实例引用子类对象 一句话:父类引用子类(父引子),会出现多态。
【3】当父类引用子类时,通过父类调用方法一定是子类重写、实现的方法。

多态的实现

【1】编写父类
【2】编写子类,子类重写父类方法
【3】运行时,父类实例应用子类对象

【】运行时多态:父类引用子类。
【】编译时多态:就是方法重载。在编译期间,根据传递的参数决定调用那个方法。

多态的形式

【1】本质:父类对象引用子类实例

Pet pet = new Dog();

【2】父类作为方法形参实现多态

public void feed(Pet pet) {
	pet.eat();
}
	单就feed方法而言,它接受一个形式参数Pet pet,在编译期间,根本看不出来pet执行的是谁的eat方法,只有当程序运行时,实参才传递给形参,此时我们才知道pet到底是什么具体的子类,接着pet.eat()方法才能确定调用的是哪个子类重写/实现的eat,这种把在运行时才能确定调用的是具体哪个子类的方法称为运行时多态。

【3】父类作为方法返回值实现多态

public Pet adopt(int type) {
	return pet;
}

多态类型转换

自动类型转换

在多态中,子类可以自动转换成父类,也称为向上类型转换

  • 父类 父类对象 = 子类;
Dog dog = new Dog();
Pet pet = dog;
强制类型转换

在多态中,存在一种特殊的情况,当通过父类引用子类时,父类对象不能直接调用子类特有/独有的方法

如果在开发过程中,需要通过父类调用子类特有方法时,需要进行强制类型转换,也称为向下类型转换
|子类 子类对象 = (子类)父类对象 | Dog dog = (Dog)pet; |

注意:强制类型转换时,父类只能转换成其真实子类的类型。

instanceOf

用法:

对象 instanceOf 类/父类/接口

用于判断一个运行时对象是否是指定的(父)类实例,返回boolean类型。
如果是接口,判断对象是否是接口的实现类实例。

// 判断dog是否是Pet类型
System.out.println(dog instanceof Pet);

多态总结

封装:保证类信息的安全性和正确性。
继承:减少重复性代码。
多态:提高程序的可拓展性、可维护性。

多态的3个必要条件
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重写/实现,在调用这些方法时就会调用子类重写或实现方法。
向上转型(父引子):在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能执行子类的方法。

因为编译时期找的是父类,所以如果父类中没有我们调用的方法,那编译就会失败,程序就无法执行,而如果父类中有方法,但是子类没有重写,那编译会通过,且会执行父类中的方法,因为运行时它会去子类中找,找不到,再去父类中找,所以就会执行父类中的方法了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值