首页 > 编程笔记 > Java笔记 阅读:18

Java static关键字的3种用法(非常详细,附带实例)

Java 语言中,static 关键字用于修饰类的成员变量、成员方法以及代码块,被 static 修饰的成员称为静态成员。

为什么要用 static 关键字呢?就像现实世界中有公共设施(公园、卫生间、汽车等)资源共享一样,Java 程序中类的一些成员变量、成员方法、代码块也可以被程序所共享。

在现实场景中,汽车站乘客需要向销售员进行购票,下面使用程序模拟两个售票员同时售卖一辆大巴车票的情形。
class Saler { // 定义售票员类
    int ticket = 5; // 初始化客车总票数
    public void sale() {
        ticket--;
    }
}

public class Demo { // 模拟售票
    public static void main(String[] args) {
        Saler s1 = new Saler(); // 创建售票员1;
        s1();.sale // 售票员1卖票1张
        System.out.println("销售员1剩余票:" + s1.ticket + "张");
        Saler s2 = new Saler(); // 创建售票员2
        s2.sale(); // 售票员2卖票1张
        System.out.println("销售员2剩余票:" + s2.ticket + "张");
    }
}
程序的运行结果如下:

销售员1剩余票:4张
销售员2剩余票:4张

很明显,出现这样的问题是不应该的,因为 ticket 是 Saler 类的共有属性,而不是被其某个对象独有。要解决这一问题,就需要使用 static 关键字。

Java static静态变量

使用 static 修饰的成员变量,称为静态变量或类变量,它被类的所有对象共享,属于整个类所有,因此可以通过类名直接来访问。而未使用 static 修饰的成员变量称为实例变量,它属于具体对象独有,只能通过引用变量访问。

修改上面的实例:
class Saler {
    static int ticket = 5;
    public void sale() {
        ticket--;
    }
}
// 其他代码和之前一样
程序的运行结果如下:

销售员1剩余票:4张
销售员2剩余票:3张

很明显,使用 static 关键字修饰 Saler 类的成员变量 ticket 以后,程序运行结果符合实际情况。

注意,static 关键字在修饰变量时只能修饰成员变量,不能修饰方法中的局部变量,具体示例如下:
public class Test {
    public void show() {
        static int count = 0;  // 非法,编译会报错
    }
}

Java static静态方法

在实际开发中,开发人员往往需要在不创建实例的情况下直接调用类的某些方法。使用 static 修饰的成员方法,称为静态方法,它无须创建类的实例就可以直接通过类名来调用,当然也可以通过对象名来调用。

接下来,通过案例来演示静态方法的使用。
class Dog {
    private static int count; // 保存对象创建的个数
    public Dog() {
        count++;
    }
    public static void show() {
        System.out.println("类实例化次数:" + count);
    }
}

public class Demo {
    public static void main(String[] args) { // 调用静态方法
        Dog.show(); // 创建Dog对象
        Dog d1 = new Dog();
        Dog d2 = new Dog();
        Dog d3 = new Dog();
        Dog d4 = new Dog();
        Dog d5 = new Dog();
        Dog.show(); // 再次调用静态方法
    }
}
程序的运行结果如下:

类实例化次数:0
类实例化次数:5

程序中,Dog 类定义了静态方法 show(),并通过 Dog.show() 的形式调用了该静态方法,由此可见,不需要创建对象就可以调用静态方法。

静态方法只能访问类的静态成员(静态变量、静态方法),不能访问类中的实例成员(实例变量、实例方法)。这是因为未被 static 修饰的成员都是属于对象的,所以需要先创建对象才能访问,而静态方法在被调用时可以不用创建任何对象。

Java static静态代码块

代码块是指用大括号{ }括起来的一段代码,根据位置及声明关键字的不同,代码块可分为普通代码块、构造代码块、静态代码块和同步代码块。

静态代码块就是 static 修饰的代码块,执行优先级高于非静态的初始化块,它会在类初始化时执行一次,执行完成便销毁,仅能初始化类变量,即 static 修饰的数据成员。

接下来,通过案例来演示静态代码块的使用:
class Dog {
    public Dog() { // 定义构造方法
        System.out.println("Dog类的构造方法");
    }
    static { // 定义静态代码块
        System.out.println("Dog类内的静态代码块");
    }
}

public class Demo {
    public static void main(String[] args) { // 实例化对象
        new Dog();
        new Dog();
        new Dog();
    }
    static { // 定义静态代码块
        System.out.println("main方法所在类的静态代码块");
    }
}
程序的运行结果如下:

main方法所在类的静态代码块
Dog类内的静态代码块
Dog类的构造方法
Dog类的构造方法
Dog类的构造方法

从程序运行结果中可以发现,静态代码块先于主方法和构造代码块执行,而且无论类的对象被创建多少次,由于 Java 虚拟机只加载一次类,所以静态代码块只会执行一次。

相关文章