多态的基本概念
面向对象程序设计的三大特征:
封装性、继承性、多态性。
因为类与类之间的继承,出现了类的上下层次关系,这种关系的产生就是多态性出现的前提。
多态实现的三个必要条件:继承、方法重写、父类引用指向子类对象。
即,当一个父类被引用指向一个子类对象后,再调用子类中重写的方法,这时多态就出现了。
多态的主要用法
public class demo {
public static void main(String[] args) {
People peo = new People();
peo.eat();
People student = new Student();//向上转型
student.eat();
Student stu = (Student) student;
stu.study();//向下转型 打印子类特有方法
People tea = new Teacher();
tea.eat();
Teacher t=(Teacher)tea;
//t.eat();
t.teach();
}
}
class People{
public void eat(){
System.out.println("人不能不吃饭");
}
}
class Student extends People{
@Override
public void eat(){
System.out.println("买饭吃");
}
public void study(){
System.out.println("咱来一把");
}
}
class Teacher extends People{
@Override
public void eat(){
System.out.println("做饭吃");
}
public void teach(){
System.out.println("开始上课");
}
}
以上的样例创造了一个一个People类,以及Student和Teacher两个子类,其中eat方法是三个类中共有的,而这两个子类分别对这个方法进行了重写(@Override),使得eat方法在三个类中呈现出不同的效果,这就是程序的多态性。
多态的注意事项
动态绑定(dynamic binding)
方法可以在沿着继承链的多个类中实现,子类可以重写父类的方法。JVM决定运行时调用哪个方法。
即,如果程序需要调用方法p,虚拟机在运行时会从最亲近的类中寻找目标方法p,然后调用首先找到的实现。
向上转型和向下转型
向上转型:
本质 | 父类的引用指向了子类的对象 |
---|---|
语法 | 父类类型 引用名 = new 子类类型(); |
特点 | 1、编译类型看左边,运行类型看右边 2、可以调用父类中的所有成员(需要遵守访问权限)3、不能调用子类中的特有成员 4、最终运行效果看子类的具体实现 |
向下转型:
语法 | 子类类型 引用名 = (子类类型); |
---|---|
特点 | 1、只能强转父类的引用,不能强转父类的对象 2、要求父类的引用必须指向的是当前目标类型的对象 3、当向下转型后,可以调用子类类型中的所有成员 |
Object类
Object类是所有类的父类,何一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类。
成员的特点
由于实现多态的前提是继承,而在面向对象程序设计中,继承被用来创建类之间的“是”关系(is a),所以应用的成员要求是父类的特殊化。
PS:
多态成员变量:编译运行看左边
多态成员方法:编译看左边,运行看右边
多态的底层思想
简单来说,多态即为父类引用变量可以指向子类对象,这思想看似简单,却是面对对象的程序设计语言最重要的语法。
因为类的多态,程序模块间的关系更为简单,程序模块的独立性,数据的安全性就有了良好的保障。类的继承与多态性可以很方便地实现代码重用,大大提高了程序的可重用性,缩短了软件开发周期,并使软件风格统一。