多态性和处理本机类型

时间:2015-10-12 15:41:26

标签: java inheritance polymorphism subclass superclass

我试图理解多态和超类及其子类之间的继承关系。我知道在处理从子类实例化的对象时,要么是子类,要么是子类,要么继承或者扩展类的超类。什么是原生类型的对象?三种多态性之间有什么区别?

1 个答案:

答案 0 :(得分:0)

两个可能有用的术语:

  • 动态类型
  • 静态类型

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

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

此处,nv指的是同一个对象,但方式不同。这是允许的,因为IntegerNumber的子类,NumberInteger的超类。

现在,n有两种不同的类型。 静态类型,即Number,出现在程序文本中。它还有一个动态类型,它是Integer,这是它的真实类型。我假设真正的类型或动态类型是你的意思"本机类型"。

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

Ad-hoc多态(在Java中称为重载):您可以拥有多个具有相同名称和参数列表的函数,这些函数只能通过参数类型区分。选择哪个功能取决于静态类型。

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