gpt4 book ai didi

java - 变量多态性的初始化

转载 作者:行者123 更新时间:2023-12-01 18:23:24 25 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,调用构造函数,
它将控制权交给 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/60268009/

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