解释一个概念,宗量:方法的调用者和参数统称为方法的宗量。
前面讲了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语言是一门静态多分派,动态单分派的语言。
分享到:
相关推荐
第一种方法适用于简单的存储过程调用场景,而第二种方法则更适合于需要处理复杂数据结构或返回值的情况。无论哪种方式,都应确保正确处理异常,并且在完成后关闭所有打开的资源,以避免内存泄漏或其他问题。
在 C# 中,你可以使用 Dapper 的 `Execute()` 方法来调用这个存储过程,如下所示: ```csharp public int NoReturn_Add(string className) { using (SqlConnection con = new SqlConnection(constr)) { con.Open...
在调用过程中,可能会遇到SQL异常或其他运行时异常,需要使用try-catch-finally结构进行异常处理。捕获`SQLException`,根据错误码或异常信息进行相应的处理。 五、批处理调用 如果需要调用多个存储过程或函数,...
### SQL Server 存储过程中调用 WebService 的实现方法 #### 一、引言 在企业级应用开发中,Web Service 作为一种标准的接口技术,被广泛用于不同平台之间的服务交互。而在 SQL Server 数据库中直接调用 Web ...
总结,SqlHelper调用存储过程是.NET开发中常见的操作,通过正确配置连接字符串,创建并设置SqlParameter,然后选择合适的Execute方法,可以方便地调用存储过程执行数据库操作。理解并熟练运用这一技巧,能够提高开发...
#### 二、返回非记录集数据的存储过程调用 当存储过程返回一个具体的SQL类型数据而非记录集时,操作流程如下: 1. **建立连接和创建`CallableStatement`**:同上一步骤。 2. **注册输出参数**:使用`...
### VB6.0调用存储过程的例子(方法一) 在Visual Basic 6.0中,调用数据库中的存储过程是一项非常实用的功能。本篇将详细解释一个具体的示例,通过VB6.0来调用一个名为`ADOTestRPE`的存储过程,并测试其返回值、...
- **异常处理**:在转换和调用过程中,应充分考虑异常情况,如连接失败、类型不匹配等,确保应用程序的健壮性和容错能力。 #### 结论 通过本文的探讨,我们不仅了解了如何在Java中调用Oracle存储过程并传递集合...
### Java远程方法调用(RMI):深入解析与实践 #### 一、RMI概念与原理 Java远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算模型,允许一个Java虚拟机(JVM)上的对象通过网络...
金蝶云星空二次开发常用调用方法
二、异步调用实现 WebService 异步调用实现可以通过以下步骤: 1. 创建 WebService 代理类:使用 Visual Studio 或手动创建 WebService 代理类。 2. 创建异步方法:在代理类中创建异步方法,例如 BeginGetAsync 和...
#### 描述:本文档介绍了如何在ABAP程序中调用SAP HANA存储过程的方法。 #### 标签:ABAP、HANA #### 部分内容概述:本文档通过一个逐步教程的形式,详细解释了如何创建并实现一个SAP HANA数据库存储过程,并在...
ibatis通过SQL映射文件,将接口方法调用映射为一个或多个SQL语句,并自动完成参数设置和结果集处理,从而简化了Java应用程序与数据库之间的交互。 ### 二、存储过程概述 存储过程是一种预编译的SQL脚本,它可以...
调用`Execute`方法执行存储过程,并通过检查`v_error`参数的值来处理可能的错误。 ```vb cmd.Execute wrong = cmd("v_error") ``` ### 二、存储过程实例 存储过程`add_clockpaymount`在Oracle数据库中定义,用于...
具体要求是在loginAction类中分别用login()和registered()处理用户登录和注册的过程,分别创建login.jsp和register.jsp两个页面实现登录和注册的输入,这两个页面提交给loginAction中的两个方法进行业务处理,...
接着,创建一个Mapper接口,定义调用存储过程的方法。例如,创建一个`EmployeeMapper.java`接口: ```java public interface EmployeeMapper { void insertEmployee(@Param("employee") Employee employee); } ```...
二、 Java 调用存储过程 要在 Java 中调用存储过程,需要使用 JDBC 连接 DB2 数据库。首先,需要加载 DB2 驱动程序: ```java String JDBCDriver = "com.ibm.db2.jcc.DB2Driver"; ``` 然后,使用 DriverManager ...
#### 二、使用JDBC原生方式调用存储过程 JDBC(Java Database Connectivity)是Java中访问数据库的标准API,可以直接使用JDBC来调用存储过程。 ##### 2.1 创建CallableStatement对象 我们可以使用`Connection`...
5. 执行存储过程:调用CallableStatement的`execute()`方法执行存储过程。 6. 获取结果:对于存储过程的输出参数和结果集,可以使用CallableStatement的`getXXX()`方法获取。 7. 关闭资源:执行完操作后,记得关闭...