我是初学者,目前正在阅读继承和多态.我对关键字"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.
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |