回顾总结8
Static
使用案例
-
如果希望不创建实例,也可以调用某个方法(即当做工具类来使用),这时,我们做成静态方法非常合适。比如源码里的Math、Arrays、Collections等工具类就是如此。
-
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。
代码块
相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作。
代码块比构造器先执行
代码块属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过{}包裹起来。但是不同点在于,没有方法名,没有返回,没有参数,不能通过对象或类显示调用,而是加载类时,或创建类时隐式调用。
代码块的加载顺序
静态代码块相当于在类信息里面。
非静态代码块相当于在构造器里面。super和this是构造器的第一优先,代码块是第二优先,然后才是构造器里的初始化。
对于静态来说,优先级:静态 > 非静态 > 构造器
静态(代码块=属性=方法) > 非静态(代码块=属性=方法) > 构造器
同优先级,按语句顺序执行。
应用
如果多个构造器中都有重复语句,可以抽取到初始化块中,提高代码的重用性
detail
- 修饰符可选,但是只能选择static或者不选。范围修饰符不可选。
- 代码块可分为静态代码块和非静态代码块。
- 代码块里的逻辑语句可以是任何形式(输入、输出、方法调用、循环、判断等)
- 代码块的;可省略
类的加载
什么时候被加载
- 创建对象实例(new)
- 创建子类对象实例,父类也会被加载
- 使用类的静态成员时(静态方法、静态属性)
单例模式
饿汉式
- 私有构造器--->别的类不能new,只能在该类中new对象。
- 该类提供一个静态的new对象。---->别的类在需要使用该类(哪怕只是调用一个任意的静态成员)加载该类信息的时候,就已经new了对象。(可能造成浪费)
- 该类提供一个静态的返回new对象的方法。
懒汉式
- 私有化构造器---->别的类不能new,只能在该类中new对象。
- 不提供静态的new对象。只提供一个对象的定义。----> 这样在别的类使用该类的时候不会new对象,只有调用了getInstance方法,才会生成或返回对象。
- 提供一个静态的方法,进行一次判断。如果上述定义对象为null,则生成一个对象并返回。如果不为空,则说明已经创建一次对象,直接返回该对象。
区别
- 最主要的是,创建对象的时机不同,饿汉式是在类加载(初始化)的时候就创建了对象实例,不管你用不用。懒汉式是只有你使用对象实例的时候,才创建对象给你。
- 饿汉式不存在线程安全问题,因为创建对象过程不受打扰。懒汉式存在线程安全问题,因为判断过程会有漏洞。
- 饿汉式存在资源浪费的可能,如果不需要使用对象实例,仅仅使用类的属性或方法,就浪费了。懒汉式因为使用时才创建,至少使用过一次,不存在这个问题。
- 在JavaSE标准中,java.lang.Runtime就是经典的单例模式。(源码不难)
final
final使用范围:类、属性、方法、局部变量
使用情况
- 不希望类被继承时
- 不希望父类的方法被子类重写时
- 不希望某个属性的值被修改时
- 不希望某个局部变量被修改时
details
final属性:
- final修饰的属性就是常量,一般用XX_XX_XX来命名
- final修饰的属性在定义时必须赋初值(因为是常量,得有值,不允许后续添加),并且有不能在修改,赋值可以在以下三个位置之一,选择一个即可。
- 定义时:如public final double PI = 3.14;
- 在构造器里
- 在代码块里
- 如果final修饰的属性是静态的,则初始化的位置只能是
- 定义时
- 在静态代码块里
- final和static搭配使用,效率更高,不会导致类的加载。(这是因为底层编译器做了优化处理),被这两个修饰符同时修饰的时候,会变成编译期常量,在调用的时候,不会加载类的信息。
final类
- final类不能被继承,但是可以实例化对象
- 如果类不是final类,但是含有final方法,则该方法不能被重写,但是类可以被继承。
- 如果一个类是final类了,就没有必要修饰方法为final了,没有子类给他重写。
- 包装类、String也都是final类。不能被继承。

浙公网安备 33010602011771号