目录
前言
一、什么是Static修饰符
二、Static核心用法
三、Static的注意事项
前言
从本篇开始,Java的学习就进入了进阶篇,内容相对来说比较晦涩且难理解,希望大家能够多动手,“纸上得来终觉浅,绝知此事要躬行”。
一、什么是Static修饰符
通常情况下,类里面的属性(变量)和行为(方法),必须在 new 出一个具体的对象后才能使用。每个对象都有自己独立的一份数据。
但是,有时候我们希望某个属性或方法被所有对象共享,或者不创建对象就能直接使用。这时候,static 就登场了。
被 static 修饰的成员,不再属于某一个具体的对象,而是属于这个类本身。
二、Static核心用法
①静态变量(共享属性)
假设我们定义一个 Student 类,所有学生都属于同一所大学。如果把大学名字设为普通变量,每次 new 对象都要存一遍,太浪费内存。如果设为 static,大家就共享同一个名字。
静态变量推荐直接用【类名.变量名】赋值
创建一个学生类:
public class Student {
String name;
int age;
public static String schoolName;
}
使用测试类来测试静态变量的使用:
public class Test {
public static void main(String[] args) {
Student.schoolName = "清华大学";
Student s1 = new Student();
s1.name = "张三";
Student s2 = new Student();
s2.name = "李四";
System.out.println(s2.name + " 就读于 " + s2.schoolName);
}
}
运行结果:
![]()
静态变量的特点:
- 被该类所有对象共享
- 不属于对象,属于类
- 随着类的加载而加载,优先于对象存在
②静态方法(工具方法)
如果一个方法内部不需要用到对象的实例变量,我们就可以把它设为静态方法。它的好处是不用 new 对象,直接用类名就能调用。
补充知识:
应用场景:
请按照如下要求编写一个数组的工具类:ArrayUtil
- 提供一个工具类方法printArr,用于返回整数数组的内容。返回的字符串格式如:[10, 20, 55, 99]
- 提供这样一个工具方法getAverage,用于返回平均分。
- 定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果
首先定义ArrayUtil工具类
public class ArrayUtil {
//首先私有化构造方法,防止创建工具类对象
private ArrayUtil(){};
//printArr方法,使用static修饰方便调用
public static String printArr(int[] arr){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length – 1){
sb.append(arr[i]);
}else{
sb.append(arr[i] + ",");
}
}
sb.append("]");
String result = sb.toString();
return result;
}
public static double getAverage(double[] arr){
double sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
double average = sum / arr.length;
return average;
}
}
使用测试类TestDemo测试该工具类中的方法:
public class TestDemo {
public static void main(String[] args) {
int[] arr = {1, 10, 100, 1000};
String result = ArrayUtil.printArr(arr);
System.out.println(result);
double[] arr2 = {1.3, 2.4, 5.6, 6.7};
double result2 = ArrayUtil.getAverage(arr2);
System.out.println(result2);
}
}
运行结果如下:

三、Static的注意事项
以下代码方便大家理解记忆:
public class StaticRulesDemo {
// 1. 静态变量(属于类,全类共享)
static String schoolName = "Java大学";
// 2. 非静态成员变量(属于对象,也就是实例变量)
String studentName = "张三";
/**
* 知识点 1 & 3:静态方法的限制
*/
public static void staticMethod() {
// ✅ 成功:静态方法可以访问静态变量
System.out.println("学校名称:" + schoolName);
// ✅ 成功:静态方法可以调用其他静态方法
anotherStaticMethod();
// ❌ 编译报错:静态方法不能访问非静态变量
// System.out.println(studentName);
// 原因分析:静态方法随着类加载就存在了,此时可能还没有 new 任何对象,所以找不到属于对象的 studentName。
// ❌ 编译报错:静态方法不能调用非静态方法
// nonStaticMethod();
// ❌ 编译报错:静态方法中没有 this 关键字!
// System.out.println(this.schoolName);
// 原因分析:this 代表"当前调用该方法的对象"。既然静态方法不依赖于对象,自然就没有 this 的概念。
}
public static void anotherStaticMethod() {
System.out.println("执行了另一个静态方法…");
}
}

