面向对象加强——static关键字、代码块、单例模式
static静态关键字
static是静态的意思,可以修饰成员变量和成员方法
static修饰成员变量表示该成员变量只在内存中只存储(存储在方法区),可以被共享访问、修改。
public static onlinnumber=161;
//静态成员变量(有static进行修饰,属于类,内存中加载一次,可以被共享访问):
//常表示如在线人数信息、等需要被共享的信息,
访问的格式:
//一般用类名.静态成员变量(推荐)
//对象.静态成员变量(不推荐)
System.out.print(onlinnumber);//同一个类中静态成员变量的访问时可以省略类名
//实例成员变量(无static进行修饰,属于对象)
访问格式:
对象.实例成员变量
static 存在的不需要new对象也可以进行运用
static注意事项、
//1.静态方法只能访问静态的成员,不可以直接访问实例成员,可以间接访问
//2.实例方法可以访问静态成员,也可以访问实例成员
//3.静态方法不可以出现this关键字也不能用super//this代表的时当前对象
//4.类被加载的时候才会被创建
//5.静态方法不能直接调用非静态方法//反之可以 非静态方法可以调用静态方法
static工具类
-
工具类定义时的其他要求:
由于工具里面都是静态方法,直接用类名即可进行访问,因此,工具类无需创建对象,所以建议将工具类的构造器进行私有
-
内部都是一些静态方法,每个方法完成一个功能
//类中都是一些静态方法,每个方法都是以完成的一个公用的功能为目的,这个类用来给系统开发人员的使用
static工厂类
- 进行批处理
- 不需要
static的好处和要求
- 一次编写,处处可用,提高代码的重用性
- 建议对工具类的构造器进行私有化
- 工具类不需要创建对象
代码块
- 代码块是类中的五大成分之一,定义在类中方法外。
- 在Java类下,使用{ }大括号括起来的代码被称为代码块。
代码块分为:
-
静态代码块
-
格式为:static{ }
-
特点:需要通过static关键字修饰。随着类的加载而加载,并自动触发、只执行一次。
-
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续的使用
可以加载静态资源、加载一个文件(文件内可以有玩家的姓名等内容)
-
-
构造器代码块(了解,少见)(实例代码块):
- 格式:{ }位置类内方法外
- 特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
- 使用场景:初始化实例资源。
-
局部代码块
- { }放在方法内
静态代码块案例
//斗地主游戏
/*需求:
在启动游戏房间的时候,应该提前准备好54张牌,后续才可以直接使用这些牌数据
分析:
1.该房间只需要一副牌。
2.定义一个静态的ArrayList集合存储54张牌对象,静态的集合只会加载一份。
3.在启动游戏房间前,应该将54张牌初始化好
4.当系统启动的同时需要准备好54张牌的数据,此时可以用静态代码块完成
*/
//源码:
public class DiZhu {
public static ArrayList<String> card=new ArrayList<>();
/*
程序运行main之前放入54张牌,游戏可以直接使用
比较专业
*/
static {
//正式做牌,放入集合中
//定义一个数组进行存储,点数,和个数,类型
String[] sizes={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String[] colors={"♣","♦","♥","♠"};
//先遍历点数
for (int i = 0; i < sizes.length; i++) {
//size[i];
//花色
for (int j = 0; j < colors.length; j++) {
String cards=sizes[i]+colors[j];
card.add(cards);
}
}
//加上大小王
card.add("大王🃏");
card.add("小王🃏");
}
public static void main(String[] args) {
System.out.println("新牌"+card);
}
}
static单例设计模式
-
什么是设计模式?
我们在开发中经常遇到一些问题,一个问题通常有n种解决方式,但是其中肯定有一种解法是最优的,这个最优的解法被人们总结起来就被称为设计模式
-
设计模式有20多种,对应20多种软件开发种会遇到的问题
-
学设计模式主要是两点:
- 这种模式是解决什么问题的。
- 遇到这种问题,该模式是怎么写,他是如何解决这个问题的
-
单例模式
- 可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。
- 例如任务管理器对象我们只需要一个就可以解决问题,这样可以节省内存空间。
-
单例的实现方式很多
-
饿汉单例模式
-
在用类获取对象的时候,对象已经提前创建好了
-
设计步骤:
-
//1.定义一个单体类 public class Sing{ //2.私有化构造器 private Sing(){ System.out.println("创建了一个对象"); } //3.定义一个静态变量存储一个对象即可:属于类和类一起加载,静态的成员变量只会运行一次 private static Sing instance = new Sing(); public static Sing getInstance(){ return instance; } } //调用方法: public class Test { public static void main(String[] args) { Sing s1= Sing.insten; } }
-
-
//懒汉单例模式
在真正需要用对象的时候,才去创建一个对象
设计步骤:
需要把构造方法改为private
需要给一个public的静态方法,让用户去进行调用(因为非静态的,必须得先new对象,我们还new不出来)
我们需要进行判断是不是已经创建过了,用if判断条件进行判断是不是对象为null
是的话进行创建并且保存,返回保存的值,要是不是null会返回保存的值
/*定义一个单例类*/
class Sing{
/*定义一个静态变量存储一个对象即可:属于类,与类一起加载一次,这里最好进行私有化,要不然每次进行调用方法的时候都会生成一个内容*/
private static Sing 变量名;
/*单例必须私有化构造器*/
private Sing(){}
/*提供一个方法返回一个单例对象*/
public static Sing get变量名(){
if(sing==null){
sing=new Sing();
return sing
}else{
return sing;
}
return ....;
}
}
//调用方法:
public class Test {
public static void main(String[] args) {
Sing s1= Sing.get变量名;
}
}