方法调用

1. 重载

1.1 Java虚拟机

  虚拟机识别方法时主要根据类名,方法名和方法描述符(参数类型和返回值类型).

  如果出现类名,方法名和方法描述符相同的方法,Java虚拟机在类加载的验证阶段报错.

1.2 Java语言

  在同一个类中,方法名称相同,参数类型不同的方法称之为重载.

  如果在子类中定义了与父类非私有方法同名,且参数列表不同的方法,也可以构成重载.

  如果两个方法都是静态的,则子类隐藏了父类的静态方法.

  如果出现类名,方法名和参数类型相同,但是返回值类型不同的方法,Java编译器会报错.

1.3 小知识

  这个限制可以通过字节码工具绕开。也就是说,在编译完成之后,我们可以再向 class 文件中添加方法名和参数类型相同,而返回类型不同的方法。当这种包括多个方法名相同、参数类型相同,而返回类型不同的方法的类,出现在 Java 编译器的用户类路径上时,它是怎么确定需要调用哪个方法的呢?当前版本的 Java 编译器会直接选取第一个方法名以及参数类型匹配的方法。并且,它会根据所选取方法的返回类型来决定可不可以通过编译,以及需不需要进行值转换等。

1.4 方法的调用

  重载方法在编译期间就可以确定.编译器根据传入参数的静态类型(不是实际类型)选取重载方法.

  一般分为三个步骤:

  1. 不考虑基本类型的拆装箱,以及可变参数的情况.
  2. 第一阶段未找到合适的方法,则允许在自动拆装箱,但不允许可变参数的情况选取重载方法.
  3. 第二阶段未找到合适的方法,则允许在自动拆装箱,允许可变参数的情况选取重载方法.

  Java编译器在同一阶段选取重载方法时根据继承关系选取最为贴近的方法,一般优先选取子类类型的参数.

  比如一个方法的参数类型为Object, 另一个为String.当参数同时符合两种方法的参数类型时,优先选取String类型的方法.

  

原文地址:https://www.cnblogs.com/virgosnail/p/9982535.html

时间: 2024-10-29 14:33:21

方法调用的相关文章

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用

网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2--RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjectProxy(new LocalRPCClient()); : 绑定目标对象 2. IUserService userService = (IUserService) rpcObjectProxy.create(IUserService.class); :返回代理类 3. List<User> u

Java学习笔记之RMI远程方法调用

RMI 应用通常有两个分开的程序组成,一个服务端程序和一个客户端程序.一个典型的服务端程序创建一些远程对象,使得对这些远程对象的引用可以被访问,等待客户端调用这些远程对象提供的方法.一个典型的客户端程序获取远程引用,指向一个或者多个服务端上的远程对象,然后调用这些远程对象所提供的方法.通常我们称这为分布式对象应用程序. 3.1 RMI的工作方式 分布式对象应用程序需要做的事情: l 查找(定位)远程对象. 应用程序可以使用各种不同的机制取得远程对象的引用.比如应用程序可以通过 RMI 提供的简单

多态与方法调用

1 多态(ploymorphism)指一个程序中相同的名字表示不同的含义的情况 1.1 编译时多态:函数重载(overload),多个同名的不同方法 e.g.  p.sayhallo()   p.sayhallo("wang") 1.2 运行时多态 覆盖(override):子类对父类方法的覆盖 动态绑定:---即虚方法调用 调用时程序会根据context自动正确的决定调用子类对象的方法 2 方法调用 注意:上溯造型(upcasting)----把派生类型当做基本类型处理 2.1 虚方

Struts2学习第七课 动态方法调用

动态方法调用:通过url动态调用Action中的方法. action声明: <package name="struts-app2" namespace="/" extends="struts-default"> <action name="Product" class="org.simpleit.app.Product"> </package> URI: --/strut

动态方法调用

1.先建立一个项目 2.在此项目中需要建立两个jsp 1)在第一个jsp中写入一句话 <body> User Add Success! </body> 2)在第二个jsp中写入链接 <body> Action执行的时候并不一定要执行execute方法<br /> 可以在配置文件中配置Action的时候用method=来指定执行哪个方法 也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br /> <a href="<

struts2笔记09-动态方法调用

1.action配置 <action name="testDynamic" class="com.test.actions.TestAction"> <result name="test">/test.jsp</result> <result name="test1">/test1.jsp</result> </action> 没有配置method属性 2

简谈 JavaScript、Java 中链式方法调用大致实现原理

相信,在 JavaScript .C# 中都见过不少链式方法调用,那么,其中实现该类链式调用原理,大家有没有仔细思考过?其中 JavaScript 类库:jQuery 中就存在大量例子,而在 C# 中,其中 lambda 表达式的大量使用以及扩展方法的新增,使链式调用也见的不少. 首先,就谈谈 JavaScript 中链式调用,其实,也是就是运用之前提及的 this . var Person=function(name,age){ this.Name=name; this.Age=age; };

XML-RPC远程方法调用

一.简介 XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现. 这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式. Xml-Rpc的定义尽可能的保持了简单,但同时能够传送.处理.返回复杂的数据结构. xml rpc使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据. 一个rpc系统,必然包括2个部分: 1

java中方法调用

JAVA中方法的调用[基础] 一.调用本类中的方法 方法一.被调用方法声明为static ,可以在其他方法中直接调用.示例代码如下: public class HelloWord { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str="HelloWord!"; int a=0; int b=a+1; int result=

iOS开发-方法调用在运行时的过程

方法调用在运行时的过程 如果用实例对象调用实例方法,会到实例的isa指针指向的对象(也就是类对象)操作. 如果调用的是类方法,就会到类对象的isa指针指向的对象(也就是元类对象)中操作. 首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应实现并执行. 如果没找到,在相应操作的对象中的方法列表中找调用的方法,如果找到,转向相应实现执行 如果没找到,去父类指针所指向的对象中执行1,2. 以此类推,如果一直到根类还没找到,转向拦截调用. 如果没有重写拦截调用的方法,程序报错. 以