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


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

    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就不执行了,你们可以打断点试下;

  • 相关阅读:
    明确方向,勇往直前
    每日一笔记之3:QTconnect()
    每日一笔记之2:QT之坐标系统:
    每日一笔记之1:静态成员函数
    QT对话框模式与非模式
    Objective-C-实例变量与属性的关系
    Objective-C编码规范
    CocoaPods的安装与使用
    design_model(18)observe
    design_model(17)state
  • 原文地址:https://www.cnblogs.com/jianwei-dai/p/5765469.html
Copyright © 2020-2023  润新知