本篇文章为学习笔记


文章目录

  • 前言
  • static关键字
  • 1.静态变量
  • 2.静态方法
  • 3.静态代码块
  • 4.单例模式
  • 4.1 饿汉模式
  • 4.2 懒汉模式



前言

在Java中,static关键字可以修饰类的成员,如成员变量、成员方法以及代码块,被修饰的成员具有一些特殊性。

static关键字

1.静态变量

  • 在定义一个类时,只是描述某类事物的特征和行为,并没有产生具体的数据。只有通过new关键字的创建该类的实例对象后,系统才会为每个对象分配空间,存储各自的数据。有时候,我们希望某些特定的数据在内存中只有一份,而且能够被一个类的所有实例对象所共享。
  • Java中,可以使用static关键字来修饰成员变量,该变量被称作静态变量。静态变量被所有实例共享,使用**“类名.变量名”**的形式来访问。
  • 部分代码展示:
//定义一个Student类
class Student{
    static String schoolName; //定义静态变量schoolName
}
public class LearnStatic1 {
    public static void main(String[] args) {
        Student student1 = new Student(); //创建学生对象
        Student student2 = new Student();
        Student.schoolName = "家里蹲大学"; //为静态变量赋值
        System.out.println("我的学校是"+student1.schoolName);
        System.out.println("我的学校是"+student2.schoolName);
    }

}
  • 因为 schoolName 是静态变量所以可以直接通过类名.变量名的方式直接调用,也可以通过实例对象进行调用。

注意:static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。即是说不能在代码块内部定义静态变量。

2.静态方法

  • 有时我们希望在不创建对象的情况下就可以调用某个方法,即是说该方法不必和对象绑在一起。实现这样的效果只需要在类中定义的方法前加上static关键字,我们可以称这类方法为静态方法。跟静态变量的访问方式相同:类名.方法。
  • 部分代码展示:
public static void sayHello(){
        System.out.println("hello,我是一个静态方法");
    }
    
    public static void main(String[] args) {
        //静态方法方法问方式:类名.方法名
        LearnStatic1.sayHello();
    }

注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在调用时可以不创建任何对象。即是说静态的变量和方法主要绑定的是类,而不是具体的对象。

3.静态代码块

  • 在Java中,使用一对大括号包围起来的若干代码被称为一个代码块,用static修饰的被称为静态代码块。
  • 当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。
  • 在程序中,通常会使用静态代码块对类的成员变量进行初始化。
  • 部分代码展示:
//静态代码块
    static{
        System.out.println("测试类的代码块执行了");
    }
    public static void main(String[] args) {
        //创建两个对象
        Person person1 = new Person();
        Person person2 = new Person();
    }
//创建一个人类
class Person{
    static String country;
    //静态代码块
    static{
        country = "China";
        System.out.println("Person类中的静态代码块被执行了");
    }

4.单例模式

  • 单例模式是Java中的一种设计模式,它是指在设计一个类时,需要保证在整个程序中运行期间针对该类只存在一个实例对象。例如工具类等在程序运行过程中,注重的是类中的方法和属性,而不是具体的实例对象,不需要创建太多的情况。
  • 实现单例模式的步骤:
  1. 构造函数私有化;
  2. 创建一个全局的静态的(static)该类型对象作为属性;
  3. 写一个公共(public)静态(static)的方法来返回该类型对象。
  • 通过创建类的对象来判断是否满足单例设计模式的要求:
JiSuan js1 = JiSuan.getJiSuan();
	JiSuan js2 = JiSuan.getJiSuan();
	System.out.println(js1 == js2);

4.1 饿汉模式

  • 把创建对象的过程,放在了定义全局变量的时候
  • 部分代码展示:
//创建一个计算工具类
public class JiSuan {
	static JiSuan  js=new JiSuan();;
	private  JiSuan(){}
//写一个方法返回对象
	public static JiSuan getJiSuan(){
    return  js;
}

4.2 懒汉模式

  • 创建对象放在了方法里
  • 懒汉模式的时候注意线程安全问题,可以在返回对象的这个方法上,加synchronized关键字
  • 部分代码展示:
public class JiSuan {
    static JiSuan js;
    private JiSuan(){}

    public synchronized static JiSuan getJiSuan(){
        if(js != null){
            return js;
        }else{
            js= new JiSuan();
            return js;
        }
    }

如有错误,欢迎大佬指出!