静态块中的变量是静态的还是非静态的

时间:2017-02-25 20:21:58

标签: java

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);
}

O / P:30 三十 我知道静态阻塞在类加载时首先被初始化,并且它们从上到下初始化.A类中的第一个foo将被识别,然后将识别B类中的foo,然后最终将识别静态块中的foo.Now foo在A中将初始化为20并且现在foo在子类B中变为30并且最终foo在静态块中将被初始化为40。所以我的问题是为什么o / p不是40因为最后foo具有值40.来自A的foo继承B类或者将两个类共享foo作为具有相同的变量。静态块中的foo是不同的或相同的。我是新手,所以请正确地理解我的概念

2 个答案:

答案 0 :(得分:0)

您可以访问第一个变量A.foo。第二 - B.foo。第三个会在静止块结束后消失。

答案 1 :(得分:0)

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

static {
     foo = 40;
    }

比输出为40

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