父子类静态代码块,非静态代码块,有参,无参构造方法等的执行顺序问题

直接贴测试代码,一目了然:

package com.suning.test;

class Person {
 String name;
 int age;
 {
  System.out.println("父类的非静态代码块");
 }
 static {
  System.out.println("父类的静态代码块");
 }

 Person() {
  System.out.println("父类的无参构造函数");
 }

 Person(String name, int age) {
  this.name = name;
  this.age = age;
  System.out.println("父类的有参数构造函数");
 }

 void eat() {
  System.out.println("父类吃饭");
 }

 }

class Student extends Person {
 int grade;
 {
  System.out.println("子类的非静态代码块");
 }
 static {
  System.out.println("子类的静态代码块");
 }

 Student() {
  // super();//运行子类的要先运行父类无参构造函数,此处省略默认执行父类无参构造函数
  System.out.println("子类的无参构造函数");
 }

 Student(String name, int age, int grade) {
  // super(name,age);//运行子类的有参构造函数要先运行父类的有参构造函数,若父类无有参的,则运行父类无参的构造函数
  this.grade = grade;
  System.out.println("子类的有参数构造函数:" + name + ":" + age + ":" + grade);
 }

 void eat() {
  System.out.println("子类吃饭");
 }

}

public class Test {
 public static void main(String[] args) {
  System.out.println("子类主方法");
  Student s1 = new Student();
  Student s2 = new Student();
  s1.eat();
  s2.eat();
 }

}

运行结果:

子类主方法
父类的静态代码块
子类的静态代码块
父类的非静态代码块
父类的无参构造函数
子类的非静态代码块
子类的无参构造函数
父类的非静态代码块
父类的无参构造函数
子类的非静态代码块
子类的有参数构造函数:张三:19:10001
子类吃饭
子类吃饭

总体来说:一个类里,静态代码块》非静态代码块》无参构造函数(或有参构造函数)

父子类,子类静态代码块在父类静态代码块后执行;

有的童鞋会问为毛 Student s2 = new Student()不执行父类的静态代码块,o my god,初始化静态代码块就执行一次好吗?就是你启web工程时候实例化执行一次,之后再new就不执行了,你们可以打断点试下;

原文地址:https://www.cnblogs.com/jianwei-dai/p/5765469.html