当前位置: 首页 > 知识库问答 >
问题:

为什么动态方法dispatch和超类variabe可以引用子类对象?

缑赤岩
2023-03-14

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

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
    }
}
a.disp();//calls A method
b.disp();//calls B method and so on.
c.disp();

提前谢了。

共有1个答案

易阳云
2023-03-14

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

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

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

public boolean remove(List list) {
   return list.remove();
}
    null
 类似资料:
  • 问题内容: 动物是狗的超类,狗有一种叫bark的方法 考虑以下: 会发生什么? the assignment isn’t allowed the call to bark is allowed and “woof” is printed at run time the call to bark is allowed but nothing is printed the call to bark c

  • 既然这个对象(在标题中说明)可以调用子类中的重写方法,为什么它不能调用子类的其他方法?我需要尽可能详细的回答,比如内存组织,JVM中的内部逻辑等。 下面的代码会让你清楚地理解我的问题。

  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但

  • 问题内容: Java中的以下代码在elipse上运行时,即使我们将其替换,也会提供相同的输出 与, 请注意,我们已经覆盖了方法。 输出为: 码: 请指出,用这两种方式创建子类对象有什么区别。并且访问方法和变量是否有任何区别?(我们的Java老师说,两种情况下访问方法和变量都不同) 同样,静态方法(例如main)会发生什么。艰难的我知道它是可继承的,但是有人可以在子类中突出它的行为吗? 问题答案:

  • 问题内容: 我有这样的代码: 为什么我不能在第(5)行中打电话;在第(6)行中将为哪个类调用? 问题答案: 您不能这样做,因为子类的方法不在您的超类中。在这种情况下,尽管String是Object的子类,因为在java.lang.Object类中未声明length(),但无法在其实例上调用length。 但是equals()方法在字符串类中被覆盖,因此将调用Strings的equals()

  • 为什么可以从子实例访问我的超类的静态方法? 我可以同意从父类的实例访问父类的静态方法。但是如果我实例化一个子类,访问父类的静态上下文会很奇怪。 PS 在实例上调用静态方法的优点是什么?