zoukankan      html  css  js  c++  java
  • 静态代码块、构造代码块、构造方法、静态方法等(父子类)执行顺序

    验证结果:静态代码块>构造代码块>构造方法>静态方法>普通代码块

    验证代码如下
    public class Son extends Father {
    
        private String name;
    
        public Son(String name) {
            super(name);
            this.name = name;
            System.out.println("子类带参数构造");
        }
    
        public Son() {
            System.out.println("子类不带参数构造");
        }
    
        public static void say() {
            System.out.println("我是子类静态方法");
        }
    
        public void sayHello() {
            System.out.println("我是子类成员方法");
        }
    
        static {
            System.out.println("子类静态代码块1");
        }
        static {
            System.out.println("子类静态代码块2");
        }
        {
            System.out.println("子类构造代码快");
        }
    
        public static void main(String[] args) {
            System.out.println("-------------分隔线:执行无参对象创建及方法(第一次)-------------------");
            Father father1 = new Son();
            father1.sayHello();
            System.out.println("-------------分隔线:执行无参对象创建及方法(第二次)-------------------");
            Father father2 = new Son();
            father2.sayHello();
            System.out.println("-------------分隔线:执行带参对象创建及方法-------------------");
            Father father3 = new Son("Carson");
            father3.sayHello();
            System.out.println("-------------分隔线:执行静态方法-------------------");
            Son.say();
        }
    }
    
    class Father {
        private String name;
    
        public Father(String name) {
            this.name = name;
            System.out.println("父类带参数构造");
        }
    
        public Father() {
            System.out.println("父类不带参数构造");
        }
    
        public static void say() {
            System.out.println("我是父类静态方法");
        }
    
        public void sayHello() {
            System.out.println("我是父类成员方法");
        }
    
        static {
            System.out.println("父类静态代码块1");
        }
        static {
            System.out.println("父类静态代码块2");
        }
        {
            System.out.println("父类构造代码快");
        }
    }
    
    执行结果如下
    父类静态代码块1
    父类静态代码块2
    子类静态代码块1
    子类静态代码块2
    -------------分隔线:执行无参对象创建及方法(第一次)-------------------
    父类构造代码快
    父类不带参数构造
    子类构造代码快
    子类不带参数构造
    我是子类成员方法
    -------------分隔线:执行无参对象创建及方法(第二次)-------------------
    父类构造代码快
    父类不带参数构造
    子类构造代码快
    子类不带参数构造
    我是子类成员方法
    -------------分隔线:执行带参对象创建及方法-------------------
    父类构造代码快
    父类带参数构造
    子类构造代码快
    子类带参数构造
    我是子类成员方法
    -------------分隔线:执行静态方法-------------------
    我是子类静态方法
    

    有这么几点说明

    (下面所说的,对象的创建,是new出来的对象)

    • 静态代码块
      • 不管对象创建几次(或者说不管创不创建对象),只执行一次,且优先级最高(因为在对象创建之前就已加载完毕)
      • 多个静态代码块按代码顺序来执行
    • 构造代码块
      • 创建几次对象就执行几次,优先级在静态代码块之后,在构造方法之前执行
    • 构造方法
      • 创建几次就执行几次,在静态方法之前执行
    • 静态方法
      • 在构造方法之后执行(因为类得先加载出来,才能执行此类的静态方法。然而在加载该类时,构造代码块和构造方法就执行了)
    整个过程都是父比子先执行,且构造代码块和构造方法是整体的父先子后的顺序
  • 相关阅读:
    复数加法
    通过函数来实现复数相加
    声明一个类模板
    友元成员函数的简单应用
    将普通函数声明为友元函数
    引用静态数据成员
    对象的赋值
    对象的常引用
    有关对象指针的使用方法
    对象数组的使用方法
  • 原文地址:https://www.cnblogs.com/dulinan/p/12033006.html
Copyright © 2011-2022 走看看