Java代码块和包装类

根据定义方式有三种代码块形式

局部代码块

定义位置: 在方法体内定义

特点: 生命周期即短

使用场景: if和for等语句的代码块

初始化代码块

定义方式: 在类内但方法体外定义,不要static修饰

本质: 初始化代码块的执行语句都移至构造器,被最先执行

静态代码块

定义方式: 定义在类中,用static修饰该代码块

特点: 随着类字节码文件加载而加载,只会执行一次

使用场景: 应用于资源的加载和功能初始化工作

拓展: 所有在定义处就初始化的静态字段底层是在静态代码块中进行初始化工作

final关键字

why: 为了更好地进行数据封装,不让外部进行修改

final + 类

不能有子类

final + 方法

该方法被继承后,但不能被重写

final + 变量

final修饰的变量被作为常量看待,一旦初始化成功后无法再改变

final能修饰的三种变量: 实例变量 静态变量, 局部变量

  • final修饰基本数据类型表示无法更改其值
  • final修饰引用类型表示无法更改其引用

注意 final是唯一能修饰局部变量的修饰符,主要用在 内部类 使用

初始化位置: 只有两个位置进行初始化: 在定义时初始化或者构造器中初始化

命名规范: 针对final常量采用全大写,单词间用_进行分割的方式来命名

拓展 全局静态常量 - public static final 修饰的变量

单例设计模式

单例设计模式目的就是为了保证某一个应用中某一个类有且只有一个实例,即所有指向该类型实例的引用都指向同一块内存空间。

为什么用单例

特点在哪

什么是设计模式: 一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结

Java如何实现单例模式

饿汉模式: 首次加载类时就创建单例对象,且只创建一次

  • 在类内部直接创建单例对象用static成员来引用
  • 将类的构造器私有化,防止外界调用来创建对象
  • 使用一个final修饰的静态公共方法,用来返回其静态单例对象的引用

懒汉模式: 首次使用才会创建单例对象,且只创建一次,但是存在线程安全问题

饿汉模式与懒汉模式区别:

饿汉模式: 类加载时创建单例对象,导致加载类慢,但运行时获得对象的速度快

懒汉模式: 运行时创建单例对象,导致运行时获得对象慢,但类加载时快

工具类设计

工具类:存放了某一类事物的工具方法的类.

常见的工具类命名方式: ClassUtil, ClassTool, ClassHelpers等

常见的两种设计方式

  1. 工具方法没有使用static修饰,把工具类设计为单例,使用工具类的对象来调用.
  2. 工具方法全部使用static修饰,工具方法用工具类名调用,并必须把工具类的构造器私有化,来防止创建工具类对象调用静态方法.

基本类型包装类

Why: 基本数据类型的存在违背了”一切皆对象”的面向对象思想,对数值进行常用的算法操作时也不够便捷,都需要手动实现

基本数据类 包装类
byte Byte
short Short
int Int
long Long
char Character
float Float
double Double
boolean Boolean

注意: 包装类型和基本数据类型是不同的类型

包装类的常量
  • Boolean包装类表示true和false有两种: Boolean.TRUE和 Boolean.FALSE
  • 其他包装类的常量有 MAX_VALUE,MIN_VALUE和SIZE
包装类构造器

包装类的构造器分为两种: 一种接受自己对于类型的基本类型数值;另一接受字符串参数进行包装类的创建(Character除外)

注意: 使用第二方式时,如果字符串不能转换为对应包装类就会抛出NumberFormatException异常

装箱: 将基本类型数据转换成对应的包装类对象

自动装箱: 允许将一个基本数值类型直接赋给对应包装类变量

拆箱: 将包装类对象转换成对应的基本数据类型数据

自动拆箱: 允许把包装类对象直接赋给对应的基本数据类型变量

Java5后编译器提供了自动装箱和自动拆箱的特性,底层仍是普通的装箱和拆箱;由于自动拆箱的存在,switch接受byte,char,int,,short对应包装类型参数

包装类的操作

  • 进行数据类型转换时,每个类都TypeValue方法省去数据的类型强转操作
  • 包装类创建时,还可以通过valueOf方法来获得包装类,可提供字符串或者对应的基本类型数值
  • 包装类提供了parseType系列方法允许将字符串转换为对应的基本类型数据,除char外
  • Integer包装类提供了将十进制数值转换为其他进制的工具方法toHexString,toBinaryString

包装类的缓存设计

为了能提升性能,快捷访问常用的数据值,避免重复创建对象,某些包装类都有值缓存,类内部维护一个静态的缓存数组,来保留常用的小范围数据.

  • Integer, Byte, Short,Long:缓存[-128,127]区间的数据/

    Character缓存[0,127]区间的数据 对于包装类进行值比较时,一定要用equals方法比较,防止数据缓存带来的影响

享元设计模式: 本质就是缓存设计,在类内部持有缓存过的数据,避免重复创建对象消耗内存,直接给外部使用

包装类型与包装类型的区别
  • 默认初始值不同
  • 是否有强大的工具方法
  • 能否在集合框架使用
  • 数据类型不同

最佳实践: 开发建议使用包装类型,并且比较时使用equals

抽象设计

保证子类一定实现该方法

抽象方法

What: 用abstract修饰,且没有方法体的方法

抽象方法的特点
  • 没有方法体,具体实现由子类完成,不实现无法通过编译
  • 抽象方法必须定义在抽象类或接口中
  • 该方法不能用final,private,static修饰

抽象类

What: 用abstract修饰,不能创建该类型实例的类

本质: 抽象类必须能被继承,必须要有子类

抽象类的特点
  • 不能创建自己类型的实例
  • 允许拥有普通方法,但如果存在抽象方法,则该类必须为抽象类
  • 构造器不能全部私有,不让继承
  • 类不能用final修饰
  • 子类没有实现全部的抽象方法时,就是抽象子类,也无法创建该子类型对象
  • 继承后子类必须实现其中抽象方法

抽象类与普通类的区别: 抽象类不能创建对象,但允许包含普通方法

When: 当多个类具有相同的方法声明但具体实现不一样时可以使用,让子类覆写抽象方法进行不同细节的实现

最佳实践: 给抽象命名时用Abstract作为前缀

模板方法模式

What: 编写一个抽象父类,让该父类提供多个子类的通用方法,并将其中表现不同操作的方真法延迟到子类中实现,由父类的通用方法完成子类具体实现的调用

使用原则:

保证抽象父类提供模板方法和抽象方法;让模板方法表现各子类共同的行为和实现,

让具体的业务功能让子类在抽象方法中完成,实现模板方法对其具体操作方法的调用,完成该功能.

注意: 模板方法用final修饰防止外部覆写,而抽象方法用protected防止非子类进行修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值