Jvm(66),方法调用----动态分派调用


package
demo.jvm.test8?

public
class
Demo4 {

/**

* 方法动态分派演示

*

*/

static
class
Human {

protected
void
sayHello() {

System.out.println("Human say hello")?

}?

}

static
class
Man extends
Human {

protected
void
sayHello() {

System.out.println("man say hello")?

}

}

static
class
Woman extends
Human {

protected
void
sayHello() {

System.out.println("woman say hello")?

}

}

public
static
void
main(String[] args) {

Human man = new
Man()?

Human woman = new
Woman()?

man.sayHello()?

woman.sayHello()?

man = new
Woman()?

man.sayHello()?

}

}

结果:


man say hello woman say hello woman say hello

package
demo.jvm.test8?

public
class
Demo4 {

/**

* 方法动态分派演示

*

*/

static
class
Human {

protected
void
sayHello() {

System.out.println("Human say hello")?

}?

}

static
class
Man extends
Human {

}

static
class
Woman extends
Human {

}

public
static
void
main(String[] args) {

Human man = new
Man()?

Human woman = new
Woman()?

man.sayHello()?

woman.sayHello()?

man = new
Woman()?

man.sayHello()?

}

}

结果:

Human say hello

Human say hello Human say hello

由于invokevirtual指令执行的第一步就是在运行期确定接收者的实际类型,所以两次调用中的invokevirtual指令把常量池中的类方法符号引用解析到了不同的直接引用上,这个过程就是Java语言中方法重写的本质。我们把这种在运行期根据实际类型确定方法执行版本的分派过程称为动态分派。

所以重载之和传入的变量有关系,重写却以子类为基准,越底层的子类权限越大。

注意这里首先动态分派调用的时候会先调用子类的方法,如果子类找不到则找父类,父类找不到则找父类的父类,如果到最后都找不到抛异常(一般情况下这种找不到的情况在编译器就会跑出来了。)

原文地址:https://www.cnblogs.com/qingruihappy/p/9691688.html

时间: 2024-07-30 03:38:39

Jvm(66),方法调用----动态分派调用的相关文章

Jvm(65),方法调用----静态分派调用

我们先来看一下下面的例子: package demo.jvm.test8? public class Demo2 { /** 方法静态分派演示 * @author zzm */ static abstract class Human { } static class Man extends Human { } static class Woman extends Human { } public void sayHello(Human guy) { System.out.println("hel

Jvm(67),方法调用----单分派与多分派

方法的接收者与方法的参数统称为方法的宗量,这个定义    早应该来源于<Java与模式>一书.根据分派基于多少种宗量,可以将分派划分为单分派和多分派两种.单分派是根据一个宗量对目标方法进行选择,多分派则是根据多于一个宗量对目标方法进行选择. 单分派和多分派的定义读起来拗口,从字面上看也比较抽象,不过对照着实例看就不难理解了.代码清单8-10中列举了一个Father和Son一起来做出"一个艰难的决定"的例子. package demo.jvm.test8? public cl

JVM 方法调用之动态分派

1. 动态分派 一个体现是重写(override).下面的代码,运行结果很明显.  1 public class App { 2      3     public static void main(String[] args) { 4         Super object = new Sub(); 5         object.f(); 6     } 7 } 8  9  class Super {10     public void f() {11         System.ou

关于JVM中方法调用的相关指令,以及解析(Resolution)和分派(Dispatch)的解释——重载的实现原理与重写的实现原理

JVM中相关方法的调用的指令 invokestatic 调用静态方法. invokespecial 用于调用构造器方法<init>.私有方法.父类方法. invokevirtual 用于调用类的所有虚方法. invokeinterface 用于调用接口方法. 解析(resolution)与分派(dispatch) 解析 解析调用一定是个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变 为可确定的直接引用,不会延迟到运行期再去完成. 下面我们看一段代码: /**

方法调用和分派

java虚拟机中提供了5种调用字节码指令,分别是 invokestatic: 调用静态方法 invokespecial:调用实例构造器<init>方法,私有方法,和父类方法. invokevirtual:调用虚方法. invokeinterfaceL调用接口方法,会在运行时再确定一个实现此接口的对象. invokedynamic:先在运行时动态解析出调用点 限定符所引用的方法,然后再执行该方法,在此之前的四条调用指令,分派逻辑是固化在java虚拟机的内部的,而invokedynamic指令的分

(三十)分派调用:静态分派和动态分派

分派调用 其实分派分为两种,即动态分派和静态分派.我们在了解分派的时候,通常把它们与重写和重载结合到一起. 重载(overload)与静态分派 我们先看一个题: public class Main { static abstract class Father { } static class Son extends Father { } static class Daughter extends Father { } public void getSex(Daughter daughter) {

struts_2_Action类中方法的动态调用

(一)直接调用方法(不推荐使用) 1)Action类: private String savePath; public String getSavePath() { return savePath; } public void setSavePath(String savePath) { this.savePath = savePath; } public String other() { savePath = "other"; return "success";

多态 这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。

多态 类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法: class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def whoAmI(self): return 'I am a Person, my name is %s' % self.name clas

动态调用动态库方法 .so

关于动态调用动态库方法说明 一.       动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输 出操作或屏幕控制等标准任务函数).可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库.库文件中的函数 可以通过连接程序与应用程序进行链接,这样就不必在每次开发程序时都对这些通用的函数进行编译了. 动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库.其加载方式与静态库截然