西红柿小生|Java基础学习-多态性

1、面向对象三特征之一:多态性1、多态性 , 是面向对象的最重要的概念 , 在Java中有两种体现:

  1. 方法的重载(overload)和重写(override)
  2. 对象的多态性 ------可以直接应用在抽象类和接口上
2、Java引用变量有两个类型:编译时的类型和运行时的类型:
  • 编译时类型由声明该变量时使用的类型决定 。
  • 运行时类型由实际赋给该变量的对象决定 。
若编译时类型和运行时类型不一致 , 就出现多态(Polymorphism)-------这个多态就是对象的多态
子类对象的实例化过程:
西红柿小生|Java基础学习-多态性2、对象的多态2.1在Java中 , 子类的对象可以替代父类的的对象使用:
  • 一个变量只能有一种确定的数据类型
  • 一个引用类型变量可能指向(引用)多种不同类型的对象
Person p = new Student();
Person e = new Student();//Person类型的变量e , 指向Student类型的对象
子类可看做是特殊的父类 , 所以父类类型的引用可以指向子类的对象:向上转型(upcasting)(把子类的对象给父类类型的变量引用)
Person p = new Person();p = new Student();问:上面代码的当前这个引用对象p引用的是哪个类实例对象?答案是:Student类实例对象
西红柿小生|Java基础学习-多态性2.2成员变量(属性)的调用:
一个引用类型变量如果声明为父类的类型 , 但实际引用的是子类对象 , 那么该变量就不能再访问子类中添加拓展的成员变量和方法
Student m = new Student();m.school = "csdn";//合法 , Student类中有school成员变量Person e = new Student();e.school = "csdn";//非法 , Person类没有school成员变量成员变量是在编译时确定的 , 编译时e为Person类型 , 没有school成员变量 , 因而编译出错 。
【西红柿小生|Java基础学习-多态性】2.3虚拟方法的调用(子类中含有父类的重写方法):
class Person{ public String name; public int age; public void showInfo(){System.out.println("以下是Person类的showInfo方法:");System.out.println(this.name);System.out.println(this.age); } public void setInfo(String name,int age) {this.name = name;this.age = age; }}class Student extends Person{ public String school; public void showInfo(){System.out.println("以下是Student类的showInfo方法:");System.out.println(this.name);System.out.println(this.age); }}正常的方法调用:
Person p = new Person();p.showInfo();Student s = new Student();s.showInfo();虚拟方法调用(多态情况下):
Person e = new Student();e.showInfo(); //调用的是Student类的showInfo()方法
西红柿小生|Java基础学习-多态性动态绑定:
方法的调用是在运行时确定的 , 编译时e为Person类型 , 但运行时e为Student类型 , 所以调用的是Student类的showInfo()方法
3、小结前提:
  • 需要存在继承或者实现关系
  • 需要覆盖操作
成员方法: