进阶一static

1、static修饰成员变量

  • 称为静态,可以修饰成员变量、成员方法。

两种成员变量

  • 类变量:有static修饰,属于类,在计算机里只有一份(跟类一起加载,其中数据在堆区,引用在方法区),会被类的全部对象共享
  • 实例变量:无static修饰,属于每个对象
1
2
3
4
public class student{
public static String career = "学生"; //所有对象公有这个career 这个变量只有一个(实际上这个变量在类里)
String name; //每个对象都有自己各自的name
}
  • 访问:类变量用类名访问,实例变量实例化后通过对象访问。
1
2
3
4
5
public static void main(){
Student s1 = new Student();
System.out.println(Student.career); //学生
System.out.println(s1.name); //null
}

类变量应用场景

  • 在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义为类变量
  • 例子:要求用户类可以记住自己创建了多少个用户对象。
1
2
3
4
5
6
public class User{
public static int num = 0; //定义类变量 类变量一般用public修饰
public User(){ //显式定义无参构造
User.num++; //访问本类下的类变量 类名可以省略 如此处 User.num++;等同于num++;
}
}

2、static修饰成员方法

两种成员方法

  • 类方法:有static修饰的成员方法,属于类,可以直接用类名访问。
  • 实例方法:无static修饰的成员方法,属于对象,只能用对象访问。

类方法常见应用场景

  • 类方法最常见的应用场景是做工具类
  • 工具类中都是一些类方法,每个方法用于完成一个功能,工具类是给开发人员共同使用的。
  • 工具类的好处:提高了代码复用;调用方便,提高开发效率。(例如某项目多次用到随机生成验证码功能,就可以封装一个类方法)

为什么工具类用类方法不用实例方法

  • 实例方法,要创建对象才能调用,而此时对象只为了调用方法,浪费内存。
  • 类方法,可以直接用类名调用,既方便又节约内存。

工具类定义的要求

  • 工具类没有创建对象需求,建议将工具类构造器私有化

3、static注意事项

  1. 类方法中可以直接访问类成员(静态),不可直接访问实例成员(非静态)。
  2. 实例方法中既可以直接访问类成员,也可以直接访问实例成员。
  3. 实例方法中可以出现this关键字,类方法中不可以出现this关键字。

4、static的应用

代码块

  1. 代码块概述

    • 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)
  2. 代码块分为两种:

    • 静态代码块:

      ​ 格式:static{}

      ​ 特点:类加载时自动执行,由于类只会加在一起,所以静态代码块也只会执行一次。

      ​ 作用:完成类的初始化,例如:初始化类变量。

    • 实例化代码块:

      ​ 格式:{}

      ​ 特点:每次创建对象时,执行实例代码块,并在构造器前执行。

      ​ 作用:和构造器一样,用于初始化对象,例如:初始化实例变量。

设计模式

  1. 设计模式概述
    • 一个问题有n种解法,设计模式就是具体问题的最优解决方案。
    • 设计模式有23种,对应多种软件开发中会遇到的问题。
  2. 设计模式学习要点
    • 解决什么问题?
    • 怎么写?

饿汉式单例设计模式

  • 确保一个类只有一个对象。
  • 获取类的对象时,对象早就创建好了。
  • 写法
    • 把类的构造器私有。
    • 定义一个类变量用于存储对象。
    • 定义一个类方法,返回对象。

饿汉式单例设计模式

懒汉式单例设计模式

  • 确保一个类只有一个对象。
  • 拿对象时,才开始创建对象。
  • 写法
    • 把类的构造器私有。
    • 定义一个类变量用于存储对象。
    • 定义一个类方法,保证返回的是同一个对象。(使用if语句判断)

懒汉式单例设计模式(第一次调用时才创建一个对象)

单例模式的引用场景和好处

  • 场景:

    • Runtime运行环境
    • 任务管理器对象
    • 获取运行时对象
  • 在这些任务场景下使用单例模式,可以避免浪费内存。