Java笔记零碎补充(2):包装类、单例、代码块
包装类
包装类是针对八种基本数据类型定义相应的引用类型。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Lnteger |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
其中Byte Short Lnteger Long Float Double
拥有一个父类Number
。
包装类的出现,使得基本数据类型可以封装起来,作为一个类使用,完善了Java面向对象的特性。
包装类、基本数据类型、String相互转换
使用构造器将基本数据类型装箱
1 | Integer i1 = new Integer(1); |
使用包装类内置方法转换为基本数据类型
包装类拥有一个xxxValue
的方法,xxx
是指要转换的类型。
1 | Integer i = new Integer(1); |
自动装箱与自动拆箱
这是包装类与基本数据类型之间最常用的转换方式。
1 | public static void main(String[] args) { |
包装类、基本数据类型与String之间的转换
包装类、基本数据类型–>String
1 | int i1 = 114514; |
String–>包装类、基本数据类型
1 | String str1 = "114514"; |
单例设计模式
单例的设计模式就是让某一个类只能存在一个对象实例,并且这个类只提供一个取得其对象实例的方法。
具体就是将类的构造器访问权限设置为private
,这样类的外部就无法访问到类的构造器,但我们可以在类的内部产生类的对象。由于在类的外部,我们无法得到类的对象,只能通过该类的某个静态方法返回类内部构建的对象,由于静态方法只能访问静态成员变量,所以,指向类内部产生的对象的变量也必须是静态的。
单例有两种实现的方式——饿汉式与懒汉式。
饿汉式实现
1 | public class Demo { |
懒汉式实现
1 | class Singleton { |
单例的使用
当一个实例生成需要使用大量资源的时候,使用单例可以节约系统性能的开销。单例模式应用场景其实挺常见的:
- 应用程序的日志
- 网站计数器
- 数据库连接池
- 读取配置文件的类
- Windows的回收站
- …
代码块
代码块在Java中指的是使用{}
包围起来的代码集合。代码块分为四种,普通代码块,静态代码块,同步代码块,构造代码块。后面三种代码块均为类的成员之一。由于同步的内容还未学习,所以同步代码块的内容暂时不写。
普通代码块
普通代码块就是在方法体内定义的代码块,普通代码块和一般代码的执行顺序与书写顺序一致。
1 | public static void main(String[] args) { |
静态代码块
1 | public class Demo { |
静态代码块在类被加载的时候会被执行,而且只执行一次,并且优先于各种代码块以及构造函数。如果类中含有多个代码块,则会按照代码顺序执行。
由于静态代码块的加载是优先于类的其他成员的,所以他既不能存在任何方法体中,也不能访问任何普通变量。
静态代码块用于某些代码需要启动时就执行,例如启动时加载配置文件等。
构造代码块
1 | public class Demo { |
构造代码块与静态代码块在外观上差距了一个static
关键词。
构造代码块在创建对象时会被调用,每次创建对象时都会调用依次,且执行顺序是优先于构造函数的。实际上,构造代码块是依托于构造函数的,在编译后,构造代码块就是将里面的代码置入构造函数的最前端。
由于构造代码块每次创建对象都会执行,而构造函数不一定每个对象构造的时候都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数),利用这个特性,我们可以做统计对象创建次数等功能。