为什么动态方法调度和超类变量可以引用子类对象?

时间:2013-07-30 08:39:01

标签: java

我真的很想了解这些是什么实时使用:

1. Java概念的用途是什么 - “超类变量可以引用子类对象”? 即使通过这样做,SuperClass变量只能用于访问SuperClass定义的对象的那些部分,但不能访问子类成员。甚至可以通过子类对象实现。

2.动态方法调度需要什么?我在下面有一个例子:

class A
{
   void disp()
    {
      System.out.println("in A");
    }
}
class B extends A
{
    void disp()
    {
        System.out.println("in B");
    }
}
class C extends A
{
    void disp()
    {
        System.out.println("in C");
    }
}
public class mainclass
{
    public static void main(String[] args)
    {
        A a= new A();
        B b=new B();
        C c=new C();
        A ref;
        ref=b;
        ref.disp();//calls class B method
        ref=c;
        ref.disp();//calls class C method
        ref=a;
        ref.disp();//calls class A method
    }
}

上面的代码通过将不同的子类对象分配给超类引用变量来使用动态方法分派。 我的问题是为什么使用“ref”并为其分配对象然后调用函数?我们可以调用子类函数,即使不使用这个“ref”和对象赋值(动态调度)。

我们也可以这样打电话:

a.disp();//calls A method
b.disp();//calls B method and so on.
c.disp();

有人可以帮我理解这两个概念的实时使用吗?

提前致谢。

1 个答案:

答案 0 :(得分:5)

运行时多态是一种实现Coding to Interface, rather than implementation的方法!

多态性就像声明一个统一的接口,将实现细节留给实现接口的具体类型。这就像定义一个绑定到所有实现接口的人的契约。这使对象能够在不知道其确切类型的情况下相互交互。

让我们假设你有一个方法(简单的例子):

public boolean remove(List list) {
   return list.remove();
}

由于您已经定义了类型List接口的参数,因此可以在运行时接受List的任何实现对象。这样,只要传递给此方法的对象实现remove(),您就不必为每个List实现编写单独的方法List

同时阅读:

  1. Liskov substitution principle
  2. Open/closed principle