5

在浏览了一些关于多态的问题之后,似乎多态是 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

4 回答 4

12

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

在此处输入图像描述

似乎多态是Java中的一个通用思想

多态性继承性和封装性是面向对象语言的 3 个支柱(不仅限于 Java)。

于 2013-09-10T07:22:15.247 回答
6

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

但是,在这种情况下,“an A”有点橡皮。因为你不能拥有一个对象,它A不是某个其他类的实例。abstractA

于 2013-09-10T07:20:55.013 回答
3

只有a.g()多态性。因为您有类型的引用,A但它在 object 中调用方法B

于 2013-09-10T07:22:55.680 回答
0

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

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

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

于 2013-09-10T07:28:11.410 回答