通过直接访问,我的意思是为什么他们不能访问实例变量而不使用字段所属类的实例? 如果可能,请根据记忆回答。为什么静态方法和静态嵌套类不能直接访问实例变量?
回答
非静态字段位于每个实例中,其他位置无。
在静态方法中,您没有对实例的默认引用,所以方法无法知道您想要哪个实例。
问题不是地址或内存的问题,这是一个逻辑问题。
这就好像在说:“我不会迷路,我只是不知道自己在哪里,请使用地图来解释它。”
因此,非静态方法对实例有默认引用? – 2013-05-11 22:04:27
@KacyRaye外部类对'this'的引用在许多情况下是可选的。嵌套类也可以引用其外部类。在JVM级别,“this”作为第一个参数传递给您。 – 2013-05-11 22:06:43
这很简单。没有实例,没有任何可访问的东西。
或者就内存而言:您尝试访问的内容在内存中不存在。
编辑
如果像@Alnitak以下建议,是在某个地方的实例,这不利于在所有。您需要参考特定的JVM实例才能找到它的成员。
它也是保持命名空间清晰。即使它们是静态的,如果程序试图访问方法/类,你仍然会编译错误。
拿这个程序,例如:
public class Test {
public static void main(String[] args) {
double d = Math.random();
System.out.println(d);
}
}
很明显,你可以调用Math.random()而不必创建Math类的实例; random()是一个静态方法,这意味着它不绑定到类的实例,它可以在没有绑定的情况下使用。因此它不能访问Math实例的变量,因为它应该使用哪个实例?可能有数百个或根本没有。
静态内部类也是如此,它们没有绑定到外部类的实例,可以独立创建和使用。
- 1. 静态嵌套类的(实例)可以访问外部静态变量吗?
- 2. 为什么静态类不能有非静态方法和变量?
- 3. 为什么派生类不能访问基类静态方法?
- 4. 从另一个类从静态方法访问实例变量
- 5. 我们是否可以从静态嵌套类访问非静态嵌套类的非静态方法
- 6. 从C++中的静态方法访问非静态类变量
- 7. 为什么实例方法不能覆盖静态方法
- 8. 为什么静态方法不能引用实例方法?
- 9. 实现AsyncTask的正确方法是什么?静态或非静态嵌套类?
- 10. 嵌套类的接口静态方法
- 11. 静态方法不能访问类的实例成员
- 12. 为什么不能通过实例变量访问共享/静态成员?
- 13. 访问静态类变量
- 14. 静态方法不能实现接口方法,为什么?
- 15. 什么是静态方法和变量?
- 16. 为什么静态嵌套类?
- 17. 为什么非静态方法可以访问静态字段?
- 18. 嵌套类和静态方法
- 19. 为什么非静态变量不能在静态方法内初始化?
- 20. 非静态类实例中的c#静态变量的行为是什么?
- 21. 静态方法的Java实例变量
- 22. 为什么我不能访问静态变量?
- 23. 是否可以通过静态方法访问实例变量?
- 24. 访问嵌套的静态常量
- 25. 访问静态变量的Const方法
- 26. 静态方法vs静态实例
- 27. 静态嵌套类访问抛出NoClassDefFoundError
- 28. 从静态方法访问非静态成员变量
- 29. 访问静态变量从静态方法
- 30. 静态类中的静态变量和非静态类中的静态变量
因为没有。不是一个真正的问题。 – EJP 2013-05-12 00:39:06