Skip to main content
 首页 » 编程设计

Java中的多态

2022年07月19日29powertoolsteam

一、总结

1.多态:当子类对象赋值给父类对象后,通过父类对象调用成员方法,恰好子类重写了这个成员方法,此时通过父类调用到的是子类的成员方法(若没重写则是继承父类的方法)。

2.向上转换的时候(Father的对象=Son的对象)不需要加强制类型转换,也就是说子类对象可以直接赋值给父类对象。
但是父类对象不能直接赋值给子类对象,向下转换(Son的对象=Father的对象)的时候就需要加强制类型转换,并且前提是Father对象来源于Son对象,也即是如下关系。当有多个子对象时需要借助instanceof来判断实例来源于哪个类。
  Father f = new Son();
  Son s = (Son)f; /*约等效于:Son s = new Son()*/

3.instanceof关键字:用来判断一个对象是不是某个类的实例。
注意:所有的子类的对象都可以认为是父类的实例。所有的子类对象在判断 (子类对象实例 instanceof 父类类型) 的时候都是为真的。

4.Object类是所有类的父类,它可以做左值接收任何对象,但是不一定能表现出多态,因为Object中可能根本没有实现你要多态的函数。

5.当你重写一个继承来的成员方法时,访问权限不能更weaker(eg:把继承来的protected方法变为private), 但是可以更Stronger,例如把protected方法重写为public方法。

二、试验Demo

/*Cnv4.java: Test Father=Son*/ 
 
class Father { 
    private int money;     
 
    public int getMoney() {return money; } 
    public void setMoney(int money) {this.money = money; } 
 
    public void printInfo() {System.out.println("This is Father");} 
} 
 
class Son extends Father{ 
    public void printInfo() {System.out.println("This is son");} 
    public void playGame() {System.out.println("playGame ...");}  
} 
 
class Daughter extends Father{ 
    public void printInfo() {System.out.println("This is daughter");} 
} 
 
public class Cnv4 { 
    public static void main (String args[]) { 
        Father f = new Father(); 
        Son s = new Son(); 
        Daughter d = new Daughter(); 
 
        print(f); 
        print(s); 
        print(d); 
    } 
 
    public static void print(Father f) { 
        f.printInfo(); 
    } 
}
/*Cnv5.java: Test Son=Father in printAction()*/ 
 
class Father { 
    private int money;     
 
    public int getMoney() {return money; } 
    public void setMoney(int money) {this.money = money; } 
 
    public void printInfo() {System.out.println("This is Father");} 
    public void drink() {System.out.println("drink ...");} 
} 
 
class Son extends Father{ 
    public void printInfo() {System.out.println("This is son");} 
    public void playGame() {System.out.println("playGame ...");}    
} 
 
class Daughter extends Father{ 
    public void printInfo() {System.out.println("This is daughter");} 
    public void dance() {System.out.println("dance ...");} 
} 
 
public class Cnv5 { 
    public static void main (String args[]) { 
        Father f = new Father(); 
        Son s = new Son(); 
        Daughter d = new Daughter(); 
 
        printAction(f); 
        printAction(s); 
        printAction(d); 
 
        printAction_2(f); 
        printAction_2(s); 
        printAction_2(d); 
    } 
 
    public static void printAction(Father f) {  /*Son --> Father --> Son*/ 
        if (f instanceof Son) { 
            Son son = (Son)f; 
            son.playGame(); 
        } 
        else if (f instanceof Daughter) { 
            Daughter d = (Daughter)f; 
            d.dance(); 
        } 
        else if (f instanceof Father) { 
            f.drink(); 
        }     
    } 
 
    public static void printAction_2(Father f) {  /*Son --> Father --> Son*/ 
        if (f instanceof Father) { 
            f.drink(); 
        }     
        else if (f instanceof Son) { 
            Son son = (Son)f; 
            son.playGame(); 
        } 
        else if (f instanceof Daughter) { 
            Daughter d = (Daughter)f; 
            d.dance(); 
        } 
    } 
}

本文参考链接:https://www.cnblogs.com/hellokitty2/p/10425575.html