文章目录
- 1. 概念
- 2. 对象的多态
- 2.1. 一
- 2.2. 二
- 3. 虚拟方法的调用
- 4. 总结
1. 概念
- 多态性,是面向对象中最重要的概念,在 java 中有两种体现:
(1)方法的重载 (overload) 和重写 (overwrite) 。
重载:本类中的同名方法,体现相同的名称方法实现不同的逻辑
重写:子类对父类方法的覆盖,子类可以使用和父类相同的方法名,覆盖掉父类的逻辑;对于父类的方法,子类想修改逻辑,但是有别的代码在调用父类的方法,可以考虑用子类继承父类,重写父类的方法。
(2)对象的多态性 ——可以直接应用在抽象类和接口上。(后面再讲)
Java 引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。若编译时类型和运行时类型不一致,就出现多态( Polymorphism ),这是对象的多态。
2. 对象的多态
2.1. 一
- 在 Java 中 , 子类的对象可以替代父类的对象使用
(1)一个变量只能有一种确定的数据类型
(2)一个引用类型变量可能指向 ( 引用 ) 多种不同类型的对象,例子如下:
Person p = new Person();
Person e = new Student(); // Person 类型的变量 e指向 Student 类型的对象
代码示例:
package day07;
public class Student extends Person {
String school;
public static void main(String[] args) {
// Person p = new Person();
// Student s = new Student();
//-----------以上是正常的情况-----------------------------
Person e = new Student();//父类的引用对象可以指向子类的实例
Person p = new Person();
p = new Student();
//问题:当前这个引用对象p引用的是哪个实例对象?
}
}
答案:
结论:子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型 (u
pcasting):把子类的对象可以给父类类型的变量引用 。
2.2. 二
- 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
解释:属性是在编译时确定的,编译时 e 为 Person 类型,没有 school 成员变量,因而编译错误。
3. 虚拟方法的调用
package day07;
public class Student extends Person {
String school;
@Override
public void showInfo() {
System.out.println("以下是student类对Person类的showInfo方法的重写");
System.out.println(this.age);
System.out.println(this.name);
System.out.println(this.sex);
}
public static void main(String[] args) {
System.out.println("---------Student类正常调用------------");
Student s = new Student();
s.showInfo();
System.out.println("----------Person类正常调用-----------");
Person p = new Person();
p.showInfo();
System.out.println("----------虚拟方法调用(多态情况下)-----------");
Person e = new Student();
e.showInfo();//(父类)Person调用(子类)Stduent的getInfo()方法
//问题:在目前情况下,e.showInfo()会调用Person类的showInfo()还是Student的showInfo()?
}
}
运行结果:
结论:编译时 e 为 Person 类型,而方法的调用是在运行时确定的,所以调用的是 Student类的 getInfo() 方法——动态绑定。