静态类型与函数重载

Posted xiaozhengyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态类型与函数重载相关的知识,希望对你有一定的参考价值。

静态类型与函数重载


有以下代码:

public class Main {
    public static class Human {}

    public static class Man extends Human {}

    public static class Woman extends Human {}

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

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

    public static void sayHello(Woman woman) { System.out.println("woman"); }

    public static void main(String[] args) {
        Human human;

        human = new Human();
        Main.sayHello(human);

        human = new Man();
        Main.sayHello(human);

        human = new Woman();
        Main.sayHello(human);
    }
}

上述代码执行完毕后控制台的输出结果为:

human
human
human

静态类型、实际类型

Human human = new Woman();

上面代码中的“Human”被称为变量human的静态类型(Static Type),或者称作外观类型(Apparent Type),上面代码中的“Woman”被称为变量human的实际类型(Actual Type)

两种类型的区别

静态类型和实际类型在程序中可以发生变化,但是静态类型的变化仅仅在使用时发生,变量本身的静态类型不会被改变,并且静态类型是编译期可知的;而实际类型变化的结果在运行期才能确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么

public static void main(String[] args) {
    // 静态类型:编译期可知
    Human human;
    // 实际类型:运行期可知
    human = new Human();
    Main.sayHello(human);

    // 实际类型变化
    human = new Man();
    // 静态类型变化
    Main.sayHello((Man) human);

    // 实际类型变化
    human = new Woman();
    // 静态类型变化
    Main.sayHello((Woman) human);
}
human
man
woman

静态类型与方法重载

  1. 重载方法以参数列表(参数个数、参数类型)为区分依据。
  2. 编译期仅仅可知变量的静态类型,无法确定变量的实际类型。

综上,在编译阶段编译器根据参数的静态类型来决定最终执行方法的哪个重载版本

以上是关于静态类型与函数重载的主要内容,如果未能解决你的问题,请参考以下文章

C++重载隐藏和覆盖的区别

命名空间中的函数重载(与具有静态成员的类相比)是一个坏主意吗?

另一个类中使用的非静态类<未解析的重载函数类型>

Python不支持函数重载

运算符重载

重载的编程语言中的重载