理解继承和关键字"扩展"

xhe*_*nry 7 java

我是初学者,目前正在阅读继承和多态.我对关键字"extend"以及如何调用构造函数感到困惑.这是代码:

public class Test {
  public static void main(String[] args) {
    new B();
  }
}

class A {
  int i = 7;

  public A() {
    System.out.println("i from A is " + i);
  }

  public void setI(int i) {
    this.i = 2 * i;
  }
}

class B extends A {
  public B() {
    setI(20);
    System.out.println("i from B is " + i);
  }

  public void setI(int i) {
    this.i = 3 * i;
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道通过在第3行调用B(),调用类A的构造函数,然后调用B(是吗?)因此它显示"i来自A是7"然后"i来自B是60".但有人可以解释这个的重要性吗?为什么B中的int i与A中的i完全不同?再一次,我遇到了新行B()之后的代码"路径".如果有人可以在调用B()之后解释每一步,那将非常感激.

The*_*kis 10

我遇到新行B()之后的代码"路径"时遇到问题.如果有人可以在调用B()之后解释每一步,那将非常感激.

在调用时new B(),流技术上B()首先进入构造函数.Java中的构造函数总是需要(最终)链接到更高的构造函数(递归地直到达到最高类Object).链接用super(...)this(...)语句表示为构造函数的第一个语句.如果没有明确写入,super()则假定无参数.所以,B()实际编译好像是这样编写的:

  public B() {
    super();
    setI(20);
    System.out.println("i from B is " + i);
  }
Run Code Online (Sandbox Code Playgroud)

现在,你可以清楚地看到,new B()调用B()它调用A()(它调用println并退出),然后setI最后println.

为什么B中的int i与A中的i完全不同?

i是完全相同的领域.不同之处在于您setI(20)在两个打印输出之间调用了这一事实,从而改变了它的值i.如果您将通话移除setI,您将看到该值仍然存在7.