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

Java 静态块中的变量是否为静态,java,Java,O/p:30 30 我知道静态块首先在类加载期间初始化,并且从上到下进行初始化。首先识别类中的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。第二

O/p:30 30
我知道静态块首先在类加载期间初始化,并且从上到下进行初始化。首先识别类中的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
无关)。 如果您愿意这样做:

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);
}
输出量将是40

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

两者都不是。在静态块中声明的变量是局部变量,这意味着它仅在声明块中可见,因此既不是静态字段,也不是实例字段。这三个
foo
彼此完全无关,它们只有相同的名称。更改它们的名称,看看
b.foo
b.foo
实际上指的是什么。我建议阅读有关变量范围或generalIt的静态初始化块中的变量/字段的内容。初始化发生在类加载之后,而不是在加载期间。没有int说明符的静态块中的foo在父类和子类之间共享或不共享否,它不共享。当您在静态块中写入
foo=40
时,您只是将这个新值赋给B类的
foo
变量<类的code>foo仍然是20。我在静态块中有B.foo和一个foo,所以这两个同名变量指向内存中相同或不同的位置。内存中的Java位置是隐藏的,所以您无法从程序中管理它。要在staticblock中更改
A.foo
ore
B.foo
,您应该在编写
static{A.foo=55;B.foo=125;}
时编写
static{int foo=40;}
这个词
int
表示您声明了新变量。
static {
     foo = 40;
    }