`
wangwengcn
  • 浏览: 172996 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

方法调用过程(二)

    博客分类:
  • JVM
阅读更多

   解释一个概念,宗量:方法的调用者和参数统称为方法的宗量。
   前面讲了Java的分派调用,这里有一个更直观的例子来说明分派的过程,请看代码:
 

public class Dispatch {
	
	static class QQ{}
	static class _360{}
	
	public static class Father{
		public void hardChoice(QQ arg)
		{
			System.out.println("father choose qq");
		}
		public void hardChoice(_360 arg)
		{
			System.out.println("father choose 360");
		}
	}
	
	public static class Son extends Father{
		public void hardChoice(QQ arg)
		{
			System.out.println("son choose qq");
		}
		public void hardChoice(_360 arg)
		{
			System.out.println("son choose 360");
		}
	}
	
	public static void main(String[] args) {
		Father father = new Father();
		Father son = new Son();
		father.hardChoice(new _360());
		son.hardChoice(new QQ());
	}
}

 
  运行结果:
  father choose 360
  son choose qq
 
 为什么会出现这样的结果呢?
 虚方法的执行分为了下面两个阶段:
 1.静态分派:这时候选择目标方法的依据有两点
   (1)静态类型是Father还是Son
   (2)方法参数是QQ还是360
  这次选择结果的最终产物是产生了两条invokevirtual指令,两条指令的参数分别为常量池中指向Father.hardChoice(_360)以及Father.hardChoice(QQ)的符号引用,因为是根据两个宗量进行选择,所以Java语言的静态分派属于多分派类型。
 2.动态分派:
  在执行Father.hardChoice(_360)以及Father.hardChoice(QQ)时,虚拟机此时不会关心传递过来的"QQ"到底是"腾讯QQ"还是"奇瑞QQ",因为这时候参数的静态类型和实际类型都不会对方法的选择构成任何影响,唯一可以影响虚拟机选择的因素只有此方法的调用者的实际类型是Father还是Son。
 因为只有一个宗量作为选择依据,所以Java的动态分派属于单分派类型。
 
 这个例子也说明了重载和重写的原理。
 综上所述:Java语言是一门静态多分派,动态单分派的语言。

分享到:
评论

相关推荐

    金蝶云星空二次开发常用调用方法.docx

    金蝶云星空二次开发常用调用方法

    一个Action多方法调用的Struts 2的应用程序

    具体要求是在loginAction类中分别用login()和registered()处理用户登录和注册的过程,分别创建login.jsp和register.jsp两个页面实现登录和注册的输入,这两个页面提交给loginAction中的两个方法进行业务处理,...

    tomcat源码解析过程文档,详细说明了tomcat从启动到最后结束中间类和方法的调用过程

    这份Tomcat源码解析文档详细地介绍了Tomcat从启动到最后结束的过程,包括其中涉及的类和方法的调用过程。这份文档对于想要深入研究Java底层源码启动过程的人来说十分有用。除了介绍Tomcat的启动过程,这份文档还可以...

    java调用存储过程

    CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种...

    Creo二次开发调用C#方法

    Creo二次开发一般使用C++开发,Creo中嵌入C#只能通过COM接口方式,该文档总结了大致的过程

    Android 实例讲解添加本地图片和调用系统拍照图片

    在项目的开发过程我们离不开图片 而有时候需要调用本地的图片 有时候需要调用拍照图片 同时实现拍照的方法有两种 一种是调用系统拍照功能 另一种是自定义拍照功能 而本博文目前只讲解第一种方法 第二种方法后期在...

    c# / VB 调用refprop.dll

    c#调用refprop.dll文件来查物性参数, 只是封装的代码,refprop.dll需要自己下载。下载1分,没分的消息给我。

    VC开发的软件中对CHM帮助文档的调用方法

    今天整理了一下,详细的介绍在VC开发的软件中对CHM帮助文档的调用方法以及CHM帮助文档的制作要求。 一、软件中对CHM帮助文档的调用方法  VC中调用CHM帮助必须用API函数HtmlHelp(),此函数在LIB库函数内,为方便...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    在开发项目过程中,需要处理算法分析出来二进制流数据,并对数据解析处理转发。我们上层应用平台是使用java开发的,但开放平台是使用c++开发,虽提供给我们对应的.h头文件,但在java中来解析这些数据就显然有些复杂...

    实例解析MySQL中的存储过程及存储过程的调用方法

    如果你是程序员的话,那我告诉你存储过程实际上是一个方法,你只要调用这个方法,并且输入它设置好的参数就可以获取或者执行你想要的操作了. 看了如下存储过程实例,你会发现mysql存储过程和shell很像. 下面存储过程...

    基于ncnn的yolov5部署实现调用摄像头完成目标检测源码(带模型文件+编译方法).zip

    基于ncnn的yolov5部署实现调用摄像头完成目标检测源码(带模型文件+编译方法).zip基于ncnn的yolov5部署实现调用摄像头完成目标检测源码(带模型文件+编译方法).zip基于ncnn的yolov5部署实现调用摄像头完成目标检测源码...

    SVM的Matlab工具箱,具有详细工具箱安装说明,及调用方法,非常详细,绝对可用

    SVM的Matlab工具箱,具有详细工具箱安装说明,及调用方法,非常详细,绝对可用,包含二维线性可分、二维线性不可分,三维线性可分三种情况

    asp调用存储过程

    1.调用存储过程的一般方法 先假设在sql server中有一存储过程dt_users: CREATE PROCEDURE [dbo].[dt_users] AS select * from users return GO 第一种方法是不利用command对象,直接用recordset对象 set rs=...

    Java继承时构造函数的调用

    抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类...

    Java通过Jacob调用ActiveX,进行二进制数据交换

    该工程项目演示了Java通过jacob1.17调用ActiveX的基本方法。对于单个的基本类型的数据(byte、short、long、BOOL)等类型的数据,以及有很多字节组成的可见英文字符、汉字等组成的字符串(LPCTSTR、BSTR类型都会进行...

    数据库原理及应用A实验报告(实验三——存储过程与触发器)

    熟练掌握存储过程的调用方法 了解触发器的概念、优点 掌握触发器的方法和步骤 掌握触发器的使用 二、实验环境 Windows10 Oracle database 12.1.0.2.0 PL/SQL Developer 12 三、实验步骤、出现的问题及解决...

    MySQL数据库:存储过程的创建1.pptx

    (2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。 (3)确保数据库的安全。使用存储过程可以完成所有数据库...

    SQL server服务显示远程过程调用失败的解决方法

    刚刚打开SQL Server 2008,想要新建一个数据库,却发现出现了一个问题,这个问题由于之前没有遇到过,所以下面整理解决SQL server服务远程调用失败的几个方法,供大家参考,具体内容如下 先看看出现的问题: 出现...

    Oracle数据库存储过程技术文档.doc

    第二章 oracle存储过程基础――PL/SQL 9 2.1 pl/sql基础 9 2.1.1 PL/SQL简介 9 2.1.2 一个简单的PL/SQL块 10 2.1.3 PL/SQL流程控制 13 2.2 游标(CURSOR) 17 2.2.1 游标的概念 18 2.2.2 游标的属性 18 2.2.3 游标中...

    宁波维尔指纹仪二次开发接口

    调用方法 过程 例子:(请参考TestDevCtl html) var result dtm Method ; 执行接口函数">C1 指纹设备控件说明 控件名称:libFPDev WL ocx 控件ID :933DB2AB 51BF 4204 9E30 C907FE352A5E 控件说明:用于网页...

Global site tag (gtag.js) - Google Analytics