静态块中的变量是否为静态


class A{
public static int foo = 20;
}
class B extends A{
public static int foo = 30;
static {
int foo = 40;
}
}
public class Test {
public static void main(String... args){
B b = new B();
System.out.println(b.foo);
System.out.println(B.foo);
}

操作日期 : 30 30 我知道静态阻止在类加载期间首先初始化,它们从上到下初始化。将识别 A 类中的第一个 foo,然后识别 B 类中的 foo,最后将识别静态块中的 foo。现在 A 中的 foo 将初始化为 20,现在子类 B 中的 foo 将变为 30,最后静态块中的 foo 将初始化为 40 。所以我的问题是为什么 o/p 不是 40,因为最后 foo 的值为 40。从 A 到 B 类的 foo 是继承的,还是将两个类共享 foo 作为具有相同的变量。静态块中的foo不同或相同。我是新手,所以请正确提出我的概念

您可以访问 fist 变量作为A.foo。第二 -B.foo.第三个将在静态块结束后消失。

输出不是 40,因为在静态块中您没有为foo变量分配新值, 但是您正在定义一个不同的变量(这与 A 和 B 类中的foo无关)。 如果你这样做:

static {
foo = 40;
}

比输出为 40

在 A 类的foo和 B 类的foo之间发生的事情称为"隐藏变量"。 这是当您在子类中定义与父类中的变量同名的变量时。 (但这被认为是一种糟糕的编码实践,因为它使代码非常混乱)

最新更新