类和实例初始化
类初始化
1. 一个类要 创建实例 需要先 加载 并 初始化 该类
- main方法所在类需要先 加载 和 初始化
2. 一个子类要初始化需要先初始化父类
3. 一个类初始化就是执行<clinit>()方法
- <clinit>()方法由 静态类变量显示赋值代码 和 静态代码块组成
- 静态类变量显示赋值代码 和 静态代码块 代码 从上到下 顺序执行
- <clinit>()方法只执行一次
/**
* 父类初始化<clinit>;
* 1.父类j = method();
* 2.父类静态代码块
*/
public class Father {
private int i = test();
private static int j = method();
static {
System.out.println("(1)");
}
Father(){
System.out.println("(2)");
}
{
System.out.println("(3)");
}
private int test() {
System.out.println("(4)");
return 1;
}
private static int method() {
System.out.println("(5)");
return 1;
}
}
/**
* 子类初始化<clinit>;
* 1.子类j = method();
* 2.子类静态代码块
* 先初始化父类 (5)(1)
*初始化子类(10)(6)
*/
public class Son extends Father {
private int i = test();
private static int j = method();
static {
System.out.println("(6)");
}
Son(){
System.out.println("(7)");
}
{
System.out.println("(8)");
}
private int test() {
System.out.println("(9)");
return 1;
}
private static int method() {
System.out.println("(10)");
return 1;
}
public static void main(String[] args) {
// Son s1 = new Son();
// System.out.println();
// Son s2 = new Son();
}
}
实例初始化过程
1.实例初始化就是执行<init>()方法
- <init>()方法可能重载有多个,有几个构造器就有几个<init>()方法
- <init>()方法由非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成
- 非静态实例变量显示赋值代码和非静态代码块从上到下顺序执行,而对应构造器代码最后执行
- 每次创建实例对象,调用对应构造器,执行的就是对应的<init>方法
- <init>方法的首行是super()或super(是参列表),即对应父类的<init>方法
package com.company;
/**
* 父类初始化<clinit>;
* 1.父类j = method();
* 2.父类静态代码块
*
*
* 父类实例化方法:
* 1.super();(最前)
* 2.i = test();
* 3.父类非静态代码块
* 4.父类无参构造器(最后)
*
* 非静态方法前面有一个默认的对象this
* this在构造器表示正在创建的对象,这里创建Son对象
* 所以test()执行的是子类重写的代码(面向对象多台)
*/
public class Father {
private int i = test();
private static int j = method();
static {
System.out.println("(1)");
}
Father(){
System.out.println("(2)");
}
{
System.out.println("(3)");
}
public int test() {
System.out.println("(4)");
return 1;
}
private static int method() {
System.out.println("(5)");
return 1;
}
}
package com.company;
/**
* 子类初始化<clinit>;
* 1.子类j = method();
* 2.子类静态代码块
* 先初始化父类 (5)(1)
*初始化子类(10)(6)
*
* 子类实例化方法<init>:
* 1.super();(最前)(9) (3) (2)
* 2.i = test();(9)
* 3.子类非静态代码块(8)
* 4.子类无参构造器(最后)(7)
*
*/
public class Son extends Father {
private int i = test();
private static int j = method();
static {
System.out.println("(6)");
}
Son(){
//super();子类构造器中一定会调用父类构造器,写或不写
System.out.println("(7)");
}
{
System.out.println("(8)");
}
public int test() {
System.out.println("(9)");
return 1;
}
private static int method() {
System.out.println("(10)");
return 1;
}
public static void main(String[] args) {
Son s1 = new Son();
System.out.println();
// Son s2 = new Son();
}
}