为什么静态方法不能直接访问非静态字段?
查看完整题解
参考回答
直接回答
因为静态方法没有自动绑定的当前实例,而实例字段必须属于某个具体对象。类名调用一个静态方法时,运行环境不能替你决定读取哪个对象的字段。但只要显式提供合法对象引用,静态方法仍可以按访问规则读取其实例状态。
讲清原理
重点不是“静态的一定先创建,实例的一定后创建”。即使程序已经创建了一百个对象,静态方法也不会自动拥有一个 this。它仍然需要明确接收对象。
把缺少实例的编译错误改成 static 字段,可能会把原本独立的数据变成共享状态。新建一个临时对象也未必正确,因为你可能要读的是已有业务对象,而不是一份全新的默认状态。
例子与易错点
class Box {
int value;
Box(int value) { this.value = value; }
static int read(Box box) { return box.value; }
}
Box first = new Box(3);
Box second = new Box(9);
System.out.println(Box.read(first) + ":" + Box.read(second)); // 3:9
传入不同对象就读取不同状态。这里若不传对象而直接返回 value,会编译失败。字段是否 private 是访问权限问题,与静态方法是否拥有当前实例,是两条不同的规则。
相关题:第 5 题、第 34 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。