zoukankan      html  css  js  c++  java
  • 多态的动态绑定


    1.多态中的成员变量

    /**
     * 多态 动态绑定
     * 
     * @author wql
     *
     */
    class Fu {
        int num = 3;
    }
    
    class Zi extends Fu {
        int num = 4;    //这里并不是覆盖,变量不存在覆盖
    }
    
    public class Demo {
        public static void main(String[] args) {
            Fu f = new Zi();    //向上转型
            System.out.println(f.num);
        }
    }
    

    运行结果
    3

    这里写图片描述
    在多态中的成员变量:
    编译时:参考引用变量所属的类中是否有调用的成员变量,若有、编译成功,若无、编译失败(父类不可以调用子类特有的成员变量)
    运行时:参考引用变量所属的类中是否有调用的成员变量,并运行该所属类中的成员变量
    简单说:编译和运行都参考等号左边


    2.多态中的成员函数

    class Fu {
        void show(){
            System.out.println("fu...show");
        }
    }
    
    class Zi extends Fu {
        void show(){
            System.out.println("zi...show");
        }
    }
    
    public class Demo {
        public static void main(String[] args) {
            Fu f = new Zi();    //向上转型
            f.show();
            //此时父类带有的引用地址是子类对象在堆中的地址,当其调用函数方法时,会优先考虑子类对象中的,这就是动态绑定
        }
    }

    运行结果
    zi…show

    在多态中的成员函数:
    编译时:参考引用变量所属的类中是否有调用的函数,若有、编译成功,若无、编译失败(父类不可以调用子类特有的函数方法)
    运行时:参考对象所属的类中是否有调用的成员函数,若有、并运行该成员函数,若无,则通过super();去调用父类中该成员函数
    简单说:编译参考等号左边,运行都参考等号右边


    3.

    class Fu {
        static void show(){
            System.out.println("fu..static..show");
        }
    }
    
    class Zi extends Fu {
        static void show(){
            System.out.println("zi..static..show");
        }
    }
    
    public class Demo2 {
        public static void main(String[] args) {
            Fu f = new Zi();    //向上转型
            //静态函数方法有些特殊,其实静态函数并不需要对象来调用,直接用类名调用即可,因为它并不存在于内存的堆中,是在内存的方法区中,当多态子类去调用时,会优先考虑父类
            f.show();
        }
    }

    运行结果
    fu..static..show

    在多态中的静态方法:
    编译时:参考引用变量所属的类中是否有调用的静态方法,若有、编译成功,若无、编译失败(父类不可以调用子类特有的静态方法)
    运行时:参考引用变量所属的类中是否有调用的静态方法,并运行该方法
    简单说:编译运行都参考等号左边


    之前转载过别人写的类似文章(http://blog.csdn.net/qq_36330228/article/details/76695401),随着学习觉得自己也有些理解,便在此分享下,不足之处,望指出,一起交流

  • 相关阅读:
    从 java 代码到 android 进程的详细过程
    c++ 智能指针
    linux 进程间共享内存示例
    visual studio 在windows远程调试 linux 程序 cout 输出乱码
    wcf restful 访问报错 *.svc HTTP error 404.17
    c++ 创建 uuid guid
    c++ 事件回调 java
    java通过jna调用so
    java执行jar包
    java调用com组件com4j
  • 原文地址:https://www.cnblogs.com/wangqilong/p/8279804.html
Copyright © 2011-2022 走看看