Java static

1、静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问。

public class Main {
    static {
        //System.out.println(a);  //报错
        a = 100; //成功
    }
    private static Integer a = 100;
    public static void main(String[] args) {
        System.out.println(a);
    }
}
### Java中`static`关键字详解 在Java中,`static`关键字是一个非常重要的概念,它用于修饰类的成员(变量和方法),表示这些成员属于类本身而是类的实例。这意味着无论创建多少个类的对象,静态成员都只有一份拷贝,并且可以通过类名直接访问,而需要创建对象。 #### 1. 静态变量Static Variables) 静态变量也被称为类变量,它们属于任何一个对象,而是属于整个类。所有该类的对象共享同一个静态变量静态变量可以在声明时初始化,也可以在静态代码块中初始化。 ```java public class Person { public static int age = 20; } ``` 上述代码中定义了一个名为`age`的静态变量,可以通过类名直接访问: ```java System.out.println(Person.age); // 输出20 ``` 需要注意的是,`static`关键字会影响变量或方法的作用域。访问权限仍然由`private`、`public`、`protected`以及默认包访问权限决定[^1]。 #### 2. 静态方法(Static Methods) 静态方法可以直接通过类名调用,无需创建类的实例。静态方法只能访问静态成员,能直接访问静态成员,因为非静态成员依赖于具体的对象实例。 ```java public class MathUtils { public static int add(int a, int b) { return a + b; } } ``` 调用静态方法的方式如下: ```java int result = MathUtils.add(5, 3); // 结果为8 ``` 此外,静态方法内部无法使用`this`关键字来引用当前对象,因为静态方法并与任何特定的对象关联[^1]。 #### 3. 静态代码块Static Code Blocks) 静态代码块是在类加载时执行的一段代码,通常用来初始化静态变量。它可以包含任意多条语句,并且可以多次出现,但它们会在程序运行期间仅被执行一次。 ```java public class StaticBlockExample { static { System.out.println("这是静态代码块"); } } ``` 当首次加载`StaticBlockExample`类时,会打印出“这是静态代码块”。 #### 4. 静态导入(Static Import) 从Java 5开始,支持静态导入功能,允许直接导入某个类的所有静态成员或者指定的静态成员,从而简化了对静态成员的调用。 ```java import static java.lang.Math.*; ``` 之后就可以直接使用数学函数而必加上`Math.`前缀: ```java double sqrtValue = sqrt(16); // 直接调用sqrt方法 ``` #### 5. 单例模式中的应用 `static`关键字常被用来实现单例设计模式,确保一个类只有一个实例存在,并提供全局访问点。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 在这个例子中,`instance`是静态变量,`getInstance()`是静态方法,共同保证了单一实例的存在。 #### 6. JVM与类加载 `static`关键字还涉及到JVM的工作机制,特别是类加载过程。类的加载分为三个阶段:加载、链接和初始化。其中,初始化阶段就是执行类构造器`<clinit>`的过程,这个过程包含了静态变量赋值动作和静态代码块的执行[^3]。 #### 7. 并发问题 由于静态成员在整个应用程序生命周期内都是可访问的,所以在多线程环境下需要特别小心处理同步问题。如果多个线程同时修改同一个静态变量,可能会导致数据一致的问题,因此可能需要采取适当的锁定策略来保护共享资源。 #### 8. 设计考量 尽管`static`提供了便利性,但也有人认为过度使用`static`可能是反设计模式的做法,因为它可能导致代码难以测试和维护,尤其是对于那些具有副作用的静态方法来说更是如此。此外,静态成员使得单元测试变得更加困难,因为它们容易被模拟(mock)或替换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值