美文网首页
方法重载

方法重载

作者: Doctor_Xu | 来源:发表于2020-11-11 00:31 被阅读0次

对于重载的方法进行函数调用时,最终选择哪个方法执行是根据方法参数的静态类型决定,而不是其动态类型。

public class ReloadTest {

    public static class Human {

    }

    public static class Man extends Human {

    }

    public static class Woman extends Human {

    }

    public void reload(Man man) {
        System.out.println("man");
    }

    public void reload(Human human) {
        System.out.println("human");
    }

    public void reload(Woman woman) {
        System.out.println("woman");
    }
}
public static void main(String[] args) throws InterruptedException {
        
    ReloadTest reload = new ReloadTest();
    Human man = new Man();
    Human woman = new Human();
    reload.reload(man);
    reload.reload(woman);
}
human
human

最终程序的输出结果是两个human,说明编译器是根据参数的静态类型而不是动态类型作为判断选择哪个重载函数的依据。
以Human man = new Man()为例,Human为静态类型,而Man为动态类型。
编译器在重载时是通过参数的实际静态类型而不是其实际类型作为判断依据。并且静态类型在编译期可知(为什么在编译期可知涉及到编译时栈帧的知识),因此,在编译阶段,javac 编译器会根据参数的静态类型决定使用哪个重载版本,并且把这个方法的符号引用写到main()方法里的两条invokevirtual指令的参数中。
所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。静态分派的典型应用就是方法重载。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的。另外,编译器虽然能够确认出重载版本,但是这个重载版本并不是唯一的,往往其只能确定一个更加合适的版本。产生这种情况的原因是:字面量不需要定义,所以字面量并没有显示的静态类型,它的静态类型只能通过语言上的规则去理解和推断。
(摘自:深入理解Java虚拟机)

相关文章

  • C#多态的表现-方法重载,方法重写以及密封类的特点

    方法重载 方法重载:构造函数就属于特殊的方法重载 方法重载:是指同一个类中相同方法的不同行为 方法重载的特点: 1...

  • OOP多态和密封类

    学习oop多态 1.方法重载 2.方法重写 3.里氏替换原则 方法重载:构造函数属于特殊的方法重载 方法重载是指同...

  • 方法的定义与使用(方法重载)

    方法重载 方法重载指的是方法名称相同,参数的类型或个数不同。范例:实现方法重载 范例:观察如下程序

  • 方法重载与方法重写(@Overload @Override)

    java方法重载和方法重写(方法覆盖)的区别: 方法重载: Overload 方法重写: Override 批判,...

  • 方法重载

    方法重载 21. 辨别方法重载 在调用重载方法时,编译器会根据方法的参数个数、参数类型和方法属性(const 方法...

  • Java重载

    重载(Overlaod):表示两个或多个方法名字相同,但方法参数不同。 代码: 普通方法重载 方法中也可以嵌套重载...

  • c++快速入门7:类和对象B:重载、继承和重写

    重载方法(Overloading) 就像函数重载,类方法也可以被重载--包括构造方法。 继承类的属性 派生类除了自...

  • OOP(多态,重载,重写,虚方法,密封类)

    多态 学习OOp多态*1.方法重载*2.方法重写*3.里氏替换原则**方法重载:构造函数就属于特殊的方法重载*方...

  • Java面试题

    1、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 答:方法的重载...

  • JVM方法调用

    方法重载和方法重写多态是面向对象程序设计的重要特性,方法重载和方法重写是Java语言实现多态的主要形式。方法重载指...

网友评论

      本文标题:方法重载

      本文链接:https://www.haomeiwen.com/subject/iuisbktx.html