static关键字
作用主要包括:
- 定义类变量(静态变量)以实现共享数据。
- 定义静态方法,便于通过类名直接调用。
- 使用静态代码块来在类加载时进行初始化操作。
- 定义静态内部类,用于逻辑关联但独立于外部类实例的场景。
- 通过静态导入简化代码中的类静态成员的访问。
- 实现单例模式,确保类只有一个实例。
- 声明静态常量,用于类的全局不可变数据。
静态变量
被static修饰的成员变量,叫做静态变量
特点:
-
被该类所有对象共享
-
不属于对象,属于类。
-
静态变量随着类的加载而加载,优先于对象存在
调用方式:
-
类名调用(推荐)
-
对象名调用
初始化时机:静态变量在类加载时初始化,且只会初始化一次。
使用场景:常用于常量定义、计数器等场景。
静态方法
被static修饰的成员方法,叫做静态方法
特点:
-
多用在测试类和工具类中
-
Javabean类中很少会用
调用方法:
-
类名调用(推荐)
-
对象名调用
重载与隐藏:静态方法可以被重载,但不可以被重写(子类中不可以覆盖父类的静态方法)。
使用场景:常用于创建工厂方法、工具方法等。
注意
用对象名调用静态方法时,编译器会检查该方法是否存在于类中,并将调用转换为通过类名进行调用。
静态代码块
被static修饰的代码块,叫做静态代码块
特点
-
执行时机:类被加载时执行,优先于任何对象的创建。
-
执行次数:每个类只会执行一次。
使用场景:用于复杂的静态初始化,例如多个静态变量的初始化或执行必须在类初始化时完成的操作。
静态导入
静态导入(static import
)允许直接导入类的静态成员,使得在使用这些静态成员时无需前缀类名,从而简化代码编写。
特点:
-
静态导入可以导入静态方法和静态变量。
-
过度使用静态导入会降低代码的可读性,因此应谨慎使用,通常在导入常用常量或方法时使用。
使用场景:主要用于简化对常用静态成员的调用,如 Math
类的 PI
常量或 sqrt
函数。
案例
import static java.lang.Math.*; //静态导入
public class Main {public static void main(String[] args) {double result = sqrt(16); // 不需要 Math.sqrt()System.out.println(result); // 输出:4.0}
}
静态的执行时机
类加载
静态成员(包括静态变量和静态代码块)在类被首次加载时执行。
类加载一般发生在以下情况下:
当创建该类的实例时。
当该类的静态方法被调用时。
当访问该类的静态变量时。
静态变量初始化
静态变量按照在类中出现的顺序进行初始化。
如果同时存在多个静态变量和静态代码块,它们的执行顺序是:
按定义顺序初始化静态变量。
执行静态代码块(按定义顺序)
静态代码块执行
静态代码块在类加载时执行,只会在类加载时被调用一次。
工具类
作用
帮助我们完成某些功能,而不是描述一类事物的类。
实现步骤
-
私有构造方法:防止外部实例化对象。
-
静态方法:所有方法均用
static
修饰。 -
访问方法:通过类名.方法名调用。
Why 静态:工具类方法不依赖于特定的对象状态,因此使用静态方法更合理。
static的注意事项
-
静态方法只能访问静态变量和静态方法
-
非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
-
静态方法中是不能存在this关键字的
总结
静态方法中,只能访问静态。
非静态方法中可以访问所有。
静态方法中没有this关键字
认识main方法
public class HelloWorld{public static void main(String [] args){System.out.println("HelloWorld");}
}
public
:被JVM调用,访问权限足够大
static
:被JVM调用,不用创建对象,直接类名访问因为main方法是静态的,所以测试类中其他方法也需要是静态的。
void
:被JVM调用,不需要给JVM返回值
main
:一个通用的名称,虽然不是关键字,但是被JVM识别
String [] args
:以前用于接收键盘录入数据的,现在没用
欧了,到这里我应该解释的差不多啦,我是南极,大胆做自己,活出精彩的人生👊👊👊