Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

静态方法能访问实例变量吗?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

静态方法可以通过明确的对象引用访问允许访问的实例变量,但不能不指明对象就直接使用实例字段或 this。原因是调用静态方法时不一定存在任何实例,更没有自动绑定的“当前对象”。限制的是缺少接收对象的直接访问,不是禁止静态代码与实例交互。

讲清原理

假设每个账户都有自己的余额。调用 Account.total() 时,编译器无法猜测你想读取哪一个账户的余额。给出具体账户引用,问题就明确了。

对象引用可以来自参数、工厂方法或其他合法来源,不必每次在静态方法里 new 一个对象。访问仍需遵守 private、包和模块等规则;有引用也不等于能读所有字段。

同一个运行时类共享静态字段,每个实例分别拥有实例字段
同一个运行时类共享静态字段,每个实例分别拥有实例字段

例子与易错点

class Account {
    private int balance = 8;
    static int read(Account account) { return account.balance; }
}
System.out.println(Account.read(new Account())); // 8

若把方法体改成 return balance;,编译会失败,因为缺少当前实例。也不要为了消除这个错误,就把本应各对象独立保存的业务字段改成 static;那会改变数据归属,可能让多个用户共享同一份状态。

相关题:第 34 题、第 46 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。