gpt4 book ai didi

java - java中的初始化顺序,继承和重写字段

转载 作者:行者123 更新时间:2023-11-29 03:16:58 25 4
gpt4 key购买 nike

class A {
static int c = 7;
int a = 0;

public A() {
c = c + 2;
a = c;
}

public int m(int x){
return a * --x;
}

}


class B extends A{
int a = 13;
static int c = 1;
public B(){
c = c*3;
a = c;

}

public int m (int x){
return --a * ++x;
}

public static void main(String[] args) {
A o1 = new A();
A o2 = new B();
B o3 = new B();

System.out.println(o1.a);
System.out.println(o1.m(o1.a));
System.out.println(o1.a);
System.out.println(c);
System.out.println(o2.a);
System.out.println(o2.m(5));
System.out.println(o2.a);
System.out.println(c);
System.out.println(o3.a);

}
}

我知道动态和静态绑定(bind),但我不明白它在这个例子中是如何工作的(覆盖静态字段)。我真的很惊讶为什么 o2.m = 12,而 o3.a = 9!这些类的 c 字段是分开的吗? B 构造函数中使用了哪些字段?如果我写 A o1 = new B() 或 B o1 = new B() 有区别吗?请解释它是如何工作的。

最佳答案

如果我写 A o1 = new B()B o1 = new B() 有区别吗?

是的,

A o1 = new B(); calls methods of `B` and fields of A.
B o1 = new B(); calls methods of `B` and fields of B.

即,字段引用根据引用类型解析,方法调用根据对象类型解析(动态)。

关于java - java中的初始化顺序,继承和重写字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969519/

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