gpt4 book ai didi

java - 变量多态性中的初始化

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:17 24 4
gpt4 key购买 nike

假设您有以下代码

class A {
int i = 4;

A() {
print();
}

void print () {
System.out.println("A");
}
}

class B extends A {
int i = 2; //"this line"

public static void main(String[] args){
A a = new B();
a.print();
}

void print () {
System.out.println(i);
}
}

这将打印 0 2

现在,如果您删除标记为“此行”的行代码将打印 4 4

  • 我明白如果没有 int i=2;行,

A a = new B(); 将调用类 A,将 i 初始化为 4,调用构造函数,
它将控制权交给 class B 中的 print() 方法,最后打印 4。

a.print() 将调用 B 类中的 print() 方法,因为这些方法将在运行时绑定(bind),这也将使用在 A 类中定义的值, 4.

(当然,如果我的推理有任何错误,请告诉我)

  • 但是,我不明白的是是否有 int i=2。

为什么如果插入代码,第一部分(创建对象)会突然打印 0 而不是 4?为什么不把变量初始化为i=4,而是赋默认值?

最佳答案

它是 Java 中几种行为的组合。

  1. 方法覆盖
  2. 实例变量阴影
  3. 构造函数顺序

我将简单地浏览一下您的代码中发生的事情,看看您是否理解。

您的代码在概念上看起来像这样(跳过 main()):

class A {
int i = 0; // default value

A() {
A::i = 4; // originally in initialization statement
print();
}

void print () {
System.out.println("A");
}
}

class B extends A {
int i = 0; // Remember this shadows A::i

public B() {
super();
B::i = 2;
}

void print () {
System.out.println(i);
}
}

所以,当在你原来的 main() 中,你调用 A a = new B(); 时,它正在构造一个 B , 发生这种情况:

  • A::iB::i 都是默认值0
  • super(),表示A的构造函数被调用
    • A::i 设置为 4
    • print() 被调用。由于后期绑定(bind),它绑定(bind)到 B::print()
    • B::print() 试图打印出 B::i,它仍然是 0
  • B::i 设置为 2

然后当您在 main() 中调用 a.print() 时,它会绑定(bind)到 B::print()正在打印出 B::i(此时为 2)。

因此你看到的结果

关于java - 变量多态性中的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39693922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com