java 静态分派_[读书笔记]Java之静态分派

以下内容来自周志明的《深入理解Java虚拟机》。

静态分派和重载有关。

先看代码:

public static voidmain(String[] args) {

SuperClass sc= newSubClass();

SuperClass superClass= newSuperClass();

test(sc);

test(superClass);

test((SubClass)sc);

}public static voidtest(SuperClass sc) {

System.out.println("父类");

}public static voidtest(SubClass sc) {

System.out.println("子类");

}public classSuperClass {}public class SubClass extendsSuperClass {

}

//输出

父类

父类

子类

上面SuperClass称为静态类型,后面的SubClass叫做实际类型,静态类型和实际类型在程序中都可以发生一些变化,区别是静态类型的变化仅仅在使用时发生,变量本身的静态类型不会被改变,并且最终的静态类型是在编译期可知的;而实际类型变化的结果在运行期才可确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么。编译器在重载时通过参数的静态类型而不是实际类型作为判定依据的,在编译阶段,编译器会根据参数的静态类型决定使用哪个重载版本。

所有依赖静态类型来定位方法执行版本的分派称为静态分派,静态分派的典型是方法重载。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的。另外,编译器虽然能确定出方法的重载版本,但在很多情况下这个重载版本并不是“唯一的”,往往只能确定一个“更加合适的”版本。当重载参数并没有正对应的类型的时候,可能会发生装箱操作后再重新选择“更加合适的”版本。

而动态分配和override有关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值