Java 是一种静态多分配、动态单分配的语言(C++也是),介绍静态多分配的概念之前,首先得知道静态类型和动态类型。
静态类型就是变量被声明时候的类型,该类型也是编译器在编译阶段知道的对象类型,动态类型是变量所引用的对象的真实类型,也就是运行时类型,代码举例:
Fathre a = new Son();//假设有一个Fathre类及其子类Son
变量a声明的时候是Father类型,编译器在编译的时候付给a的类型就是Fathre,其静态类型就是Father,但是它的动态类型是Son,就是运行时a是以Son类型来运行的。
根据对象的类型进行方法的选择就是分配了,分为静态分配和动态分配。
静态分配是发生在编译时间,根据静态类型进行方法的选择,java是通过方法重载来支持静态分配的。如下面代码所示
public class StaticDispatchMain {
public static void main(String[] args) {
List list = new ArrayList<>();
test(list);
}
public static void test(List list)
{
System.out.println("test List");
}
public static void test(ArrayList arrayList)
{
System.out.println("test ArrayList");
}
}
在类StaticDispatchMain里面,然后调用test方法。test方法被重载过,一个形参是List类型,另一个形参是ArrayList类型。在main函数里面,声明了List类型的变量list,其静态类型是List,编译器在编译阶段就确定了是调用test(List list)方法,该过程就是静态分配。如果list类型为ArrayList类型,那么就会调用第二个test方法,虽然第一个test方法看似也可以调用;如果把第二test方法去掉,那么就会调用了第一个test方法了。