java方法调用中的单分派与多分派
来源:互联网 发布:餐饮如何分析营业数据 编辑:程序博客网 时间:2024/05/24 05:35
方法的接受者与方法的参数统称为方法的宗量。根据分派基于多少宗量,可以将分派分为单分派与多份派。
《深入理解java虚拟机》一书中写到,java是静态多分派动态单分派的语言,我一直没有理解,我觉得静态分派是根据方法参数的类型和顺序来决定调用哪一个重载方法。
而动态分派就是在运行期根据方法调用者的实际类型来决定调用哪一个重写的方法。这不都是单分派么?我不知道有没有读者有或者曾经有过与我相似的困惑,今天做到的一个试题让我明白了自己的想法错在哪儿。
class Base{ public void method() { System.out.println("Base"); } }class Son extends Base{ public void method() { System.out.println("Son"); } public void methodB() { System.out.println("SonB"); }}public class Test01{ public static void main(String[] args) { Base base = new Son(); base.method(); base.methodB(); }}这段代码我本以为输出会是Son SonB。但实际情况确是编译无法通过。为什么?问题出在base.methodB()这一句,我们知道多态发生的条件是,继承+方法重写+父类引用指向子类对象。base.methodB()这句话是没有发生多态行为的,因为methodB()并不是一个继承于子类并重写的方法,它是一个只存在于Son类中的方法。如果要调用methodB(),必须将base强转成son才可以。
编译期静态多分派就是指在编译期根据方法的参数的静态类型以及参数顺序和方法调用者的静态类型来选择方法。在这段代码中,base.methodB(),首先base的静态类型是Base,方法中不含参数。那么在编译器就会在常量池中寻找Base.methodB()这个符号引用,但是找不到啊,因为Base类中根本就没有methodB()这个方法。所以就会出现编译不通过的现象。所以静态多分派。
阅读全文
0 0
- java方法调用中的单分派与多分派
- Java中的静态单多分派与动态单分派
- java方法调用之单分派与多分派(二)
- java中的方法调用-解析与分派
- Java语言静态多分派 与 动态单分派
- 单分派、多分派
- 单分派、多分派
- JVM方法分派:静态多分派、动态单分派
- java--动态单分派,静态多分派
- Java中的方法分派
- Java中的静态分派与动态分派
- java中的静态分派与动态分派
- 单分派和多分派
- java单分派与多分派(多路分发和单路分发)
- java单分派与多分派(多路分发和单路分发)
- 深入java虚拟机读书笔记——类加载与方法调用中的分派机制
- Java中的静态多分派和动态多分派
- JAVA虚拟机中的方法分派,内联,与解析
- Class类与反射
- Redis Scan的使用方式以及Spring redis的坑
- com.alibaba.druid.sql.parser.ParserException: syntax error,expect IS, actual EQ id
- php基于laravel框架的批量插入操作
- 作业10.17
- java方法调用中的单分派与多分派
- java定时任务Timer,Quartz
- flush privileges提示Table 'mysql.servers' doesn't exist解决办法
- kurento 6.6.0 安装部署 + 运行官网demo
- html布局
- 【杨辉三角】
- 纯CSS写的加载动画--圆球搜索加载动画
- 2017-10-15练习题
- Android RxActivityResult:优雅的方式实现startActivityForResult