【问题标题】:Polymorphism and dealing with native types多态性和处理原生类型
【发布时间】:2016-01-10 03:57:55
【问题描述】:

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

【问题讨论】:

  • 我不知道你在问什么。请澄清或重新表述您的问题。
  • 如果这个话题已经被回答,那么请提供一个链接。感谢您的帮助!
  • “本机”类型?你是在说 JNI 还是什么?
  • 如果您在理解某些书籍或教程时遇到问题,请提供完整的报价(如果可能,请附上链接),然后指出似乎不清楚的地方。
  • @Jon189283 您似乎将 SO 与贡献者可以读懂您想法的网站混淆了。

标签: java inheritance polymorphism subclass superclass


【解决方案1】:

两个可能有帮助的术语:

  • 动态类型
  • 静态类型

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

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

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

现在,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多