0

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

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();

谁能帮我理解这两个概念的实时使用?

提前致谢。

4

1 回答 1

5

运行时多态是实现接口编码的一种方式,而不是实现

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

让我们假设您有一个方法(简单示例):

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

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

另请阅读:

  1. 里氏替换原则
  2. 开闭原理
于 2013-07-30T08:51:17.183 回答