多态性和处理本地类型
Polymorphism and dealing with native types
我想了解多态性以及超类和它的子类之间的继承关系。我知道在处理从子类实例化的对象时,无论是作为其本机类型、子类还是继承的对象,或者扩展超类的类型。对象的本机类型是什么?三种类型的多态之间有什么区别?
两个可能有帮助的术语:
- 动态类型
- 静态类型
一个对象有一个类型,即new
之后的类型。但是当你有多态性时,有不同的方式来引用对象:
Integer v = Integer.valueOf(123);
Number n = v;
这里,n
和v
指的是同一个对象,只是方式不同。这是允许的,因为 Integer
是 Number
的子类,而 Number
是 Integer
.
的超类
现在,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
我想了解多态性以及超类和它的子类之间的继承关系。我知道在处理从子类实例化的对象时,无论是作为其本机类型、子类还是继承的对象,或者扩展超类的类型。对象的本机类型是什么?三种类型的多态之间有什么区别?
两个可能有帮助的术语:
- 动态类型
- 静态类型
一个对象有一个类型,即new
之后的类型。但是当你有多态性时,有不同的方式来引用对象:
Integer v = Integer.valueOf(123);
Number n = v;
这里,n
和v
指的是同一个对象,只是方式不同。这是允许的,因为 Integer
是 Number
的子类,而 Number
是 Integer
.
现在,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