在浏览了一些关于多态性的问题之后,似乎多态性在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();
答案 0 :(得分:12)
多态性 - 表示给定类型的单个变量用于引用对象的能力 不同的类型,并自动调用特定于变量引用的对象类型的方法。在一个 简而言之,多态是一种自下而上的方法调用。 多态的好处是很容易添加新的 派生对象的类而不破坏调用代码(即显示的示例代码中的getTotArea() 下面)使用多态类或接口。当您向对象发送消息时,即使您 不知道它是什么特定的类型,正确的事情发生了,那就是所谓的 多态 。使用的过程 用于实现多态的面向对象编程语言称为 动态绑定 。
似乎多态性是Java中的一般概念
多态性,继承和封装是面向对象语言的三大支柱(仅限非Java)。
答案 1 :(得分:6)
两者都是多态性的例子。 B
的行为与A
相似。 (我之前错过了abstract void g()
声明。或者你在我们回答的时候添加了它?)
然而,在这种情况下,“A
”有点橡皮。由于A
为abstract
,因此您不能拥有A
的对象,也不能拥有其他类的实例。
答案 2 :(得分:3)
只有a.g()
是多态的。因为你有A
类型的引用,但它调用对象B
中的方法。
答案 3 :(得分:0)
我宁愿说他们应该表现为同一个班级的实例。派生成员应遵守javadoc中记录的一般合同。
我建议您阅读维基文章,并查看动态绑定的概念。
简而言之:具体调用方法取决于引用变量类型的引用对象不的运行时类型。