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

标签 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)

最佳答案

编译器始终根据您调用方法的引用的声明类型来解析方法调用。

当您调用该方法时:

base1.m1("");

编译器在 base1 的声明类型中查找方法签名,在本例中为 BaseBase中的匹配方法为:

void m1(Object o) { }

由于参数Object可以接受String参数,因此调用是有效的。您可以将子类对象传递给父类(super class)引用。

<小时/>

现在,第二次调用:

base.m2(o);

同样,base 的声明类型是 Base。而Base类中的匹配方法是:

void m2(String o) { }

因为您无法传递接受 StringObject 引用。编译器给你编译器错误。没有隐式缩小转换。

<小时/>

通过一个简单的作业,您可以更清楚地理解它:

Object ob = new Integer(3);
String str = ob;  // This shouldn't be valid

Java 不执行隐式缩小转换。从 objstr 的赋值不应有效,否则您会在运行时得到 ClassCastException

关于java - 无法理解java中的继承和覆盖/重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902307/

相关文章:

java - Java中有类似JavaScript的 "prototype"的东西吗?

java - 如何在持久化时忽略 hibernate 实体中的子类

java - 异常重写方法

java - 在Java中重写equals和hashCode时应该考虑哪些问题?

java - 如何通过Spring JMS在两个java应用程序之间交换消息?

java - Kafka 事务失败但仍然提交偏移量

java - 如何自动创建和注入(inject)缺失依赖项的代理?

java - HTTPGet 在 Java 中有效,但在 Android 中无效

c++ - 来自同一物理类的多重继承

c# - 如何用更丰富的类型覆盖接口(interface)方法中定义的参数?