分派发生在编译期和运行期,编译期的分派为静态分派,运行期的为动态分派。

编译期是根据对象声明的类型来选择方法,运行期是根据对象实际类型来选择方法。

术语: 宗量(JVM虚拟机) , 什么是宗量, 方法调用者和方法参数被称为宗量.(后面理解分派需要)

静态类型: 一个对象在声明时的类型称为静态类型,静态类型再编译器编译时可知. 如 Animal a = new Dog(), 静态类型为Animal, 实际类型为Dog.

Java 静态分派(方法重载)

public class Test{//hi 方法重载public void hi(Father f , Father f1){System.out.println("ff");}public void hi(Father f , Son s){System.out.println("fs");}public void hi(Son s , Son s2){System.out.println("ss");}public void hi(Son s , Father f){System.out.println("sf");}public static void main(String[] rags){Father f = new Father();Father s = new Son();Test t = new Test();t.hi(f , new Father());t.hi(f , s);t.dost(s, f);}
}
class Father {}
class Son extends Father{}

执行结果没有像预期的那样输出 ff、fs、sf而是输出了三个 ff.

此处对于对象声明时,静态类型为Father, 所以在编译期间,编译器会根据参数的静态类型选择要执行的方法,此时已经确定要执行的方法,所以在运行时调用的方法为ff输出的方法.这就是静态分派.

Java 动态分派(方法重写)

public class Test{public static void main(String[] rags){Father f = new Father();Father s = new Son();System.out.println("f.i " +f.i);System.out.println("s.i " +s.i);f.hi();s.hi();}
}class Father {int i = 0 ;public void hi(){System.out.println("WelcomeFather!");}}class Son extends Father{int i = 9 ;public void hi(){System.out.println("WelcomeSon!");}}

运行结果:f.i 0 s.i 0 WeclomeFather! WeclomeSon!

变量f,s在编译器静态类型为Father,所以i来自于father, 在运行期间,JVM会根据实际类型来调用方法,s的实际类型为Son,所以调用的方法是Son重写的hi方法. 根据实际类型的方法调用为动态分派.

单分派&多分派

单分派和多分派取决于宗量,  方法调用者和方法参数都是宗量.

Java中静态分派的方法调用,首先确定调用者的静态类型是什么,然后根据要调用的方法参数的静态类型(声明类型)确定所有重载方法中要调用哪一个, 需要根据这两个宗量来编译, 所以是静态多分派(多个宗量确定).

Java中动态分派的方法调用,在运行期间,虚拟机会根据调用者的实际类型调用对应的方法, 只需根据这一个宗量就可以确定要调用的方法,所以是动态单分派(一个宗量)

以上是个人对于Java分派的理解, 如有偏差,请别打脸.

Java 静态多分派动态单分派相关推荐

  1. Java静态多态和动态多态

    方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩 ...

  2. 64.多态性实现机制—静态分派与动态分派(方法解析、静态分派、动态分派、单分派和多分派)

    64.多态性实现机制-静态分派与动态分派 64.1.方法解析 64.2.静态分派 64.3.动态分派 64.4.单分派和多分派 64.多态性实现机制--静态分派与动态分派 64.1.方法解析 Clas ...

  3. java静态代理与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...

  4. java静态代理与动态代理简单分析

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

  5. Java静态代理、动态代理与CGLib代理

    java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...

  6. Java静态代理、动态代理以及CGLIB动态代理

    代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用.对于java的代理模式,一般可分为:静态代理.动态代理.以及CGLIB实现动态代理. 对于上述三种代理模式,分别进行说明. ...

  7. JAVA静态代理和动态代理理解

    这篇文章是,是我看到的将代理讲的即深入透彻又浅显易懂.转载自:https://blog.csdn.net/briblue/article/details/73928350 代理 代理是英文 Proxy ...

  8. JAVA静态代理和动态代理的区别?

    代理简述 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 他们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客可以直接从厂家购买产品 ...

  9. JAVA静态代理与动态代理(JDK和CGLIB)

    代理就是有一些工作你不屑于自己做的,或者不方便自己做的,这个时候你就请别人帮你做,拿我最喜欢的偶像坤坤做例子,他开演唱会肯定不会自己收门票,不会自己清场打扫卫生,所以就需要代理来代替他完成一整场演唱会 ...

最新文章

  1. 机器学习预测地震的未来
  2. 婚姻是唯一没有领导者的联盟
  3. 德国精品软件 Steganos Safe 数据加密软件
  4. jQuery面向对象写法规定写法样式规定
  5. Android Handler.removeCallbacksAndMessages(null)的作用
  6. 随笔② Java中的关键字 --- final关键字
  7. java 解析日期格式_日期/时间格式/解析,Java 8样式
  8. jsp页面获取系统的日期时间
  9. 使用HTML5创建和播放声音
  10. random number in groovy
  11. 搭建Cocos2d-js开发环境(Window)
  12. 浙江计算机二级c语言考试,浙江计算机二级考试(C语言)上机试题
  13. MFQPPDCS测试理论(海盗派测试分析)
  14. 报表热切换是什么意思?如何做到?
  15. win10清理_小学生都会:win10设置自动清理缓存和垃圾文件
  16. 什么牌子的蓝牙耳机性价比高质量好?高性价比降噪蓝牙耳机推荐
  17. 【前端笔记】Ant Design Form组件 resetFields() 与 setFieldsValue() 之比较
  18. uni-app 中英文切换
  19. 这,才是有本事的男人
  20. cmd查看历史操作命令

热门文章

  1. 教你玩转安卓Android手机50招秘籍
  2. jenkins集成tapd插件
  3. 【图像隐藏】基于DCT和FFT数字水印嵌入+攻击+提取含Matlab源码
  4. 机器学习-预测-线性系统的预测(最小二乘法、正规方程式实现)
  5. SIM800C英文短信收发调试记录
  6. Centos7安装elasticsearch5 一
  7. 一个由“大头儿子带小头儿子吃饭”引发的血案
  8. 乔布斯传记电影暂定名为《灵光乍现》
  9. 微信内 H5 页面自定义分享
  10. 数学符号π (Pi)、Σ(Capital Sigma)、μ (Mu) 、σ(sigma)、∏(capital pi), ∫(Integral Symbol)的来历...