文章目录
- 多态概述
- 多态的实现
- 多态的特点
- 多态的转型
- 重写
- 什么是重写
- 重写示例
- 重载和重写的区别
面向对象三大特性:封装、继承、多态。
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。封装和继承都已经介绍过了,本文将介绍Java多态。
多态概述
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。
对于面向对象而已,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。
多态的实现
Java实现多态有三个必要条件:继承、重写、向上转型。
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
多态的特点
多态成员变量:编译运行看左边
Parent p = new Son();
System.out.println(p.num);//f是Fu中的值,只能取到父中的值
2.多态成员方法:编译看左边,运行看右边
Parent p1=new Son();
System.out.println(p1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
3.instanceof关键字
作用:用来判断某个对象是否属于某种数据类型。【返回布尔值】
使用案例:
Parent p1=new Son1();
Parent p2=new Son2();
if(p1 instanceof Son1){
System.out.println("p1是Son1的类型");
}
else {
System.out.println("p1是Son2的类型");
}
多态的转型
多态的转型分为向上转型和向下转型两种
- 向上转型:多态本身就是向上转型过的过程
- 使用格式:父类类型 变量名=new 子类类型();
- 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
- 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
- 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
- 适用场景:当要使用子类特有功能时。
重写
什么是重写
在子类之中有可能定义和父类完全相同的方法或属性的名称,这个时候就称为重写
重写示例
class Parent {
public void print() {
System.out.println("我是父类");
}
}
class Son extends Parent {
public void print() { // 方法名称、参数类型及个数、返回值全相同
System.out.println("我是子类");
}
}
public class Test {
public static void main(String args[]) {
Son son = new Son();
son.print(); // 继承父类并重写的方法
}
}
/*
执行结果
我是子类
*/
当一个类中的方法被重写后,如果实例化的是这个子类对象,则调用的方法就是被重写过的方法。
在进行方法重写的时候有一点需要注意:被子类所重写的方法不能拥有比父类更严格的访问控制权限。如果此时父类之中的方法是default权限,那么子类重写的时候只能是default或public权限,而如果父类的方法是public,那么子类之中方法的访问权限只能是public。