这些多态性的例子是什么?

时间:2013-09-10 07:16:41

标签: java oop polymorphism

在浏览了一些关于多态性的问题之后,似乎多态性在Java中是一个普遍的想法,它允许对象表现得好像它是另一个类的实例;因此代码更加独立于具体类。鉴于这个想法,以下main()方法中的两个方法调用是多态的吗?

abstract class A
{
  void f() { System.out.println("A.f()"); }
  abstract void g();
}

class B extends A
{
  void g() { System.out.println("B.g()"); }
}

public class Test
{
  public static void main(String[] args)
  {
    A a = new B();
    a.f();        // Is this an example of Polymorphism?
    a.g();        // ...
  }
}

输出是:

A.f();  
B.g();

4 个答案:

答案 0 :(得分:12)

多态性 - 表示给定类型的单个变量用于引用对象的能力 不同的类型,并自动调用特定于变量引用的对象类型的方法。在一个 简而言之,多态是一种自下而上的方法调用。 多态的好处是很容易添加新的 派生对象的类而不破坏调用代码(即显示的示例代码中的getTotArea() 下面)使用多态类或接口。当您向对象发送消息时,即使您 不知道它是什么特定的类型,正确的事情发生了,那就是所谓的 多态 。使用的过程 用于实现多态的面向对象编程语言称为 动态绑定

enter image description here

  

似乎多态性是Java中的一般概念

多态性继承封装是面向对象语言的三大支柱(仅限非Java)。

答案 1 :(得分:6)

两者都是多态性的例子。 B的行为与A相似。 (我之前错过了abstract void g()声明。或者你在我们回答的时候添加了它?)

然而,在这种情况下,“A”有点橡皮。由于Aabstract,因此您不能拥有A的对象,也不能拥有其他类的实例。

答案 2 :(得分:3)

只有a.g()是多态的。因为你有A类型的引用,但它调用对象B中的方法。

答案 3 :(得分:0)

我宁愿说他们应该表现为同一个班级的实例。派生成员应遵守javadoc中记录的一般合同。

我建议您阅读维基文章,并查看动态绑定的概念。

简而言之:具体调用方法取决于引用变量类型的引用对象的运行时类型。