1. static 关键字与成员变量
1.1 静态变量(类变量)与实例变量
| 对比维度 | 静态变量 | 实例变量 |
|---|---|---|
| 修饰符 | static 修饰 | 无 static 修饰 |
| 归属 | 属于类,所有对象共享 | 属于对象,每个对象独立 |
| 内存存储位置 | 方法区(JDK8 后为元空间) | 堆内存(对象实例中) |
| 初始化时机 | 类加载时初始化 | 对象创建时初始化 |
| 访问方式 | 类名.静态变量(推荐)对象.静态变量(不推荐) | 对象.实例变量 |
示例代码:
public class Student {
// 静态变量(类变量)
static String school = "清华大学";
// 实例变量(对象变量)
int age;
}
内存分配示意图:
| 内存区域 | 存储内容 |
|----------|-----------------------------------|
| 方法区 | Student.class(包含静态变量 school) |
| 堆内存 | Student对象实例:age=20 |
| 栈内存 | Student s = 0x4f3f5b24(对象地址) |
1.2 静态变量与实例变量的定义场景
-
静态变量:
数据需要被所有对象共享时使用(如全局配置、计数器)。public class Config { public static String APP_NAME = "MyApp"; } -
实例变量:
数据需要每个对象独立维护时使用(如姓名、年龄)。public class Student { private String name; // 实例变量 }
2. static 修饰的成员方法
2.1 静态方法(类方法)与实例方法
| 对比维度 | 静态方法 | 实例方法 |
|---|---|---|
| 修饰符 | static 修饰 | 无 static 修饰 |
| 归属 | 属于类 | 属于对象 |
| 调用方式 | 类名.静态方法()(推荐)对象.静态方法()(不推荐) | 对象.实例方法() |
| 访问权限 | 只能直接访问静态成员 | 可直接访问静态成员和实例成员 |
| this 关键字 | 不可使用 this | 可使用 this |
示例代码:
public class MathUtils {
// 静态方法(工具方法)
public static int add(int a, int b) {
return a + b;
}
// 实例方法
public void printResult(int result) {
System.out.println("结果是:" + result);
}
}
2.2 静态方法的常见应用场景
工具类设计:
- 工具类中的方法通常为静态方法,无需创建对象即可调用。
- 优点:提高代码复用性,节省内存。
- 私有构造器,禁止实例化!!
示例代码:
public class StringUtils {
// 私有构造器,禁止实例化
private StringUtils() {}
// 静态方法:判断字符串是否为空
public static boolean isEmpty(String str) {
return str == null || str.trim().isEmpty();
}
// 静态方法:生成随机字符串
public static String generateRandom(int length) {
// 实现逻辑
return "随机字符串";
}
}
// 调用工具方法
boolean isBlank = StringUtils.isEmpty(" ");
内存优势:
- 工具类无需实例化对象,避免堆内存占用。
3. 静态方法与实例方法的访问规则
3.1 静态方法访问成员的限制
- 静态方法中:
- 可直接访问静态成员(变量/方法)。
- 不可直接访问实例成员(需通过对象实例访问)。
示例:
public class Student {
static String school = "清华大学";
int age;
// 静态方法
public static void printSchool() {
System.out.println(school); // 合法
// System.out.println(age); // 报错!不能直接访问实例变量
}
}
- 实例方法中:
- 可直接访问静态成员和实例成员。
- 可使用
this关键字。
示例:
public class Student {
static String school = "清华大学";
int age;
// 实例方法
public void printInfo() {
System.out.println(school); // 合法
System.out.println(this.age); // 合法
}
}
3.2 内存执行原理
-
静态成员(方法区):
- 类加载时分配内存,所有对象共享。
- 静态方法调用时,直接从方法区加载到栈内存执行。
-
实例成员(堆内存):
- 对象创建时分配内存,每个对象独立。
- 实例方法调用时,需通过对象引用访问堆内存中的数据。
调用流程示例:
Student s = new Student();
s.printInfo(); // 实例方法调用流程:
// 1. 栈内存中创建方法帧
// 2. 访问堆内存中的 age
// 3. 访问方法区中的 school
4. 工具类设计规范
4.1 工具类的核心特点
- 静态方法为主:所有方法均为静态方法,无需实例化。
- 私有化构造器:禁止通过
new创建对象。 - 功能独立性:每个方法完成单一功能,无状态依赖。
示例:
public final class FileUtils {
// 私有构造器
private FileUtils() {}
// 静态方法:读取文件内容
public static String readFile(String path) {
// 实现逻辑
return "文件内容";
}
// 静态方法:写入文件
public static void writeFile(String path, String content) {
// 实现逻辑
}
}
4.2 工具类的优势
- 内存高效:无需创建对象,减少堆内存占用。
- 调用便捷:直接通过类名调用,代码简洁。
- 高复用性:通用功能集中管理,便于维护。
5. 总结
-
静态成员:
- 属于类,存储在方法区,所有对象共享。
- 适用于全局共享数据和工具方法。
-
实例成员:
- 属于对象,存储在堆内存,每个对象独立。
- 适用于对象特有属性或行为。
-
工具类设计:
- 通过静态方法和私有构造器实现高内聚、低耦合。
- 典型应用:
Math、Collections、StringUtils。
核心原则:
- 优先使用静态方法设计工具类,避免不必要的对象创建。
- 严格区分静态成员与实例成员的作用域,防止数据混乱。
914

被折叠的 条评论
为什么被折叠?



