定义一个类
public class Animal {
private String attr1 = "我是一个成员变量";
private static String attr2 = "[我是一个静态成员变量]";
{
System.out.println("我是一个代码块,在调用构造方法之前执行");
}
static {
System.out.println("我是一个静态代码块,随着类加载而加载:" + attr2);
}
public Animal() {
System.out.println("調用無參數構造方法");
}
public Animal(String attr1) {
this.attr1 = attr1;
System.out.println("調用有參數構造方法" + attr1);
}
public String getAttr1() {
return attr1;
}
public void setAttr1(String attr1) {
this.attr1 = attr1;
}
public static void main(String[] args) {
new Animal();
}
}
执行结果:
我是一个静态代码块,随着类加载而加载:[我是一个静态成员变量]
我是一个代码块,在调用构造方法之前执行
調用無參數構造方法
加一个继承类看看效果
package com.pss;
public class Person extends Animal {
private String attr1 = "我是一个成员变量PERSON";
private static String attr2 = "[我是一个静态成员变量PERSON]";
{
System.out.println("我是一个代码块PERSON,在调用构造方法之前执行");
}
static {
System.out.println("我是一个静态代码块PERSON,随着类加载而加载:" + attr2 + "->" + getAttr2());
}
public Person() {
System.out.println("調用無參數構造方法PERSON");
}
public Person(String attr1) {
this.attr1 = attr1;
System.out.println("調用有參數構造方法PERSON" + attr1);
}
public String getAttr1() {
return attr1;
}
public void setAttr1(String attr1) {
this.attr1 = attr1;
}
public static String getAttr2() {
return attr2;
}
public static void setAttr2(String attr2) {
Person.attr2 = attr2;
}
public static void main(String[] args) {
new Person();
new Person("hello");
}
}
我是一个静态代码块,随着类加载而加载:[我是一个静态成员变量]
我是一个静态代码块PERSON,随着类加载而加载:[我是一个静态成员变量PERSON]->[我是一个静态成员变量PERSON]
我是一个代码块,在调用构造方法之前执行
調用無參數構造方法
我是一个代码块PERSON,在调用构造方法之前执行
調用無參數構造方法PERSON
我是一个代码块,在调用构造方法之前执行
調用無參數構造方法
我是一个代码块PERSON,在调用构造方法之前执行
調用有參數構造方法PERSONhello
所以总结几点:
1、static变量是在方法区中,在类加载的时候静态代码块执行。
2、代码块在调用构造方法前执行。
3、再调用子类构造方法时,会默认调用父类构造方法。
4、类的加载顺序 父类静态成员变量 -> 父类静态方法 -> 父类静态代码块 -> 子类静态成员变量 -> 子类静态方法 -> 子类静态代码块 -> 父类成员变量 -> 父类方法 -> 父类代码块 -> 父类构造方法 -> 子类成员变量 -> 子类方法 -> 子类代码 -> 子类构造方法