多态性和处理本地类型

Polymorphism and dealing with native types

我想了解多态性以及超类和它的子类之间的继承关系。我知道在处理从子类实例化的对象时,无论是作为其本机类型、子类还是继承的对象,或者扩展超类的类型。对象的本机类型是什么?三种类型的多态之间有什么区别?

两个可能有帮助的术语:

  • 动态类型
  • 静态类型

一个对象有一个类型,即new之后的类型。但是当你有多态性时,有不同的方式来引用对象:

Integer v = Integer.valueOf(123);
Number n = v;

这里,nv指的是同一个对象,只是方式不同。这是允许的,因为 IntegerNumber 的子类,而 NumberInteger.

的超类

现在,n有两种不同的类型。 静态类型,即Number,出现在程序的正文中。它还有一个动态类型,也就是Integer,这是它的真实类型。我假设真实类型或动态类型就是您所说的 "native type".

有了这些知识,我们可以看看不同类型的多态性:

临时多态性(在 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 获得相同的函数 "parameterized"。哪些函数可用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