class A的方法f没有执行,对象的成员属性如果是int,会给它一个默认值0。引申一下修改了你的原始代码:
[code="java"]class A {
static int a_static = 20 ;
static{
System.out.println("执行A的静态代码块");
System.out.println("class A 输出 a_static---"+a_static);
}
{
System.out.println("执行A的普通代码块");
}
int a = f();
int f() {
System.out.println("f()");
return 1;
}
public A(){
System.out.println("执行A的构造方法");
}
}
class B extends A {
int b = 37;
{
System.out.println("执行B的普通代码块");
}
static int b_static = 10;
static{
System.out.println("执行B的静态代码块");
System.out.println("class B 输出 b_static---"+b_static);
}
int f() {
return b;
}
public B(){
System.out.println("执行B的构造方法");
}
}
public class CtorDemo4 {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.a);
System.out.println(bobj.f());
}
}
[/code]
输出:
执行A的静态代码块
class A 输出 a_static---20
执行B的静态代码块
class B 输出 b_static---10
执行A的普通代码块
执行A的构造方法
执行B的普通代码块
执行B的构造方法
0
37
类中的静态变量和静态代码块,是class级别的变量和代码块,不依赖于类的实例,所以会在构造方法之前进行,也就是在你new对象之前。为了保证类能够正确初始化,非静态代码块会在构造方法进行之前执行。