static
是Java中的一个关键字,它可以用于修饰类的成员变量和方法,具有特殊的含义和用途。下面是关于static
关键字的主要用法和含义:
- 静态变量(Static Variables) :
- 静态变量也称为类变量,它们属于类而不是类的实例。
- 所有该类的对象共享相同的静态变量,它们在内存中只有一个副本。
- 静态变量在类加载时被初始化,并且可以通过类名来访问。
- 通常用于存储与类相关的常量值或共享的状态信息。
java
public class MyClass {
static int count = 0; // 静态变量
public MyClass() {
count++; // 每创建一个实例,静态变量count加1
}
}
2.静态方法(Static Methods):
- 静态方法属于类而不属于实例,可以直接通过类名调用,而不需要创建类的实例。
- 静态方法不能访问非静态成员(变量和方法),只能访问静态成员。
- 静态方法通常用于执行与类相关的操作,如工具方法或工厂方法。
java
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
3.静态代码块(Static Initialization Block) :
- 静态代码块是一个在类加载时执行的代码块,用于执行类级别的初始化操作。
- 静态代码块只在类加载时执行一次,通常用于初始化静态变量或执行其他一次性操作。
java
public class MyClass {
static {
// 静态代码块,在类加载时执行
System.out.println("Class MyClass is loaded.");
}
}
静态导入(Static Import):
- 静态导入允许在不使用类名的情况下直接访问类的静态成员。
- 通过静态导入,可以简化代码,提高可读性。
java
import static java.lang.Math.*;
public class MathOperations {
public static void main(String[] args) {
double result = sqrt(25); // 静态导入后,可以直接使用sqrt方法
System.out.println("Square root of 25 is: " + result);
}
}
static
关键字的主要作用是创建与类关联而不是与类的实例关联的成员。它在多种情况下都非常有用,如共享状态信息、提供工具方法等。但需要注意的是,过度使用static
可能会导致代码难以维护和测试,因此应谨慎使用。
2.1 static 可以修饰属性
类成员变量或静态成员变量:使用 static 修饰的,作用范围在整个类的所有对象上。所有对象共享这个变 量,在内存中只有一个副本。访问通过 类名. 变量名 访问。在类加载时被初始化,存储在堆里。
实例成员变量:没有static 修饰,作用范围在某个实例对象上。在创建对象时被初始化,存在多个副本。 各个对象不互相影响。通过 实例对象名. 变量名 访问。
2.2 static 可以修饰方法
类方法或静态方法:使用 static 修饰,不能直接使用实例变量,只能直接使用静态变量。只能直接调用静 态方法,不能直接调用实例方法。通过 类名 . 方法名 () 访问
不允许使用 this 关键字
实例方法:没有 static 修饰,既可以使用静态变量,又可以使用实例变量。既可以直接访问实例方法,又 可以直接访问静态方法。 通过 实例对象名. 方法名 () 访问
2.3 static 可以修饰代码块
静态代码块 > 构造代码块 > 构造方法
静态代码块:类加载的时候执行,并且只执行一次,优先于各种代码块和构造方法,最开始执行的。
构造代码块:在创建对象时被调用,每创建一次对象,都会执行一次构造代码块。 执行顺序,优先于构
造方法执行。一个类如果有多个构造方法时,每通过构造方法,创建一个对象,代码块都会被执行一 次。但是对于构造方法来讲,只执行某一个构造方法(根据参数执行)。
2.4 案例:统计一个类创建了多少个实例对象
2.5 单例模式
设计模式:在某些项目环境下,针对某些问题,提供的一种通用的解决方案。
Gang of Four ( GOF ): 23 种软件设计模式
单例模式:保证一个类只能创建一个实例对象,自行实例化,并向整个系统提供这个对象。
实现:
构造方法私有
提供一个当前类的私有静态成员变量
提供一个公有的静态方法,返回成员变量