Java static关键字的3种用法(非常详细,附带实例)
Java 语言中,static 关键字用于修饰类的成员变量、成员方法以及代码块,被 static 修饰的成员称为静态成员。
为什么要用 static 关键字呢?就像现实世界中有公共设施(公园、卫生间、汽车等)资源共享一样,Java 程序中类的一些成员变量、成员方法、代码块也可以被程序所共享。
在现实场景中,汽车站乘客需要向销售员进行购票,下面使用程序模拟两个售票员同时售卖一辆大巴车票的情形。
修改上面的实例:
注意,static 关键字在修饰变量时只能修饰成员变量,不能修饰方法中的局部变量,具体示例如下:
接下来,通过案例来演示静态方法的使用。
静态方法只能访问类的静态成员(静态变量、静态方法),不能访问类中的实例成员(实例变量、实例方法)。这是因为未被 static 修饰的成员都是属于对象的,所以需要先创建对象才能访问,而静态方法在被调用时可以不用创建任何对象。
静态代码块就是 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张
Java static静态变量
使用 static 修饰的成员变量,称为静态变量或类变量,它被类的所有对象共享,属于整个类所有,因此可以通过类名直接来访问。而未使用 static 修饰的成员变量称为实例变量,它属于具体对象独有,只能通过引用变量访问。修改上面的实例:
class Saler { static int ticket = 5; public void sale() { ticket--; } } // 其他代码和之前一样程序的运行结果如下:
销售员1剩余票:4张
销售员2剩余票:3张
注意,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
静态方法只能访问类的静态成员(静态变量、静态方法),不能访问类中的实例成员(实例变量、实例方法)。这是因为未被 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类的构造方法