首页 > 解决方案 > 使用子类和超类引用访问实例方法

问题描述

这是示例代码:

package com.ankur.javapractice;
public class SuperClass {

    public void someMethod(int val) {
        System.out.println("Public method in SuperClass");
    }
}

class SubClass extends SuperClass {

    public void someMethod() {
        System.out.println("Public method in SubClass");
    }

    public static void main(String[] args) throws InterruptedException {
        SuperClass superClassRef = new SubClass();
        SubClass subClassRef = new SubClass();
        //superClassRef.someMethod(); // (1)
        subClassRef.someMethod(8); // (2)
    }
}

我理解为什么 (1)在编译时不起作用(这就是我将其注释掉的原因)。它不起作用,因为someMethod()不知道,superClassRef因为它是 typeSuperClass并且SuperClass没有定义someMethod()

我的问题是(2)为什么/如何在编译时工作?使用与上面相同的解释,在编译时也不someMethod(int)知道,subClassRef因为它是类型SubClass并且SubClass没有定义someMethod(int)

编辑和更新:

一些答案指出,SubClass继承someMethod(int)SuperClass. 这是正确的,我理解;我的后续问题是编译器如何考虑继承关系?

标签: javainheritance

解决方案


someMethod(int)在父类中定义的SuperClass,但是当子类使用extends关键字继承父类时,子类继承其父类的所有公共和受保护成员并且可以直接使用它们,这称为继承

子类继承其父类的所有公共和受保护成员,无论子类在哪个包中。如果子类与其父类在同一个包中,它也继承父类的包私有成员。您可以按原样使用继承的成员、替换它们、隐藏它们或用新成员补充它们:

  • 继承的方法可以直接使用。

推荐阅读