本文将继上一篇文章《Java 对象的初始化过程_上》进一步讲述Java 对象的初始化过程。
首先创建两个父子关系的类
Animal.java
package cn.ttext.test.init;
public class Animal {
//体重
private int weight;
static {
System.out.println("Animal 静态代码块1");
}
{
System.out.println("Animal 构造代码块1");
}
public Animal(){
System.out.println("Animal 构造函数");
}
static {
System.out.println("Animal 静态代码块2");
}
{
System.out.println("Animal 构造代码块2");
}
}
Person.java
package cn.ttext.test.init;
public class Person extends Animal{
private String name;
private int age;
private String sex;
static {
System.out.println("Person 静态代码块1");
}
{
System.out.println("Person 构造代码块1");
}
public Person() {
System.out.println("Person 构造函数");
}
static {
System.out.println("Person 静态代码块2");
}
{
System.out.println("Person 构造代码块2");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
编译后的代码
Animal.class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package cn.ttext.test.init;
public class Animal {
private int weight;
public Animal() {
System.out.println("Animal 构造代码块1");
System.out.println("Animal 构造代码块2");
System.out.println("Animal 构造函数");
}
static {
System.out.println("Animal 静态代码块1");
System.out.println("Animal 静态代码块2");
}
}
Person.class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package cn.ttext.test.init;
public class Person extends Animal {
private String name;
private int age;
private String sex;
public Person() {
System.out.println("Person 构造代码块1");
System.out.println("Person 构造代码块2");
System.out.println("Person 构造函数");
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
static {
System.out.println("Person 静态代码块1");
System.out.println("Person 静态代码块2");
}
}
观察到,编译后的代码出现的现象和上一篇所说的一样,所以直接写个Main方法运行一下。
Main.java
package cn.ttext.test.init;
public class Main {
public static void main(String[] args) {
new Person();
System.out.println();
new Person();
}
}
看到控制台的结果后,那就可以总结一下new Person()做了什么事了!
第二次new Person 没有经历类加载的过程,因为已经加载过一次存到内存中了,所以第二次new 就不需要再加载类了,所以静态代码块中的代码就没有运行。