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】强制覆盖本地代码(与git远程仓库保持一致)
    ffmpeg CLI常用命令
    旧机改造步骤
    macbook air 2012 mid 安装 windows10 双系统遇到错误 no bootable device insert boot disk and press any key
    window、Linux 文本文件转换
    phalcon bug: model的findFirst会自动忽略一些空格
    oss2罗列所有文件
    如何让linux的history命令显示时间记录
    nginx 常用配置
    shell脚本 切换用户
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10425575.html
Copyright © 2011-2022 走看看