方法调用

Posted virgosnail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方法调用相关的知识,希望对你有一定的参考价值。

1. 重载

1.1 Java虚拟机

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

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

1.2 Java语言

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

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

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

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

1.3 小知识

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

1.4 方法的调用

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

  一般分为三个步骤:

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

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

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

  

以上是关于方法调用的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java虚拟机——方法调用(解析调用)

varargs 方法的非 varargs 调用

java中一个方法调用另一个方法。

使用反射的方法调用的问题问题,怎么解决

javapote如何实现方法调用

C#怎么调用方法