Java中的变量阴影,多种情况下为静态/非静态
我最近一直在学习Java课程,我们正在处理程序输出、编译错误等问题。 我自己也尝试过不同的代码,我的实验中有一件事让我很困惑: 首先,主要方法如下所示:Java中的变量阴影,多种情况下为静态/非静态,java,variables,static,output,shadowing,Java,Variables,Static,Output,Shadowing,我最近一直在学习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); } 现在我尝试了这些不同的版
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;}
}
产出如下:
提前谢谢 重要提示:案例4的答案是11 22 在案例3中:当ab=B()执行B的构造函数时,在A中设置静态变量A,使其值为22 在案例4中:类A和类B都有实例字段(A)(实际上类B从类A继承了这个属性),在构造时,首先执行类A的构造函数,然后执行类B的构造函数,所以当我们有A=B()时,类A的第一个构造函数将变量A设置为11,然后类B的构造函数将其设置为22
子类中的静态字段不重写父类中的静态字段如果访问静态字段,它们只会隐藏父类中的静态字段结果不取决于对象本身的类型,而是取决于用于访问该对象的引用的类型因此当您编写A=B()时,如果A和B都有静态字段A,a.a的结果是a类中的a而不是B类中的a,因为您用于访问此处对象的引用类型是a,而对象类型本身是B。您在说什么?对于4.)预期输出为“11 22”