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是不同的或相同的。我是新手,所以请正确地理解我的概念
答案 0 :(得分:0)
您可以访问第一个变量A.foo
。第二 - B.foo
。第三个会在静止块结束后消失。
答案 1 :(得分:0)
输出不是40,因为在静态块中,您没有为foo
变量赋值,
但是你要定义一个不同的变量(它与A和B类中的foo
无关)。
如果你这样做:
static {
foo = 40;
}
比输出为40
来自A类的foo
和来自B类的foo
之间的事情称为“隐藏变量”。
当你在子类中定义一个与父类中的变量同名的变量时。
(但它被认为是一种糟糕的编码实践,因为它使代码非常混乱)