我试图理解多态和超类及其子类之间的继承关系。我知道在处理从子类实例化的对象时,要么是子类,要么是子类,要么继承或者扩展类的超类。什么是原生类型的对象?三种多态性之间有什么区别?
答案 0 :(得分:0)
两个可能有用的术语:
对象具有类型,即new
之后的类型。但是当你有多态时,有不同的方式来引用该对象:
Integer v = Integer.valueOf(123);
Number n = v;
此处,n
和v
指的是同一个对象,但方式不同。这是允许的,因为Integer
是Number
的子类,Number
是Integer
的超类。
现在,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