【问题标题】:Why dynamic method dispatch and superclass variabe can reference a subclass object?为什么动态方法调度和超类变量可以引用子类对象?
【发布时间】:2013-07-30 08:39:00
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 如果你刚开始,就这样学吧。当您编写复杂的问题并使用您会理解的模式时:-)
  • 该示例显示相同的调用ref.disp() 的行为不同,具体取决于分配的对象的实际类型!你是对的,a.disp() b.disp()c.disp() 会做同样的事情,但它不会显示多态行为。

标签: java


【解决方案1】:

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

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

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

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

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

另请阅读:

  1. Liskov substitution principle
  2. Open/closed principle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2010-10-28
    • 2023-04-05
    • 2018-08-22
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多