我试图理解多态和重载的概念。我有以下代码作为一种实验。但是,我无法弄清楚为什么这个程序没有运行(由于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());
}
}
答案 0 :(得分:7)
MyBaseClass mobj = new MyDerivedClass();
你告诉编译器mobj是一个MyBaseClass,所以它不知道有一个foo(String)方法。
这种事情在运行时得到解决。
答案 1 :(得分:3)
多态性仅在覆盖父级已定义的方法时才有效,而mobj.foo(str)
则不然。 MyBaseClass
未实现具有签名foo(String)
的类。因此foo(String)
中实施的MyDerivedClass
并未覆盖任何内容。请记住,java按名称和参数区分方法。
答案 2 :(得分:2)
mobj
是MyDerivedClass
的实例,但类型为MyBaseClass
。因此,您只能在MyBaseClass
上调用为mobj
定义的方法。这就是mobj.foo(str)
失败的原因。