zoukankan      html  css  js  c++  java
  • Java中的多态

    一、总结

    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();
            }
        }
    }
  • 相关阅读:
    把git项目放到个人服务器上
    关于fcitx无法切换输入法的问题解决
    博客变迁通知
    (欧拉回路 并查集 别犯傻逼的错了) 7:欧拉回路 OpenJudge 数据结构与算法MOOC / 第七章 图 练习题(Excercise for chapter7 graphs)
    (并查集) HDU 1856 More is better
    (并查集 不太会) HDU 1272 小希的迷宫
    (并查集 注意别再犯傻逼的错了) HDU 1213 How Many Tables
    (最小生成树 Kruskal算法) 51nod 1212 无向图最小生成树
    (并查集) HDU 1232 畅通工程
    (最小生成树 Prim) HDU 1233 还是畅通工程
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10425575.html
Copyright © 2011-2022 走看看