java - 为什么动态方法调度和父类(super class)变量可以引用子类对象?

标签 java

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

1.Java概念“父类(super class)变量可以引用子类对象”有什么用? 即使这样做,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
    }
}

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

我们也可以这样调用:

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

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

提前致谢。

最佳答案

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

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

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

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

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

另请阅读:

  1. Liskov substitution principle .
  2. Open/closed principle

关于java - 为什么动态方法调度和父类(super class)变量可以引用子类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17942140/

相关文章:

java - 为什么这个 Spring Boot Web 应用程序不需要 @Repository?

java - MitreId 客户端身份验证过滤器配置

java - Ejb Finder(ejb-ql) 事务超时

java - 如何在eclipse中的web-inf中添加classes文件夹

java - 保存到数据库使按钮无响应

java - 从文件读取模型时出现 Apache Jena 异常(仅在 Mac 上?)

java - 使用 apache POI 格式化 Excel 工作表

java - 类型类型转换一个数字加倍

java - IO异常循环

java - 如何在c++程序中调用返回类对象的java函数并接收该对象?