zoukankan      html  css  js  c++  java
  • static及类的加载初始化、对象初始化的顺序。

    static用来修饰静态的变量、方法、(静态内部类)

    被static修饰的元素所有对象仅此一份,存储在方法区。

    被static修饰的属性在类加载的时候就初始化好了。

    被static修饰的方法和属性可以直接使用类名.方法名/属性名调用

    一般用于对象之间共享数据吧。

    静态方法中只能使用静态变量,它内部也没有this引用,因为它不属于任何一个对象。

    只能使用静态变量的原因是,可能使用方法时实例变量还没有初始化好

    static方法必须被实现,不能是抽象的。

    static代码块,被用来初始化static变量或者执行某些特定的方法,只会在类加载的时候执行一次。

    感觉static没什么。可以理解为,被static修饰的所有东西都是属于类的,只有这一份的,重点关注以下static代码块,在类加载的时候比较重要。因为,它和类加载有关系哈

    对象初始化的顺序:

      首先是类加载,类加载的过程中为静态变量初始化,以及载入静态方法(先加载父类,再加载子类)

      其次是调用static代码块,static代码块的作用是为静态变量赋值,可以调用静态方法(先调用父类的,再调用子类的)

      然后是初始化对象,先执行非静态代码块,再执行构造函数(也是先调用父类的再调用子类的)

    在这三个过程中,并不是说一次性把父类的所有的初始化方式一次性执行完,而是把所有的对象初始化,分为了这三个阶段。

    但是第一步和第二步只会执行一次,被反复执行的是第三步。

    其实可以分为两个阶段会好理解一点吧;

    第一个阶段是类加载及初始化:

    先加载父类,再加载子类

    首先把所有的类加载进来之后,从父类开始依次向下的初始化类变量。(初始化变量意思是指的,将变量的值设置为程序中所直接 int a = 10,这样的常量。就直接变为10,如果没有写明的话,初始化为零值)

    第二个阶段是对象初始化;:

    (执行静态代码块,从父类到子类,不顾哦这个过程在程序运行时期只会执行一次,执行的时刻是在new这个类的对象之前的时候执行static代码块,并不是在类的加载之后又立马执行)

    对象初始化的话,也是从父类开始初始化,父类初始化完成之后再初始化子类。(先执行父类的非static代码块,然后构造函数,然后子类的非static代码块,构造函数)

    这样就好理解一点啦。

  • 相关阅读:
    leetcode 34 rust
    leetcode 2 rust
    leetcode 1 rust
    leetcode 20 rust
    leetcode 287 rust
    leetcode 18 rust
    lottery抽奖
    webpack
    webpack(7)-生产环境
    webpack(6)-模块热替代&tree shaking
  • 原文地址:https://www.cnblogs.com/mcmx/p/11335911.html
Copyright © 2011-2022 走看看