在类加载的时候,静态代码中的语句会执行,在整个类加载的过程中只执行一次,和创建多少个对象没有关系
实例代码块中的语句,经过编译后,会添加到构造方法第一条语句之前
构造方法:每次创建对象时候都会执行
举个简单的例子
- public class Person {
- public String name;
- public String gender;
- public int age;
- public Person(String name,String gender,int age){
- this.name =name;
- this.gender = gender;
- this.age = age;
- System.out.println("基类的构造方法");
- }
-
- {
- System.out.println("基类的实例代码块");
- }
-
- static {
- System.out.println("基类中的静态代码块");
- }
- }
- public class Student extends Person{
- public int id;
-
- public Student(String name,String gender,int age,int id){
- super(name,gender,age);
- this.id = id;
- System.out.println("子类的构造方法");
- }
-
- {
- System.out.println("子类的实例代码块");
- }
-
- static {
- System.out.println("子类的静态代码块");
- }
-
- public static void main(String[] args) {
- Student s1 = new Student("张三","男",24,11111);
- System.out.println("=================================");
- Student s2 = new Student("李四","男",35,11668);
- }
- }
执行结果为:
通过分析执行结果,得出以下结论:
1、父类静态代码块优先于子类静态代码块执行,而且是最早执行
2、父类实例方法和父类构造方法紧接着执行
3、子类的实例代码块和子类的构造方法紧接着再执行
4、第二次实例化对象时,父类和子类的静态代码块都将不会再执行
5、静态代码块先执行,并且只执行一次,在类加载阶段执行
6、如果类没有加载,先加载类:先加载基类,后加载子类,基类的静态代码块先执行,子类的代码块后执行,并且都只执行一次
7、当有对象创建的时候,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行
注意:
1、new哪个类的对象,编译器就会调用该类的构造方法
2、new子类对象:编译器会调用子类的构造方法
a、从基类继承下来的成员变量,通过super()调用基类构造方法
b、子类新增加的成员
3、基类构造方法中的内容先打印,然后子类构造方法中的内容后打印
但是:不能通过打印结果说明 先调用基类的构造方法,后调用子类的构造方法(说法错误)