【问题标题】:Question about polymorphism and overloading关于多态性和重载的问题
【发布时间】:2010-10-20 20:20:53
【问题描述】:

我正在尝试理解多态性和重载的概念。我有以下代码作为一种实验。但是,我无法弄清楚为什么这个程序没有运行(它失败是因为mobj.foo(str)mobj 是使用多态定义的,据我所知,应该是MyDerivedClass 类型。如果这是真的, 有问题的线路不能正常工作吗?

为什么那行无效?

class MyBaseClass {
  protected int val;
  public MyBaseClass() { val = 1; }
  public void foo() { val += 2; }
  public void foo(int i) { val += 3; }
  public int getVal() { return val; }
}

class MyDerivedClass extends MyBaseClass {
  public MyDerivedClass () { val = 4; }
  public void foo() { val += 5; }
  public void foo(String str) { val += 6; }
}

class Test {
  public static void main(String[] args)
  {
    MyBaseClass mobj = new MyDerivedClass();
    String str = new String("hello");
    mobj.foo();
    mobj.foo(str);
    mobj.foo(4);
    System.out.println("val = " + mobj.getVal());
  }
}

【问题讨论】:

  • 您能否更具体地说明失败的原因?你得到的结果是什么,你期望的结果是什么?
  • 基本上,您将覆盖与重载混淆了。

标签: java oop polymorphism


【解决方案1】:

失败是因为

 MyBaseClass mobj = new MyDerivedClass();

你告诉编译器 mobj 是一个 MyBaseClass,所以它不知道有一个 foo(String) 方法。

这类事情会在运行时解决。

【讨论】:

    【解决方案2】:

    多态性仅在您覆盖父级已定义的方法时才有效,mobj.foo(str) 不是这种情况。 MyBaseClass 没有实现带有签名 foo(String) 的类。所以在MyDerivedClass 中实现的foo(String) 没有覆盖任何东西。记住 java 通过名称和参数来区分方法。

    【讨论】:

      【解决方案3】:

      mobjMyDerivedClass 的一个实例,但属于MyBaseClass 类型。因此,您只能在mobj 上调用为MyBaseClass 定义的方法。这就是mobj.foo(str) 失败的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 2019-11-07
        • 1970-01-01
        • 2011-06-25
        • 2011-06-22
        相关资源
        最近更新 更多