字面意思:多态就是多种形态
程序中的多态:父类引用指向子类对象
同一个引用类型,使用不同的实例而执行不同的操作
同一种操作,由于条件不同,产生结果不同
例如:(1) 在王者游戏里面不论是“李白”、“鲁班”、“安琪拉”都是属于王者里的英雄角色
(2)再比如游戏里面的职业坦克、刺客、法师我们可以把它都归纳成职业,每个职业角色都需要装备属性的加成,所以我们可以把所有的装备统一为商店,但是每个英雄职业角色的推荐装备栏都是不相同的,所以每个英雄职业角色都会有自己特有的商店推荐装备栏。
多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能,这样就实现了代码的统一。
多态的优势: 可替换性、可扩充性、灵活性、 简化性
二、如何实现多态
实现多态三要素
- 继承关系的父子关系
- 子类重写父类放法
- 父类的引用指向子类的对象
代码如下(示例)
class Shape {
void draw() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
}
多态的类型
- 向上转s型—— ——子类到父类的转型:自动类型转换
- 向下转型 —— ——父类到子类的转换:强制类型转换
三、向上转型:子类到父类的转换
就是将一个父类的引用指向一个子类对象
<父类型><引用变量名> = new <子类型>();
代码如下(示例):
public class ExdentShang {
public void Student(){
System.out.println("School Student..");
}
static class Person extends ExdentShang{
public void Student(){
System.out.println("Dream Student");
}
public void play(){
System.out.println("Play..");
}
}
public static void main(String[] args) {
ExdentShang x = new Person();//向上转型
x.Student();
//x.play();//报错没有此方法
Person p = new Person();
p.Student();
}
/*运行结果是:Dream Student
Dream Student
*/
}
说明:
- 系统会自动进行类型转换
- 通过父类引用变量调用的方法是子类覆盖或继承的子类方法,不是父类的放法
- 通过父类应用变量无法调用子类特有的方法
四、向下转换:父类到子类的转换
将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型
向下转型必须进行强制转换
向下转型后,父类才可调用子类特有属性
<子类型><引用变量名>=(<子类型>)<父类型>;
代码如下(示例):
public class ExdentShang {
public void Student(){
System.out.println("School Student..");
}
public void time(){
System.out.println("time.......");
}
static class Person extends ExdentShang{
public void Student(){
System.out.println("Dream Student");
}
public void play(){
System.out.println("Play..");
}
}
public static void main(String[] args) {
ExdentShang x = new Person();//向上转型
x.Student();
//x.play();//报错没有此方法
Person p = (Person)x ; //向下转型
p.Student();
p.time();
}
/*运行结果
Dream Student
Dream Student
time.......
*/
}
五、instanceof运算符:运算结果true|false
进行类型判断,判断一个对象是否属于一个类或者实现了一个接口
作用:避免不必要的类型转换错误,提高代码健壮性
应用场合:向下转型之前,先使用instanceof进行判断
对象 instanceof 类|接口
注意:instanceof后的“类|接口”必须是在其前方的对象的继承树上,具有上下级关系
代码如下(示例):
public class ExdentShang {
public void Student() {
System.out.println("School Student..");
}
public void time() {
System.out.println("time.......");
}
}
class Person extends ExdentShang {
public void Student() {
System.out.println("Dream Student");
}
public void play() {
System.out.println("Play..");
}
class They extends Person{
public void Sum(){
System.out.println("判断They和ExdentShang");
}
}
public static void main(String[] args) {
ExdentShang x = new Person();//向上转型
Person p = (Person)x ; //向下转型
//Object>ExdentShang>Person
//Object>Person>They
//instanceof关键字可以判断左边对象是否是右边类或者子类的一个实例
System.out.println(p instanceof Person);//true
System.out.println(p instanceof ExdentShang);//true
System.out.println(x instanceof They); //false
System.out.println(p instanceof Object);//true
}