zoukankan      html  css  js  c++  java
  • java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题

    今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题

    首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载

    当时做了这么一个小案例(想必这个大多数学java的都做过,不知道是否都理解了)

    class Fu{
        static {
            System.out.println("Fu static code");
        }
        {
            System.out.println("Fu code");
        }
        public Fu(){
            System.out.println("Fu GouZao");
        }
    }
    
    class Zi extends Fu{
        static {
            System.out.println("Zi static code");
        }
        {
            System.out.println("Zi code");
        }
        public Zi(){
            System.out.println("Zi GouZao");
        }
    }
    
    public class Text{
        public static void main(String[] args) {
            Zi zi = new Zi();
        }
    }

    1,在编译Text.java时,先加载了Fu类,因此Fu类的静态代码块首先执行,而后加载Zi类,Zi类的静态代码块执行,这没什么好说的

    2,然后创建Zi的对象,大家都知道构造代码块优先于构造方法执行,这时候问题来了,这时应该先看Zi类的构造方法,Zi类里的构造方法里有一句隐式的super()首先被执行,所以找到Fu类的构造方法,而Fu类的构造方法中也有一句隐式的super()执行(调用Object类的构造方法),并没有什么返回结果,接下来才是在执行Fu类构造方法的方法体前先执行了Fu类的构造代码块(Fu code),再执行Fu类构造方法的方法体(也就是Fu GouZao),最后又回到Zi类的构造方法中,这时Zi类的super()已经执行完了,在执行Zi类构造方法的方法体前先执行Zi类的构造代码块(Zi code),再执行Zi类构造方法的方法体(Zi GouZao)

    最后的结果是:

    Fu static code
    Zi static code
    Fu code
    Fu GouZao
    Zi code
    Zi GouZao

    不知道大家绕晕了没有,我在这再总结一下:静态的是与类有关,肯定先加载,而构造代码块执行前要先看构造方法中是否有this()或super(),有的话在其之后执行,最后执行构造方法的方法体

    (有理解不对的地方还请大家指点,一起交流探讨)

  • 相关阅读:
    关于前期开发
    unity3d-知识汇总
    unity3d 第一人称脚本解释:MouseLook
    unity3d-游戏实战突出重围,整合游戏
    unity3d-游戏实战突出重围,第四天 添加角色
    unity3d-游戏实战突出重围,第三天 绘制数字
    unity3d-游戏实战突出重围,第二天 制作血条
    unity3d-游戏实战突出重围,第一天
    unity3d-解密加密数据
    unity3d-代码控制游戏角色控制器移动
  • 原文地址:https://www.cnblogs.com/cxsy/p/5356514.html
Copyright © 2011-2022 走看看