类初始化过程只在类被加载过程中执行一次,每创建一个对象都会存在实例化过程。下面为尚硅谷紫林燕老师有关类初始化和实例初试化的的一个例子。
/**类加载过程中操作
* 加载main方法所在类
* 1.子类存在父类,则会先先加载父类
* 2.执行<clinit方法>
* clinit方法由静态变量显示赋值和静态代码块
* 执行顺序从上到下
* clinit加载一次只会执行一次
*
*
*实例初始化过程
* 1.执行<init>方法
* 有几个构造函数对应有几个init方法
* init方法由非静态变量赋值、非静态代码块和对应构造函数构成
* 非静态变量赋值和非静态代码块执行顺序从上到下,最后执行构造函数
* 因为在构造函数前面会有super()或者super()参数,在编译号的字节码文件中,也是super()或super(参数位于首行),
* 所以会先执行父类对应的构造函数,也即对应的init方法
*/
public class Son extends Father{
private static int i = test();
private int j = method();
static{
System.out.println("(6)");
}
{
System.out.println("(7)");
}
public Son(){
System.out.println("(8)");
}
public static int test(){
System.out.println("(9)");
return 1;
}
public int method(){
System.out.println("(10)");
return 1;
}
public static void main(String[] args) {
Son son = new Son();
System.out.println("--------------------");
Son son2 = new Son();
}
}
/**类加载过程中操作
* 加载main方法所在类
* 1.子类存在父类,则会先先加载父类
* 2.执行<clinit方法>
* clinit方法由静态变量显示赋值和静态代码块
* 执行顺序从上到下
* clinit加载一次只会执行一次
*
*
*实例初始化过程
* 1.执行<init>方法
* 有几个构造函数对应有几个init方法
* init方法由非静态变量赋值、非静态代码块和对应构造函数构成
* 非静态变量赋值和非静态代码块执行顺序从上到下,最后执行构造函数
* 因为在构造函数前面会有super()或者super()参数,在编译号的字节码文件中,也是super()或super(参数位于首行),
* 所以会先执行父类对应的构造函数,也即对应的init方法
*
* note:由于父类重写了父类的方法,非静态方法前面有一个this关键字,
* this关键字在构造器或者init方法中,表示当前正在创建的对象,虽然在父类中调用method犯法,
* 但private int j = method();语句调用的是子类的method方法
*/
public class Father {
private static int i = test();
private int j = method();
static{
System.out.println("(1)");
}
{
System.out.println("(2)");
}
public Father(){
System.out.println("(3)");
}
public static int test(){
System.out.println("(4)");
return 1;
}
public int method(){
System.out.println("(5)");
return 1;
}
}
哪些方法不能被加载:
1.被final修饰的类
2.被private修饰的类
3.被static修饰的类方法