两个可能有帮助的术语:
一个对象有一个类型,即new之后的类型。但是当你有多态性时,有不同的方式来引用对象:
Integer v = Integer.valueOf(123);
Number n = v;
这里,n 和 v 指的是同一个对象,但方式不同。这是允许的,因为Integer 是Number 的子类,而Number 是Integer 的超类。
现在,n 有两种不同的类型。 静态类型,即Number,出现在程序的文本中。它还有一个动态类型,即Integer,这是它的真实类型。我假设真实类型或动态类型就是您所说的“本机类型”。
有了这些知识,我们可以看看不同类型的多态性:
Ad-hoc 多态性(在 Java 中也称为重载):您可以拥有多个具有相同名称和参数列表的函数,仅参数类型不同。将选择哪个函数将取决于 static 类型。
public String add(String a, String b) {
return a + b;
}
public int add(int a, int b) {
return a + b;
}
add("a", "b"); // calls first version of add
add(1, 2); // calls second version of add
参数多态性(Java 中的泛型):您可以通过类型参数 T 将相同的函数“参数化”。T 上可用的函数取决于静态类型。
public <T extends Number> boolean lessThan(T a, T b) {
// compareTo is available because T has the static type Number
return a.compareTo(b) < 0;
}
子类型多态(又名覆盖):调用哪个函数取决于动态类型。
public abstract class Animal {
public abstract void speak();
}
public class Dog {
public void speak() { System.out.println("Woof"); }
}
public class Cat {
public void speak() { System.out.println("Meow"); }
}
Animal a = new Dog();
Animal b = new Cat();
a.speak(); // says Woof - because dynamic type is Dog
b.speak(); // says Meow - because dynamic type is Cat