我无法理解以下代码(针对行号进行注释)
class Base {
void m1(Object o) {
}
void m2(String o) {
}
}
public class Overloading extends Base {
void m1(String s) {
}
void m2(Object o) {
}
public static void main(String[] args) {
Object o = new Object();
Base base1 = new Base();
base1.m1("");//**why this works perfect**
Base base = new Overloading();
base.m2(o);// **why compile time error** - The method m2(String) in the type Base is not applicable for the arguments (Object)
最佳答案
编译器始终根据您调用方法的引用的声明类型来解析方法调用。
当您调用该方法时:
base1.m1("");
编译器在 base1
的声明类型中查找方法签名,在本例中为 Base
。 Base
中的匹配方法为:
void m1(Object o) { }
由于参数Object
可以接受String
参数,因此调用是有效的。您可以将子类对象传递给父类(super class)引用。
现在,第二次调用:
base.m2(o);
同样,base
的声明类型是 Base
。而Base
类中的匹配方法是:
void m2(String o) { }
因为您无法传递接受 String
的 Object
引用。编译器给你编译器错误。没有隐式缩小转换。
通过一个简单的作业,您可以更清楚地理解它:
Object ob = new Integer(3);
String str = ob; // This shouldn't be valid
Java 不执行隐式缩小转换。从 obj
到 str
的赋值不应有效,否则您会在运行时得到 ClassCastException
。
关于java - 无法理解java中的继承和覆盖/重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902307/