Son和Father(代码块,静态代码块,构造方法,实例变量,静态变量)
上代码(Son和Father)
public class Father {
private int i = test();
private static int j = method();
static {
System.out.print("(1) ");
}
Father(){
System.out.print("(2) ");
}
{
System.out.print("(3) ");
}
public int test() {
System.out.print("(4) ");
return 1;
}
public static int method() {
System.out.print("(5) ");
return 1;
}
}
public class Son extends Father{
private int i = test();
private static int j = method();
static {
System.out.print("(6) ");
}
Son(){
System.out.print("(7) ");
}
{
System.out.print("(8) ");
}
public int test() {
System.out.print("(9) ");
return 1;
}
public static int method() {
System.out.print("(10) ");
return 1;
}
public static void main(String[] args) {
Son s1 = new Son();
System.out.println();
Son s2 = new Son();
}
}
上结果(猜猜看,嘿哈)心塞,本人做了两次了,还是结果不对 ^……^
(5) (1) (10) (6) (9) (3) (2) (9) (8) (7)(9) (3) (2) (9) (8) (7)
知识点梳理
1、一个类要创建实例需要先加载并初始化该类;
a.main方法所在的类需要先加载和初始化;
2、一个子类要初始化需要先初始化父类;
3、一个类初始化就是执行<clinit>()方法;
a.<clinit>()方法由静态类变量显示赋值代码和静态代码块组成;
b.类变量显示赋值代码和静态代码块从上到下顺序执行;
c.<clinit>()方法只执行一次;
实例初始化过程:
1、实例初始化就是执行<init>()方法;
a.<init>()方法可能重载有多个,有几个构造器就有几个<init>()方法;
b.<init>()方法由非静态实例变量显示赋值代码和非静态代码块组成、对应构造器代码组成;
c.非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应的构造器的代码最后执行;
d.每次创建实例对象,调用对应构造器,执行的就是对应的<init>()方法;
e.<init>方法的首行是super()或super(实参列表),即对应父类的<init>方法;