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

day*_*mer 0 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
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码通过将不同的子类对象分配给超类引用变量来使用动态方法分派.我的问题是为什么使用"ref"并为其分配对象然后调用函数?我们甚至可以在不使用"ref"和对象赋值(动态调度)的情况下调用子类函数.

我们也可以这样打电话:

a.disp();//calls A method
b.disp();//calls B method and so on.
c.disp();
Run Code Online (Sandbox Code Playgroud)

谁能帮助我了解这两个概念的实时使用情况?

提前致谢.

NIN*_*OOP 5

运行时多态是一种实现Coding to Interface的方法,而不是实现!

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

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

public boolean remove(List list) {
   return list.remove();
}
Run Code Online (Sandbox Code Playgroud)

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

另请阅读:

  1. 利斯科夫替代原则.
  2. 开放/封闭原则