Java 使用子类和超类引用访问实例方法

Java 使用子类和超类引用访问实例方法,java,inheritance,Java,Inheritance,以下是示例代码: 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() {

以下是示例代码:

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
所知,因为它属于
SuperClass
类型,
SuperClass
不定义
someMethod()

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

编辑和更新:

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

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

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

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

    • 这是因为子类继承了someMethod(int)并具有someMethod(),所以它有两个不同的方法。
      超类无法访问someMethod(),因为它没有扩展任何类。

      子类属于超类类型,超类定义了someMethod(int)@DanielMesejo,但这是否意味着编译器会考虑继承性?编译器如何考虑继承?是的,编译器考虑继承,因为它是Java语言的编译器,Java语言定义继承。现在,编译器如何解决继承问题这是一个广泛的问题,您可以认为编译器跟踪RITS中给定类的每个类的每个定义,并将这些定义添加到子类中。但这是否意味着编译器考虑了继承性?编译器如何考虑继承性?我不确定你的疑问
      编译器如何考虑继承关系?
      但是编译器在编译过程中通过验证所有规则(OOPS,语法)生成所有类的字节码@ankuragarwal通过编辑更新问题。编译器是如何考虑继承性的?编译器将Java代码转换为字节码,并在这一点上进行一些检查和优化,我相信正是在这一点上,它通过分析组合、继承、,在其他问题中,查看一个关于Java JIT编译器Juliano的更多信息的链接,只是为了澄清一下,您发布的链接是针对JIT编译器的(在运行时起作用),而
      javac
      考虑了
      inheritance
      (非JIT).我找到了这个关于OpenJDK编译的链接,其中显示了一个解析器并进入阶段,这可能是类之间进行继承验证的地方。