无法理解java中的继承和覆盖/重载

Lea*_*ner 2 java inheritance overriding

我有问题理解下面的代码(对行号进行了评论)

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)
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 7

编译器总是根据您调用它的引用的声明类型来解析方法调用.

当您调用该方法时:

base1.m1("");
Run Code Online (Sandbox Code Playgroud)

编译器会在声明的类型的方法签名base1,这是Base在这种情况下.匹配方法Base是:

void m1(Object o) { }
Run Code Online (Sandbox Code Playgroud)

由于参数Object可以接受String参数,因此调用有效.您可以将子类对象传递给超类引用.


现在,第二次调用:

base.m2(o);
Run Code Online (Sandbox Code Playgroud)

再次声明的类型baseBase.并且Base类中的匹配方法是:

void m2(String o) { }
Run Code Online (Sandbox Code Playgroud)

由于您无法传递接受Objecta 的引用String.编译器为您提供编译器错误.没有隐含的缩小转换.


您可以通过简单的任务更清楚地理解它:

Object ob = new Integer(3);
String str = ob;  // This shouldn't be valid
Run Code Online (Sandbox Code Playgroud)

Java不执行隐式缩小转换.来自objto 的赋值不str应该是有效的,因为否则你将ClassCastException在运行时获得.