Java中static关键字的作用

本文深入解析Java中的静态特性,包括静态变量与实例变量的区别、静态方法的使用、静态代码块的功能以及static与final的联合使用场景。通过实例代码展示如何在类中合理应用静态元素,以提高代码的复用性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static 从字面上讲就是“静态”的意思,可以用来修饰类、类的成员变量、类的方法,同时也可以通过使用static来形成静态代码块。


被static修饰的类的成员变量和成员方法独立于该类的任何实例对象,也就是说它不依赖类特定的实例,被类的所有实例所共享。


当类的成员变量前面用public static修饰时,表示成员变量(方法)在本质上时全局变量(方法),当声明该类的实例时,不生成public static修饰的变量(方法)的副本,而是类的所有对象共用一个static 变量(方法)

当类的成员变量前面用private static修饰时,与采用public static修饰的主要区别就是被修饰的变量或方法不能再其他类中通过类名来直接进行访问,由此可以看出区别就在与访问权限关键字public同private的区别,其他的访问权限关键字一次类推。


1、静态变量与实例变量

static修饰的变量就是静态变量(类变量),没被static修饰的变量就是实例变量。二者的区别在于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存(该分配发生在加载类的过程中),可以通过类名直接访问,也可以通过类的实例对象来访问(不推荐);实例变量每创建一个实例,都会在内存中单独分配一次内存,实例变量可以在内存中存在多个拷贝,且这多个拷贝相互之间互不影响。

所以一般在实现以下两个功能时会用到静态变量

    • 在类的对象之间共享值时;
    • 需要便捷访问某个变量时;

2、静态方法
静态方法可以直接通过类名调用,任何类的实例对象也可以调用,因此静态方法中不能使用this和super关键字,不能访问所属类的实例变量和实例方法(就是类中声明时未采用static关键字修饰的变量和方法),只能访问所属类声明的静态变量和静态方法,原因就在于实例成员(变量和方法)需要与类特定的对象相关联。
由于静态方法独立于具体类的实例,所以静态方法不能采用abstract修饰,即不能时抽象的。
静态方法是类内部特许的一类方法,只有在需要时才将方法声明为静态的,类内部的方法一般是非静态的。
3、static代码块
static代码块又叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM在加载类的时候会执行这些静态代码块,有多个静态代码块时,JVM将会按照他在类中出现的先后顺序来执行它们,每个代码块只被执行一次。例如:
public class StaticTest {

    private static int a;
    private int b;

    // static代码块1
    static {
        StaticTest.a = 3;
        System.out.println(a);
        StaticTest t = new StaticTest();
        // 调用成员变量和成员方法
        t.f();
        t.b = 1000;
        System.out.println(t.b);

    }
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }

    // static代码块2
    static {
        StaticTest.a = 5;
        System.out.println(a);
    }

    public void f(){
        System.out.println("Static test!");
    }
}

输出结果:

3

Static test!

1000

5

Hello World!


由此可见,通过静态代码块可以可以对static变量进行赋值操作。

4、static和final一起使用的情况
当用static final修饰成员变量和成员方法时,可以简单理解为“全局变量”。
  • 对于变量,表示一旦赋值就不可修改,并且可以通过类名进行访问;
  • 对于方法,表示该方法不可覆盖,并且可以通过类名进行访问;

小结以下

  1. static修饰成员变量JVM只为其分配一次内存,这次内存分配发生在该static成员所在类加载时;
  2. static方法中不能直接使用非静态成员和方法,能调用静态方法,可访问静态成员变量;
  3. static方法独立于类具体对象存在,所以在static方法体内不能存在类对象相关的关键字(如this和super);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值