静态成员属于类本身,被所有实例共享。1. 静态变量用Static声明,类加载时分配内存,所有对象共用一份,如Person类的count计数器;2. 静态方法只能访问静态成员,不能直接访问实例成员,因其实例存在前静态方法已可用,如main()和math.max();3. 静态代码块static{}在类加载时执行一次,用于初始化静态资源;4. 推荐通过类名访问静态成员,语义清晰且避免误解。核心是“一份数据,全局共享”,不可在静态上下文中使用this或实例成员。

在Java中,理解类的静态成员关键在于搞清楚静态成员属于类本身,而不是某个具体的对象实例。这意味着无论创建多少个对象,静态成员在内存中只有一份,被所有实例共享。
静态变量:共享的数据
静态变量用 static 关键字声明,它不属于任何一个对象,而是属于类。只要类被加载,静态变量就会被分配内存。
比如:
定义一个计数器来记录创建了多少个对象:
public class Person {<br> private String name;<br> private static int count = 0;<br><br> public Person(String name) {<br> this.name = name;<br> count++;<br> }<br><br> public static int getCount() {<br> return count;<br> }<br> }
每创建一个 Person 对象,count 就加1。这个 count 是所有 Person 实例共用的。可以通过 Person.getCount() 直接调用,不需要创建对象。
立即学习“Java免费学习笔记(深入)”;
静态方法:操作静态数据的工具
静态方法也用 static 修饰,它只能访问静态变量和其他静态方法,不能直接访问实例成员(非静态成员)。
原因很简单:
静态方法在类加载时就存在,而实例成员必须等对象创建后才存在。如果静态方法能随意访问实例成员,就会出现“还没生孩子就想叫爹”的问题。
常见的静态方法如 main() 方法,它是程序入口,jvm 调用它时还没有任何对象。
另一个例子是 Math.max(),不需要创建 Math 对象就能直接使用。
静态代码块:类加载时执行一次
静态代码块用 static {} 定义,它在类第一次被加载时执行,且只执行一次。常用于初始化静态变量或加载配置。
例如:
static {<br> System.out.println("Person 类被加载了");<br> }
这在数据库连接池、日志配置等场景中很常见。
访问方式:推荐用类名
虽然静态成员可以通过对象访问(如 person.getCount()),但强烈建议使用类名调用(如 Person.getCount()),这样语义更清晰,表明这是类级别的操作。
这样做也能避免误解,比如你以为调用了某个对象的特有方法,其实它对所有对象都一样。
基本上就这些。静态成员的核心就是“一份数据,全局共享”,理解这一点,就能正确使用它们。注意别在静态方法里直接调用 this 或实例变量,那是行不通的。


