什么是多态?
一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
多态必须满足的条件:
- 类和类之间必须要有继承关系
- 子类必须重写父类中的方法
- 父类的引用指向子类对象
多态中的成员访问特点:
- 成员变量,编译的时候看父类中是否有(木有会报错),调用的时候也调用父类中的。
- 成员方法,编译的时候看父类中是否有(木有会报错),调用的时候调用子类中重写好的方法
- 静态方法,编译的时候看父类中是否有(木有会报错),调用的时候是一直调用父类中的方法
package com.company;
public class Welcome {
public static void main(String[] args) {
Father F = new Son(); // 父类引用指向子类对象
F.eat(); // 调用子类中的 成员方法
System.out.println(F.a); // 调用的是父类中的成员变量
F.run(); // 静态方法都是调用父类中的
((Son) F).game(); // 向下转型,才能调用子类中独有的玩游戏方法
}
}
class Father {
int a = 18;
public void eat() {
System.out.println("吃饭");
}
public static void run() {
System.out.println("我是父类中的静态方法");
}
}
class Son extends Father {
int a = 20;
public void eat() {
super.eat(); // 调用父类的eat()方法,
System.out.println("吃冰激凌");
}
public void game(){
System.out.println("玩游戏");
}
public static void run() {
System.out.println("我是子类中的静态方法");
}
}
----------------------------
吃饭
吃冰激凌
18
我是父类中的静态方法
玩游戏
向上转型和向下转型
父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型!。
多态的好处和弊端
- 多态的主要优势是提高了代码的可扩展性,符合开闭原则。
- 多态的弊端,就是无法调用子类特有的功能