静态类型与函数重载
有以下代码:
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
静态类型与方法重载
- 重载方法以参数列表(参数个数、参数类型)为区分依据。
- 编译期仅仅可知变量的静态类型,无法确定变量的实际类型。
综上,在编译阶段编译器根据参数的静态类型来决定最终执行方法的哪个重载版本。