Java 中的变量阴影,多个案例 static/non 静态
Variable shadowing in Java, multiple cases static/non static
我最近一直在学习 Java 的课程,我们正在处理程序输出、编译错误等。
我自己尝试过不同的代码,我的实验中有一件事让我很困惑:
首先,主要方法如下所示:
public static void main(String[] args){
A a = new A();
B b = new B();
A ab = new B();
System.out.println(a.a + " " + b.a + " " + ab.a);
}
现在我尝试了这些不同的版本:
//1
public class A {
public static int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public static int a = 2;
public B(){ a = 22;}
}
//------------
//2
public class A {
public int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public static int a = 2;
public B(){ a = 22;}
}
//--------------
//3
public class A {
public static int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public B(){ a = 22;}
}
//-----------
//4
public class A {
public int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public B(){ a = 22;}
}
输出如下:
11 22 11
11 22 11
3: 11 22 22
- 22 22 22
虽然我能理解输出 1 和 2,但 3 和 4 真的让我感到困惑。
对于3:B中的a = 22,为A对象ab改变了a的值,因为在B中没有再次声明int a?
而对于4:如果A中的int a不是静态的,而a是A类型的对象,为什么a.a有b.a的价值?当我将 int a 设置为非静态时,4 中发生了什么?
提前致谢!
重要提示:案例 4 的答案是 11 22 22
情况3:当A ab = B()执行B的构造函数时,设置A中的静态变量a,使其值为22。
情况4:classes A和B都有实例字段(a)(实际上class B从class A继承了这个属性)并且在构造时首先Class A 的构造函数执行,然后 class B 的构造函数,所以当我们有 A a = B() class A 的第一个构造函数时,将变量 a 设置为 11 然后 class B 设置为22
子项中的静态字段 class 不要覆盖父项中的静态字段 class 它们只是隐藏父项中的静态字段 class 如果您访问静态结果不取决于对象的类型本身,但它取决于您用来访问该对象的引用类型,因此当您编写 A a = B() 时,如果 A 和 B 都具有静态字段 a,则 a.a 的结果是 [=17 中的 a =] A 不是 class B 中的 a 因为你在这里访问对象的引用类型是 A,而对象类型本身是 B.
我最近一直在学习 Java 的课程,我们正在处理程序输出、编译错误等。 我自己尝试过不同的代码,我的实验中有一件事让我很困惑: 首先,主要方法如下所示:
public static void main(String[] args){
A a = new A();
B b = new B();
A ab = new B();
System.out.println(a.a + " " + b.a + " " + ab.a);
}
现在我尝试了这些不同的版本:
//1
public class A {
public static int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public static int a = 2;
public B(){ a = 22;}
}
//------------
//2
public class A {
public int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public static int a = 2;
public B(){ a = 22;}
}
//--------------
//3
public class A {
public static int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public B(){ a = 22;}
}
//-----------
//4
public class A {
public int a = 1;
public A() {
a = 11;
}
}
public class B extends A {
public B(){ a = 22;}
}
输出如下:
11 22 11
11 22 11
3: 11 22 22
- 22 22 22
虽然我能理解输出 1 和 2,但 3 和 4 真的让我感到困惑。
对于3:B中的a = 22,为A对象ab改变了a的值,因为在B中没有再次声明int a?
而对于4:如果A中的int a不是静态的,而a是A类型的对象,为什么a.a有b.a的价值?当我将 int a 设置为非静态时,4 中发生了什么?
提前致谢!
重要提示:案例 4 的答案是 11 22 22
情况3:当A ab = B()执行B的构造函数时,设置A中的静态变量a,使其值为22。
情况4:classes A和B都有实例字段(a)(实际上class B从class A继承了这个属性)并且在构造时首先Class A 的构造函数执行,然后 class B 的构造函数,所以当我们有 A a = B() class A 的第一个构造函数时,将变量 a 设置为 11 然后 class B 设置为22 子项中的静态字段 class 不要覆盖父项中的静态字段 class 它们只是隐藏父项中的静态字段 class 如果您访问静态结果不取决于对象的类型本身,但它取决于您用来访问该对象的引用类型,因此当您编写 A a = B() 时,如果 A 和 B 都具有静态字段 a,则 a.a 的结果是 [=17 中的 a =] A 不是 class B 中的 a 因为你在这里访问对象的引用类型是 A,而对象类型本身是 B.