Static是什么

  • static是静态的意思,可以修饰成员变量和成员方法。
  • static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改

    成员变量可以分为两类


  1. 静态成员变量(有static修饰、属于类、内存中只加载一次):常表示如在线人数信息,等需要被共享的信息、可以被共享访问
    1. public class User{
    2. //静态成员变量
    3. public static String onlineNumber = 100;
    4. }
    访问方式:类名.静态成员变量(非常推荐
    对象名.静态成员变量(不推荐

    两种成员变量各自在什么情况下定义?

  • 静态成员变量:表示在线人数等需要被共享的信息
  • 实例成员变量:属于每个对象,且每个对象的该信息不同时(如:name.age,money…等)


static修饰成员变量的内存原理

image.png

总结:在类加载的时候静态成员变量就加载到了堆内存中,在访问的时候可以通过类名访问,也可以通过对象名访问

static修饰成员方法的基本使用

定义的方法加static修饰和不加static修饰有什么区别

  1. public void run(){
  2. System.out.println("XXXXXXX");
  3. }
  4. public static int getmax(int a ,int b){
  5. return a>b?a:b;
  6. }

成员方法的分类

  • 静态成员方法(有static修饰,归属于类),建议用类名访问,也可以用对象访问。
  • 实例成员方法(无static修饰,归属于对象),只能用对象触发访问。

使用场景:

  • 表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须声明成实例方法
  • 如果该方法是以执行一个共有功能的目的,则可以声明成静态方法

    static修饰成员方法的内存原理

    image.png

    Static访问注意事项

  • 静态方法只能访问静态的成员,不可以直接访问实例成员

  • 实例方法可以访问静态的成员,也可以访问实例成员
  • 静态方法是不可以出现this关键字的,因为不是到是对象名.静态方法还是类名.静态方法。


Static应用知识:工具类

工具类是什么?

  • 类中都是一些静态方法,每个方法都是以完成一个共有的功能为目的,这个类用来给系统开发人员共同使用的。

使用工具类的好处
一是调用方便,二是提高了代码复用(一次编写,处处可用)

为什么工具类中的方法不用实例方法做?

  • 实例方法需要创建对象调用
  • 此时用对象只是为了调用方法,这样只会浪费内存

工具类定义时的其他要求:

  • 由于工具里面都是静态方法,直接使用类名即可访问,因此,工具类无需创建对象,建议将工具类的构造器设置为私有的。

Static应用知识:代码块

代码块的分类、作用

代码块的概述

  • 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类),定义在类中方法中
  • 在java类中,使用{}括起来的代码称为代码块

代码块分为

  • 静态代码块

格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发只执行一次
使用场景:类加载的时候做一些静态数据初始化的操作,以便后续使用。

  • 构造代码块

    1. **格式:{}**<br />** 特点:**每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在**构造器执行前**执行<br />** 使用场景:**初始化实例资源

注:静态代码块比main函数先加载,所以在执行的时候先运行静态代码块的内容。

静态代码块的作用?

如果要在启动系统时对静态资源进行初始化,则建议使用静态代码块完成数据的初始化操作、

静态代码块的应用知识:单例设计模式

什么是设计模式(Design pattern)

  • 开发中经常会遇到一些问题,一个问题通常有n种解法,但其中肯定有最优的,这个最优的解法被人总结出来了,称之为设计模式

单例模式

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

单例的实现方法很多
饿汉单例模式
懒汉单例模式

饿汉单例模式

  • 在用类获取对象的时候,对象就给你创建好了。

设计步骤:

  • 定义一个类,把构造器私有
  • 定义一个静态变量存储一个对象

    1. public class SingleInstance{
    2. //定义一个静态变量存储一个对象即可:属于类,与类一起加载
    3. public static SingleInstance = new SingleInstance();
    4. //单例必须私有构造器
    5. private SingleInstance(){
    6. System.out.println("创建一个对象");
    7. }
    8. }

    懒汉单例模式

    懒汉单例设计模式

  • 在真正需要该对象的时候,才去创建一个对象(延迟加载对象)

设计步骤:

  • 定义一个类,把构造器私有
  • 定义一个静态变量存储一个对象
    1. public class SingInstance2{
    2. //定义一个静态成员变量负责存储的一个对象,只加载一个,只有一份
    3. public static SingInstance2 instance;
    4. //提供一个方法,对外返回单例对象
    5. public static SingleInstance2() getinstance(){
    6. if(instance == null){
    7. instance = new SingleInstance2();
    8. }
    9. return instance;
    10. }
    11. //私有构造器
    12. private SingleInstance2(){
    13. System.out.println("xxxxxx");
    14. }
    15. }