Learning_Java_Day_11-13

类变量(静态变量)

静态方法只能访问静态成员,普通方法可以访问普通成员和静态成员

代码块

代码块又称为初始化块,属于类中的成员(即是类的一部分),类似于方法,将逻辑语句封装在方法体中,通过**{}** 包围起来。但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用

相当于另外一种形式的构造器(对构造器的补充机制,可以做初始化的操作)。如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性

				[修饰符]{
					//代码
				}
  1. 修饰符可选,要写的话,也只能写 static
  2. 代码块分为两类,使用 static 修饰的叫静态代码块,没有 static 修饰的,叫普通代码块 / 非静态代码块
  3. 逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)
  4. ; 号可以写上,也可以省略
  5. 静态代码块的作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次
  6. 普通的代码块,在创建对象实例时,会被隐式的调用。被创建一次,就会调用一次。如果只是使用类的静态成员时,普通代码块并不会执行
  7. 静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员

创建子类对象时的调用顺序(继承关系)

  1. 父类的静态代码块和静态属性初始化(注意:代码块和属性初始化调用的优先级一样,如果有多个代码块和多个属性初始化,则按定义顺序调用)
  2. 子类的静态代码块和静态属性初始化(同上)
  3. 父类的普通代码块和普通属性初始化(同上)
  4. 父类的构造方法
  5. 子类的普通代码块和普通属性初始化(同上)
  6. 子类的构造方法

类什么时候被加载

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

单例设计模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的万法

实现步骤

  1. 构造器私有化(防止直接 new 一个对象)
  2. 类的内部创建对象
  3. 向外暴露一个公共的静态方法
  4. 代码实现

饿汉式 VS 懒汉式

  1. 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建
  2. 饿汉式不存在线程安全问题,懒汉式存在线程安全问题
  3. 饿汉式存在浪费资源的可能,因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题
  4. 在我们 javaSE 标准类中, java.lang.Runtime 就是经典的单例模式

final 关键字

final 可以修饰类、属性、方法和局部变量

在某些情况下,程序员可能有以下需求,就会使用到 final

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

注意事项

  1. final 修饰的属性也叫常量,用 XX_XX_XX 命名
  2. 如果 final 修饰的属性是静态的,则初始化的位置只能是
    1. 定义时
    2. 在静态代码块 不能 在构造器中赋值
  3. final 类不能继承,但是可以实例化对象
  4. 如果类不是 final 类,但是含有 final 方法,则该方法虽然不能重写,但是可以被继承
  5. 一般来说,如果一个类已经是 final 类了,就没有必要再将方法修饰成 final 方法
  6. final 不能 修饰构造方法
  7. final 和 static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
  8. 包装类(Integer,Float,Double,Boolean等)是 final ,String 也是 final 类
使用 Hugo 构建
主题 StackJimmy 设计