
前言通过几天的学习我们了解了类和对象的基础知识构造方法及对象的初始化封装的思想包和访问权限修饰符等知识点。今天让我们基于前面的知识开启对static成员与代码块这两部分的学习。一、static的定义static是Java中的一个关键字用来修饰类的成员成员变量、成员方法注意static只能修饰成员变量不能修饰局部变量。被static修饰的成员不属于某个具体的对象而是属于类本身是所有对象所共享的。它不依赖对象而存在即使没有new创建对象也可以直接使用。二、为什么需要static我们先来思考一个场景定义学生类包含姓名、年龄、学号、班级。同一个班级里的所有学生姓名、年龄、学号都是每个人独有的信息但班级是全班所有人共用的属性大家都是2班。如果班级不写static每次new一个学生对象都要单独给班级属性赋值一次每创建一个对象内存里就会单独存一份班级信息重复保存相同的数据很麻烦。这时就可以把班级这个属性加上 static 。static修饰之后这个班级属性不属于某一个学生对象属于整个Student类。内存中只会保存这一份所有学生对象共享这一个值。只要设置一次班级为“2班”后续new出来的所有学生对象都会共用这个班级信息不用每次创建对象重复赋值。总结如果某个属性/方法是这类事物共有的不属于单独某一个实例对象就可以使用static修饰。三、static修饰成员变量static修饰的成员变量成为静态成员变量。【静态成员变量的特性】①不属于某个具体的对象是类的属性所有对象共享的不存储在某个对象的空间中。②既可以通过对象访问也可以通过类名访问但更推荐用类名访问。③类变量存储在方法区当中。④生命周期伴随类的一生即随类的加载而创建随类的卸载而销毁。四、static修饰成员方法static修饰的成员方法称为静态成员方法是类的方法不是某个对象所特有的。静态成员一般是通过静态方法来访问的。【静态方法的特性】①不属于某个具体的对象是类方法。②可以通过对象调用也可以直接用类名.静态方法名(...)方式调用更推荐使用后者。✳③不能在静态方法中直接访问任何非静态成员变量。因为静态方法不依赖于对象可以直接通过类名进行访问但是非静态成员变量依赖于对象不能直接访问。由此可见静态方法中不能直接访问非静态变量但是可以间接访问。因为非静态变量依赖于对象所以可以new一个对象然后通过对象的引用进行访问。✳④不能在静态方法中直接访问任何非静态成员方法。原理和③的原理相同因为静态方法不依赖于对象可以直接通过类名进行访问但是非静态成员方法依赖于对象不能直接调用。由此可见静态方法中也不能直接调用非静态方法同理它可以间接调用。因为非静态方法依赖于对象所以可以new一个对象然后通过对象的引用进行调用。总结③④在静态方法中不能直接访问非静态的成员方法和成员变量。需要new对象通过对象的引用进行间接的访问和调用。反之在非静态方法中可以直接访问静态成员变量调用静态成员方法不需要对象的引用。⑤在静态方法中不能使用this前面我们讲过this代表的是当前引用的对象说明this也依赖于对象只有对象存在时才使用this。而静态方法属于类不依赖任何具体的对象不需要创建对象就能调用没有当前对象自然也就不存在this所以静态方法中不能使用this。五、static成员变量初始化静态成员变量一般不会在构造方法中初始化构造方法中初始化的是与对象相关的实例属性。静态成员变量的初始化分为两种就地初始化和静态代码块初始化。【就地初始化】就地初始化很简单就是在定义时直接给出初始值示例【静态代码块初始化】要想知道什么是静态代码块就要先学习什么是代码块学完之后我们在来讲静态代码块初始化。⬇⬇⬇六、代码块6.1 概念代码块就是用一对大括号 { } 包裹起来的一段代码。6.2 分类根据写的位置、有没有 static 修饰分成三类静态代码块、构造代码块、普通代码块。1.静态代码块类里面方法外面带 static static { }2.构造代码块类里面方法外面不带static直接写 { }3.普通代码块局部代码块写在方法内部的 { }七、静态代码块位置类里面方法外面带 static static { }执行时机类加载的时候自动执行整个程序只跑1次作用专门初始化静态成员变量限制不能用 this 只能访问静态成员八、构造代码块也叫实例代码块位置构造代码块实例代码块 {} 写在类里、方法外面执行时机每次new对象都会自动执行在构造方法之前运行作用提取多个构造方法里重复的初始化代码不用每个构造方法都复制一遍构造代码块一般用于初始化实例成员变量。九、普通代码块位置普通代码块局部代码块 {} 写在方法内部执行时机代码运行走到这个大括号才执行作用缩小局部变量的作用域。大括号里面定义的变量出了大括号直接失效节省内存、避免变量名冲突。十、静态代码块、实例代码块、构造方法的执行顺序核心执行顺序静态代码块 → 实例代码块 → 构造方法示例静态代码块、实例代码块、构造方法的执行顺序和代码编写的前后位置无关。我们来看这段代码注意一个关键点代码写在文件的先后位置不等于执行顺序你看我代码里静态代码块写在了实例代码块、构造方法的后面但是运行时它依旧最先执行。考点总结1. 静态代码块在类加载阶段执行。只要这个类被加载不管它在代码里写在第几行一定最先执行并且整个过程只执行一次。2. 实例代码块每次创建对象的时候执行。 new 对象时实例代码块优先于构造方法运行。3. 构造方法创建对象实例代码块执行完成之后才执行构造方法。---------------------------------------------------------------------------------------------------------------------------------上面代码是只有一个对象的情况下面我们来看看有多个对象时是怎么执行的考点总结1. 程序运行类加载的时候静态代码块最先执行全程只会执行一次。哪怕后面new很多对象静态代码块也不会再次运行。2. 每 new 一个对象时先执行实例代码块再执行构造方法。3. 第二个、第三个对象都会重复执行一轮实例代码块 → 构造方法静态代码块不再重复执行。一句话概括静态代码块随类加载只跑一次每新建一个对象就跑一次实例代码块再跑构造方法。十一、总结本篇我们一起学习了static相关内容。介绍了static的概念与使用场景分别讲解静态成员变量、静态成员方法以及各自的特性、静态成员变量的初始化方法。接着我们认识了代码块区分静态代码块、实例构造代码块普通代码块。介绍它们书写位置、执行时机和作用。最后通过代码验证了静态代码块、实例代码块、构造方法的执行顺序。本篇学习笔记就分享到这里如果文中有描述错误或者理解不对的地方欢迎各位大佬在评论区指正。我们一起加油学习下篇再见拜了个拜