Java static静态变量和静态方法(通俗易懂,新手必看)
在 Java 程序中,由 static 修饰的变量和方法被称为静态变量和静态方法。
有时,在处理问题时会需要两个类在同一个内存区域共享一个数据。例如,在球类中使用圆周率 PI 这个值,可能除了本类需要这个值,在另一个圆类中也需要这个值。这时没有必要在两个类中同时创建 PI,因为这样系统会将这两个不在同一个类中定义的静态值分配到不同的内存空间中。
为了解决这个问题,可以将 PI 设置为静态的。PI 在内存中被共享的布局如下图所示:

图 1 PI 在内存中被共享的情况
被声明为 static 的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员。语法如下:
【实例】创建并调用静态变量和静态方法。创建 StaticDemo 类,在类中使用 static 关键字定义一个变量和一个方法,并在主方法中调用它们。
静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循 public、private 和 protected 修饰符的约束。
【实例】统计顾客总人数。在 Cust 类中创建一个静态整数类型属性 count,在构造方法中让 count 自增。
如果在执行类时,希望先执行类的初始化动作,可以使用 static 定义一个静态区域,这块区域称为静态代码块。当类文件被执行时,会首先执行 static 块中的程序,并且只会执行一次。静态代码块的语法如下:
有时,在处理问题时会需要两个类在同一个内存区域共享一个数据。例如,在球类中使用圆周率 PI 这个值,可能除了本类需要这个值,在另一个圆类中也需要这个值。这时没有必要在两个类中同时创建 PI,因为这样系统会将这两个不在同一个类中定义的静态值分配到不同的内存空间中。
为了解决这个问题,可以将 PI 设置为静态的。PI 在内存中被共享的布局如下图所示:

图 1 PI 在内存中被共享的情况
被声明为 static 的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员。语法如下:
类名.静态类成员
【实例】创建并调用静态变量和静态方法。创建 StaticDemo 类,在类中使用 static 关键字定义一个变量和一个方法,并在主方法中调用它们。
public class StaticDemo { static double PI = 3.1415; // 在类中定义静态变量 public static void method() { // 在类中定义静态方法 System.out.println("这是静态方法"); } public static void main(String[] args) { System.out.println(StaticDemo.PI); // 调用静态变量 StaticDemo.method(); // 调用静态方法 } }运行结果如下:
3.1415
这是静态方法
静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循 public、private 和 protected 修饰符的约束。
【实例】统计顾客总人数。在 Cust 类中创建一个静态整数类型属性 count,在构造方法中让 count 自增。
public class Cust { // 顾客类 static int count = 0; // 共享的属性:人数 String name; // 名称属性 public Cust(String name) { // 记录名称 this.name = name; // 记录名称 count++; // 人数递增 } public static void main(String[] args) { Cust c1 = new Cust("tom"); System.out.println("我是第" + Cust.count + "名顾客,我叫" + c1.name); Cust c2 = new Cust("张三"); System.out.println("我是第" + Cust.count + "名顾客,我叫" + c2.name); Cust c3 = new Cust("狗蛋儿"); System.out.println("我是第" + Cust.count + "名顾客,我叫" + c3.name); } }运行结果如下:
我是第1名顾客,我叫tom
我是第2名顾客,我叫张三
我是第3名顾客,我叫狗蛋儿
如果在执行类时,希望先执行类的初始化动作,可以使用 static 定义一个静态区域,这块区域称为静态代码块。当类文件被执行时,会首先执行 static 块中的程序,并且只会执行一次。静态代码块的语法如下:
public class example { static { // 可以在这里写初始化的代码 } }总结一下,使用 static 关键字要注意的以下几点:
- 在静态方法中不可以使用 this 关键字;
- 在静态方法中不可以直接调用非静态方法;
- 局部变量不可以使用 static 关键字进行声明;
- 主方法必须用 static 关键字进行声明;
- 只有内部类可以使用 static 关键字进行声明。