定义:
多态性是指统一的接口,不同的表现形式。
多态的体现
父类或者接口的引用指向或者接收自己的子类对象。
父类的引用也可以接收自己的对象
多态的前提
必须是类与类之间有关系,要么继承或实现
通常还有一个前提,存在覆盖
多态的好处
多态的出现大大的提高了程序的扩展性
多态的弊端
只能使用父类的引用访问父类的成员
对象类型的装换
和基本数据类型之间的强制类型转换(向下转型)一样,存在继承关系的父类对象和子类对象之间可以相互转换(即引用类型的转换),并遵守以下原则:
1).子类对象可以被视为其父类的一个对象。
2).父类对象不能被当作是某一个子类的对象
运行时多态的三原则
1.对象不变;(改变的是主观认识)
2.父类类型的子类对象 不能访问子类中特有方法 ,如果想访问子类中特有方法必须将父类类型再强制转换为子类类型。例如: cat cat = (cat)cat;
3.父类类型的子类对象实际调用子类覆盖后的方法。
实例
在我们下面的例子中,有5个类。
Game类是Football、Basketball、Popolong的父类,Games类使用前面4个类。
Java根据动态绑定决定执行“更具体”的方法,即子类方法。
实例
在我们下面的例子中,有5个类。
Game类是Football、Basketball、Popolong的父类,Games类使用前面4个类。
Java根据动态绑定决定执行“更具体”的方法,即子类方法。
//Game.java
package cn.edu.uibe.oop;
public class Game {
protected void play(){
System.out.println("play game");
}
}
//Football.java
package cn.edu.uibe.oop;
public class Football extends Game {
protected void play() {
System.out.println("play football");
super.play();
}
void f(){
play();
}
}
//Basketball.java
package cn.edu.uibe.oop;
public class Basketball extends Game{
protected void play() {
System.out.println("play basketball");
}
}
//Popolong.java
package cn.edu.uibe.oop;
public class Popolong extends Game {
protected void play() {
System.out.println("play popolong");
}
}
//Games.java
package cn.edu.uibe.oop;
public class Games {
public static void main(String[] args) {
Game[] games = new Game[10];
games[0] = new Basketball();
games[1] = new Football();
games[2] = new Popolong();
for(int i=0;i<games.length;i++){
if(games[i]!=null)
games[i].play();
}
}
}