1.代码块
在java类下,使用{}括起来的代码被称为代码块,定义在类中方法外。
代码块分为两种:
(1)静态代码块:
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载的时候做一些静态数据初始化的操作,以后便于使用
(2)构造代码块(使用较少):
格式:{}
特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行(无static修饰,属于对象,每次构建对象时,都会触发一次执行。)
使用场景:初始化实例资源
例如如下代码:
publiac class StaticText{
public StaticText(){
System.out.println("无参构造器被触发执行");
}
//实例代码块
{
System.out.println("实例代码块被触发执行");
}
public static void main(String[] args){
StaticText s1=new StaticText();
StaticText s2=new StaticText();
}
}
//此代码执行结果是:
实例代码块被触发执行
无参构造器被触发执行
实例代码块被触发执行
无参构造器被触发执行
案例:初始化一副牌
public class StaticText2{
//1.定义一个静态的集合,这样这个集合只加载一次
public static ArrayList<String> cards=new ArrayList<>();
//2.在程序正常运行main方法前,把54张牌放进去,对其进行初始化
static{
// 因为元素类型确定了,个数也确定了,所以定义一个数组存储全部的点数
String[] sizes={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//定义一个数组存储全部花色
String[] colors={"♠️","❤️","♦️","♣"};
//遍历点数
for(int i=0;i<sizes.length;i++){
//sizes[i]
//遍历花色
for(int j=0;j<colors.length:j++){
//colors[j]
String card=sizes[i]+colors[j];
cards.add(card);
}
}
//单独加入大小王
cards.add("大🃏");
cards.add("小🃏");
System.out.println(cards);
}
public static void main(String[]args){
}
}
2.单例
保证一个类只能创建一个对象
单例实现方式很多,这里写两种:
(1)饿汉单例模式:
在用类获取对象的时候,对象已提前创建好了。
设计步骤:
定义一个类,把构造器私有。
定义一个静态变量存储一个对象。
public class SingleInstance1{
//2.饿汉单例是在获取对象前,对象已经提前创建好了,这个对象只能是一个,所以定义静态成员变量
public static SingleInstance1 instance=new SingleInstance1();
//1.把构造器私有化
private SingleInstance1(){
}
}
(2)懒汉单例模式:
在真正需要该对象的时候,才去创建一个对象
设计步骤:
定义一个类,把构造器私有化
定义一个静态变量存储一个对象
提供一个返回单例对象的方法
public class SingleInstance2{
//2.定义一个静态的成员变量用于存储一个对象,只加载一次,只有一份(最好私有化)
private static SingleInstance2 instance;
//3.提供一个方法,用于返回单例对象
public static SingleInstance2 getInstance(){
if(instance==null){
instance=new SingleInstance2();
}
return instance;
}
//1.私有化构造器
privata SingleInstance2(){
}
}