【发布时间】:2018-10-07 16:12:31
【问题描述】:
在阅读了一些关于继承和方法调用以及编译器如何处理这些的信息后,我感到困惑。因此,如果有人能看看我如何看待事物并纠正我的错误,我将不胜感激。
我们先来看看下面的代码:
A 类:
public class A {
public void testMethodA(String a) {
System.out.println(a);
}
}
B 类:
public class B extends A {
}
主要
public class Main {
public static void main(String[] args) {
B b = new B();
b.testMethodA("test");
}
}
现在让我们来看看我是如何理解事物的(如果我错了请纠正我):
- 在继承期间,当创建子类对象时,您将创建一个对象,该对象接收来自所有超类的所有字段和方法。所以子类的字段和方法在编译时不会从超类转移到子类(来源:Does an instance of superclass get created when we instantiate an object?)
- 在编译期间,编译器检查是否在声明的引用类型中定义了支持参数类型的被调用方法。所以在示例中:
A a = new A(); a.testMethod("test")它会在编译期间检查是否在可以接收 String 的类 A 中定义了 testMethod() > 作为论据。 (来源:How does java compiler choose correct methods and variables in inheritance) - 运行时,testMethod() 会从存储在变量 a 中的实际对象调用,该对象并不总是 A 类型的对象 由于多态性。
现在的实际问题:
根据我上面描述的逻辑和代码,我预计在编译期间会出现 无法解析方法 错误。原因是在编译期间编译器检查类 B 是否存在 testMethodA(String)。然而,这是从类 A 继承的方法,据我了解,继承的方法不会传递给子类,而是在运行时传递给子类的对象。那么如果在编译时testMethodA(String)在类B中不存在,编译器怎么还能成功编译代码呢?当然它不会检查该方法的对象,因为它还没有被创建。
“可能的答案”中没有回答这个问题,因为这个主题是我在描述这个问题时自己标记为知识来源的主题。
【问题讨论】:
-
为什么编译器不应该检查超类(或接口)是否定义了类使用的方法?这个结论对我来说毫无意义。
-
编译器检查类及其所有超类和接口。
-
Joakim 因为如果我不知道编译器有这样的行为,我怎么能提到呢?
-
感谢您的回答彼得劳瑞
标签: java class oop inheritance compiler-construction