继承是如何在Java中实现的?

继承是如何在Java中实现的?,java,inheritance,implementation,Java,Inheritance,Implementation,继承到底是如何在Java中实现的?例如,考虑这一点: class A { public void foo() { System.out.print("A"); } } class B extends A { ... } class Test { public static void main(String[] args) { B test = new B(); test.foo(); // how is foo()

继承到底是如何在Java中实现的?例如,考虑这一点:

class A {
    public void foo() {
         System.out.print("A");
    }
}
class B extends A {
    ...
}
class Test {
    public static void main(String[] args) {
        B test = new B();
        test.foo(); // how is foo() called?
}
在这行下面,编译器会将A.foo()的定义转储到类B的主体中吗?像

class B extends A {
    ...
    public void foo() {
         System.out.print("A");
    }
}

还是foo在A班被人查了一下然后打电话到了那里

方法体不会复制到子类的未定义方法体中。相反,当你打电话时

B test = new B();
test.foo();
它将通过其层次结构进行查看,每次找不到实现时都会向上一个级别。
首先,它将检查没有实现的
B
。一个级别高于一个
A
,它会使用这个级别。

方法体不会复制到子类的未定义方法体中。相反,当你打电话时

B test = new B();
test.foo();
它将通过其层次结构进行查看,每次找不到实现时都会向上一个级别。
首先,它将检查没有实现的
B
。一个级别高于一个级别,有一个
A
可以,所以它将使用这个级别。

这可能会对您有所帮助,来自Ivor Horton的《Java 7之初》一书的解释

我在本章开头说过,派生类扩展了基类。这不仅仅是行话,而是 他真的这么做了。正如我多次说过的,继承关系到基类的成员是什么 可在派生类中访问,而不是派生类对象中存在的基类成员。对象 子类包含原始基类的所有成员,以及您定义的任何新成员 在派生类中。如图6-3所示


这可能对您有所帮助,来自Ivor Horton的《Java 7的起源》一书的解释

我在本章开头说过,派生类扩展了基类。这不仅仅是行话,而是 他真的这么做了。正如我多次说过的,继承关系到基类的成员是什么 可在派生类中访问,而不是派生类对象中存在的基类成员。对象 子类包含原始基类的所有成员,以及您定义的任何新成员 在派生类中。如图6-3所示


B.foo()
首先不会编译,因为它不是静态方法。你是说
test.foo()
?(但不,编译器不复制方法实现…)B.foo();根本不编译。Oops。我是说test.foo();检查更新的版本。@Jon:那么,对foo()的调用在行下会是什么样子呢?你什么时候说的“行下”?
B.foo()首先不会编译,因为它不是一个静态方法。你是说
test.foo()
?(但不,编译器不复制方法实现…)B.foo();根本不编译。Oops。我是说test.foo();检查更新的版本。@Jon:那么,对foo()的调用看起来如何?你说的“线下”是指什么时候?至少在概念上是这样。我希望VM会为每种类型构建一个查找表,以提高效率,但效果是一样的。我认为继承是通过使用设计模式责任链实现的,当编译器找到重新定义时,它会将方法的代码放入类中,而当它没有找到重新定义时,它生成一个方法,该方法将委托给与super.foo()等价的基类;至少在理论上是这样。我希望VM会为每种类型构建一个查找表,以提高效率,但效果是一样的。我认为继承是通过使用设计模式责任链实现的,当编译器找到重新定义时,它会将方法的代码放入类中,而当它没有找到重新定义时,它生成一个方法,该方法将委托给与super.foo()等价的基类;