回顾总结8

Static

使用案例

  • 如果希望不创建实例,也可以调用某个方法(即当做工具类来使用),这时,我们做成静态方法非常合适。比如源码里的Math、Arrays、Collections等工具类就是如此。

  • 当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。

代码块

相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作。

代码块比构造器先执行

代码块属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过{}包裹起来。但是不同点在于,没有方法名,没有返回,没有参数,不能通过对象或类显示调用,而是加载类时,或创建类时隐式调用。

代码块的加载顺序

静态代码块相当于在类信息里面。

非静态代码块相当于在构造器里面。super和this是构造器的第一优先,代码块是第二优先,然后才是构造器里的初始化。

对于静态来说,优先级:静态 > 非静态 > 构造器
静态(代码块=属性=方法) > 非静态(代码块=属性=方法) > 构造器
同优先级,按语句顺序执行。

应用

如果多个构造器中都有重复语句,可以抽取到初始化块中,提高代码的重用性

detail

  1. 修饰符可选,但是只能选择static或者不选。范围修饰符不可选。
  2. 代码块可分为静态代码块和非静态代码块。
  3. 代码块里的逻辑语句可以是任何形式(输入、输出、方法调用、循环、判断等)
  4. 代码块的;可省略

类的加载

什么时候被加载

  1. 创建对象实例(new)
  2. 创建子类对象实例,父类也会被加载
  3. 使用类的静态成员时(静态方法、静态属性)

单例模式

饿汉式

  1. 私有构造器--->别的类不能new,只能在该类中new对象。
  2. 该类提供一个静态的new对象。---->别的类在需要使用该类(哪怕只是调用一个任意的静态成员)加载该类信息的时候,就已经new了对象。(可能造成浪费)
  3. 该类提供一个静态的返回new对象的方法。

懒汉式

  1. 私有化构造器---->别的类不能new,只能在该类中new对象。
  2. 不提供静态的new对象。只提供一个对象的定义。----> 这样在别的类使用该类的时候不会new对象,只有调用了getInstance方法,才会生成或返回对象。
  3. 提供一个静态的方法,进行一次判断。如果上述定义对象为null,则生成一个对象并返回。如果不为空,则说明已经创建一次对象,直接返回该对象。

区别

  1. 最主要的是,创建对象的时机不同,饿汉式是在类加载(初始化)的时候就创建了对象实例,不管你用不用。懒汉式是只有你使用对象实例的时候,才创建对象给你。
  2. 饿汉式不存在线程安全问题,因为创建对象过程不受打扰。懒汉式存在线程安全问题,因为判断过程会有漏洞。
  3. 饿汉式存在资源浪费的可能,如果不需要使用对象实例,仅仅使用类的属性或方法,就浪费了。懒汉式因为使用时才创建,至少使用过一次,不存在这个问题。
  4. 在JavaSE标准中,java.lang.Runtime就是经典的单例模式。(源码不难)

final

final使用范围:类、属性、方法、局部变量

使用情况

  1. 不希望类被继承时
  2. 不希望父类的方法被子类重写时
  3. 不希望某个属性的值被修改时
  4. 不希望某个局部变量被修改时

details

final属性:

  • final修饰的属性就是常量,一般用XX_XX_XX来命名
  • final修饰的属性在定义时必须赋初值(因为是常量,得有值,不允许后续添加),并且有不能在修改,赋值可以在以下三个位置之一,选择一个即可。
    1. 定义时:如public final double PI = 3.14;
    2. 在构造器里
    3. 在代码块里
  • 如果final修饰的属性是静态的,则初始化的位置只能是
    1. 定义时
    2. 在静态代码块里
  • final和static搭配使用,效率更高,不会导致类的加载。(这是因为底层编译器做了优化处理),被这两个修饰符同时修饰的时候,会变成编译期常量,在调用的时候,不会加载类的信息。

final类

  • final类不能被继承,但是可以实例化对象
  • 如果类不是final类,但是含有final方法,则该方法不能被重写,但是类可以被继承。
  • 如果一个类是final类了,就没有必要修饰方法为final了,没有子类给他重写。
  • 包装类、String也都是final类。不能被继承。
posted @ 2021-07-29 23:34  灰线  阅读(35)  评论(0)    收藏  举报