面向对象加强——static关键字、代码块、单例模式

本文深入探讨了Java中的`static`关键字,讲解了静态成员变量和静态方法的使用以及注意事项。同时,介绍了代码块的概念,包括静态代码块和构造器代码块,阐述了它们在初始化和资源管理中的作用。此外,文章还详细解释了单例模式,分析了饿汉式和懒汉式单例的实现,并强调了设计模式在解决特定问题中的价值。
摘要由CSDN通过智能技术生成

面向对象加强——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类下,使用{ }大括号括起来的代码被称为代码块。

代码块分为:

  1. 静态代码块
    • 格式为:static{ }

    • 特点:需要通过static关键字修饰。随着类的加载而加载,并自动触发、只执行一次。

    • 使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续的使用

      可以加载静态资源、加载一个文件(文件内可以有玩家的姓名等内容)

  2. 构造器代码块(了解,少见)(实例代码块):
    • 格式:{ }位置类内方法外
    • 特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
    • 使用场景:初始化实例资源。
  3. 局部代码块
    • { }放在方法内

静态代码块案例

//斗地主游戏
/*需求:
在启动游戏房间的时候,应该提前准备好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. 这种模式是解决什么问题的。
    2. 遇到这种问题,该模式是怎么写,他是如何解决这个问题的
  1. 单例模式

    • 可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。
    • 例如任务管理器对象我们只需要一个就可以解决问题,这样可以节省内存空间。
    1. 单例的实现方式很多

      • 饿汉单例模式

        • 在用类获取对象的时候,对象已经提前创建好了

        • 设计步骤:

        • //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变量名;
          }
      }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值