• 类初始化的顺序


    类初始化的顺序

    1. 父类静态变量
    2. 父类静态代码块
    3. 子类静态变量
    4. 子类静态代码块
    5. 父类普通变量
    6. 父类普通代码块
    7. 父类构造函数
    8. 子类普通变量
    9. 子类普通代码块
    10. 子类构造函数
    public class Father {
        // 父类静态变量
        public static String str1 = "father static str";
        // 父类普通变量
        public String str2 = "father common str";
        // 父类静态代码块
        static {
            System.out.println("father static block");
        }
        // 父类普通代码块
        {
            System.out.println("father common block");
        }
        // 父类构造方法
        public Father() {
            System.out.println("father constructor");
        }
    }
    
    //然后定义一个子类
    public class Child extends Father {
        // 子类静态变量
        public static String str1 = "child static str";
        // 子类普通变量
        public String str2 = "child common str";
        // 子类静态代码块
        static {
            System.out.println("child static block");
        }
        // 子类普通代码块
        {
            System.out.println("child common block");
        }
        // 子类构造方法
        public Child() {
            System.out.println("child constructor");
        }
    }
    
    // 测试
    public static void main(String[] args) {
            new Child();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    OUTPUT:

    father static block
    child static block
    father common block
    father constructor
    child common block
    child constructor
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    从内存的角度看一下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ZzYB0km-1669081720730)(%E7%B1%BB%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84%E9%A1%BA%E5%BA%8F/64e873addd174f38bde1b48b375946bf-16689927050862.png)]

    从上面可以看到,我们的方法在调用静态方法、变量的时候,是从方法区调用的,但是调用普通变量是从堆内存中调用的,堆内存中的成员变量 lastname 是随着对象的产生而产生,随着对象的消失而消失。静态变量是所有线程共享的,所以不会消失。

    1. static 是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量称之为静态变量或类变量。
    2. static 修饰的成员被所有的对象共享。
    3. static 优先于对象存在,因为static的成员在类的加载时初始化。
    4. static 修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。
    5. static 修饰的数据是共享数据,对象中的变量的是特有的数据。

    成员变量和静态变量的区别

    1. 生命周期的不同:成员变量随着对象的创建而存在随着对象的回收而释放。

    静态变量随着类的加载而存在随着类的消失而消失。

    1. 调用方式不同:成员变量只能被对象调用。

    静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

    1. 别名不同:成员变量也称为实例变量。

    静态变量称为类变量

    1. 数据存储位置不同:成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

    静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

    静态使用时需要注意的事项:

    1. 静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
    2. 静态方法中不可以使用this或者super关键字。
    3. 主函数是静态的
  • 相关阅读:
    HTTP代理与VPN:网络代理技术的比较
    分治算法(divide and conquer)
    安捷伦E9300A射频传感器E9300B
    springboot电气与信息类书籍网上书店 java ssm书籍借阅归还系统
    《心理学报》的《大学生学习适应量表》能用吗?
    做好有限空间管理的五个原则
    数据结构(8)树形结构——B树、B+树(含完整建树过程)
    Linux安装ffmpeg并截取图片和视频的缩略图使用
    Java学习之SpringBoot项目打包成可执行jar
    零零信安-D&D数据泄露报警日报【第40期】
  • 原文地址:https://blog.csdn.net/qq_46371399/article/details/127976808