分析如下代码,正确的选项是( )。 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); } @Override public void setI(int i) { this.i = 3 * i; } } A. A的构造方法未被调用。 B. A的构造方法被调用,并且输出 "i from A is 7"。 C. A的构造方法被调用,并且输出"i from A is 40"。 D. A的构造方法被调用,并且输出"i from A is 60"。
时间: 2024-04-02 17:36:05 浏览: 130
public class Test.docx
正确的选项是B,A的构造方法被调用,并且输出 "i from A is 7"。
在`main`方法中创建了一个`B`对象,因此会调用`B`的构造方法。`B`的构造方法中调用了`setI`方法,并传入了参数`20`。由于`setI`方法在`B`类中被覆盖了,因此会调用`B`类中的`setI`方法。在`setI`方法中,将成员变量`i`的值设置为`3 * 20 = 60`。因此,`i`的值为`60`。
在`B`的构造方法执行完毕后,会调用父类`A`的构造方法。在`A`的构造方法中,输出语句会输出"i from A is 7",因为此时成员变量`i`的值为`7`,而不是`60`。这是因为,在对象初始化时,成员变量的初始化是在构造方法之前完成的。
因此,正确的选项是B。
阅读全文