关于Java中的静态分配与动态分配

关于Java中的静态分配与动态分配


前言

    最近在不断学习的JAVA的过程中,看到了静态分配与动态分配这两个名词,只知其名,不知其义,于是上网查阅了资料,看到了几篇优秀的文章,对静态分配与动态分配有了一定的了解.


参考文章
参考文章

主题


在理解动态绑定和静态绑定之前必须先理解虚方法和非虚方法。


虚方法和非虚方法


  1. 虚方法:非私有的实例方法等。
  2. 非虚方法:只要能被invokestatic和invokespecial指令调用的方法,都可以在解析阶段中确定唯一的调用版本,符合这个条件的有静态方法(static)、私有方法(private)、实例构造器、 final方法,它们在类加载的时候就会把符号引用解析为该方法的直接引用。这些方法可以称为非虚方法。

    动态分配和静态分配是Java多态实现的原理,对于静态分配(Static Dispatch)典型的应用方法就是方法重载(overload),而动态分配(Dynamic Dispatch)典型的应用方法就是方法的重写了

静态分配

    含义:在编译期间进行方法的选择,通常以方法名称,方法接收者和方法参数的静态类型来作为方法选择的依据。这些可以静态分派的方法一般都具有“签名唯一性”的特点(签名只考虑参数的静态类型而不管参数的实际类型),即不会出现相同签名的方法,因此可以在编译期就实现方法确定。Java中的非虚方法(主要包括静态方法,私有方法,final方法等,这些方法一般不可重写,故而不会有相同签名的情况出现)通常仅需要静态分派就可以实现方法的最终确定,更特别一点的例子是静态方法的隐藏,也是利用了静态分派,后面会专门讲解。虚方法的重载在编译时也用到了静态分派(尽管虚方法的调用在运行时还会涉及动态分派)。

void test() {
        Father father = new Son();          //静态分派
        print(father);   //this is father
    }

    void print(Father father) {
        System.out.println("this is father");
    }

    void print(Son son) {
        System.out.println("this is son");
    }

动态分配

    动态分派的典型应用是方法重写override动态分派是指方法的确定在run-time才能最终完成。使用动态分派来实现方法确定的方法一般在编译期间都是一些“不明确”的方法(比如一些重写方法,拥有相同的方法签名并且方法接收者的静态类型可能也相同),因此只能在运行时期根据方法接收者和方法参数的实际类型最终实现方法确定。Java中的虚方法(主要指实例方法) 通常需要在运行期采用动态分派来实现方法确定(利用invokevirtual指令获取方法接收者的实际类型)。

void test() {
        Father father = new Son();          //静态分派
        father.name();      //动态分派   输出son
    }

    class Son extends Father {
        void name(){
            System.out.println("son");
        }
    }

    class Father {
        void name(){
            System.out.println("father");
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值