Java实例方法访问规则及类与实例成员组合疑问
Java 实例与类成员访问问题解答
问题1:“实例方法可直接访问实例方法”到底是什么意思?
说白了,这就是Java给实例方法开的“便利通道”。咱们先明确下:实例方法就是没加static关键字的方法,它属于类的某个具体对象(实例),而不是类本身。
当你在一个实例方法里,不需要额外创建对象、也不用写对象名.方法名,就能直接调用同一个类里的另一个实例方法。比如下面这段代码:
public class Book { public void printTitle() { System.out.println("Java 编程入门"); } public void showInfo() { // 这里直接调用了printTitle,完全合法! printTitle(); // 其实背后默认是用this.printTitle(),只是Java允许你省略this } }
为啥能这么干?因为当你调用实例方法的时候,当前已经存在一个该类的对象了,Java会自动把这个对象的引用this绑定到方法里,所以直接调用其他实例方法时,默认就是用this去调用,看起来就像“直接访问”一样。
问题2:Java文档里“并非所有实例与类变量、方法的组合……”这句话怎么理解?
哈哈,这句话其实是Java文档在给你敲警钟:不是所有类型的成员都能随便互相访问,存在明确的访问限制。我给你把这些规则掰碎了说:
先回忆你已经知道的:static修饰的是类成员(类变量、类方法),属于类本身;没加static的是实例成员,属于具体对象。
它们的访问规则是:
- 实例方法(非静态)可以随便访问:
- 同一个类里的其他实例方法
- 实例变量
- 类方法(静态方法)
- 类变量(静态变量)
- 但类方法(静态方法)绝对不能直接访问实例成员:
- 不能直接调用实例方法
- 不能直接访问实例变量
为啥?因为类方法是属于类的,调用它的时候可能根本没创建任何对象实例,没有对象,自然找不到对应的实例方法和变量。比如下面这段代码编译直接报错:
public class Calculator { private int result = 0; // 实例变量 public static void add(int num) { // 这里直接访问result会报错!因为static方法没有this引用,找不到对应的实例 result += num; } }
所以文档里那句表述就是在告诉你:别想当然觉得所有成员之间都能互通,得记住静态上下文(类方法、静态代码块)和非静态上下文(实例方法)的访问边界。
内容的提问来源于stack exchange,提问作者Mihir
相关产品推荐
相关产品推荐

