2011-12-25 112 views
2

我知道在java中静态方法只能使用静态变量和静态方法,而非静态方法可以使用非静态变量和方法。有什么解释为什么静态方法只能访问静态变量/方法?并不能访问非静态方法和变量?静态方法和变量

+0

可能的重复[无法从静态函数?](http://stackoverflow.com/questions/8029845/cannot-be-referenced-from-a-static-function) – 2011-12-25 06:48:09

+0

它不是重复的,我的问题的内容是完全不同的。 – KyelJmD 2011-12-25 06:56:33

+2

该问题的答案同样适用于这个问题。 – 2011-12-25 06:58:46

回答

8

要访问非静态方法/字段,您需要一个类的实例。

+0

...按定义。 – 2011-12-25 06:50:15

+0

但是OP想知道*为什么*。这是一些武断的规则,还是有原因?我们应该解释“是的,有一个非常重要的原因”。恕我直言... – paulsm4 2011-12-25 07:28:41

+1

如果我们理解“静态”实际上意味着什么(而不是仅仅学习规则),那么理由应该是显而易见的。 – 2011-12-25 07:38:25

2

想一想:

a)假设你是一个静态方法。

b)您独立于任何对象实例存在。即使没有类实例,你也存在。

c)你想访问一个非静态变量。存在于ONE和ONLY一个对象实例中的变量 - 与该PARTICULAR对象实例相关的变量。

d)你打算使用哪个对象实例的非静态变量?

静态方法可以访问类的非静态成员...只要它们通过类引用来完成。

否则 - 没有类引用 - 无法访问。

有意义吗? ;)

+0

soo它意味着是没有类的引用,我无法访问该实例变量?我对吗? – KyelJmD 2011-12-25 07:00:57

+0

恰到好处:) – paulsm4 2011-12-25 07:26:08

3

当你实例化一个类时,它将被加载到堆或栈中。在这种情况下,您的应用程序会引用内存实例所在的那些部分。但是,静态方法只是加载到内存中的函数。这就是为什么如果你的静态方法想要访问一个类变量或方法,它不能仅仅调用它,因为可能存在多个对该堆中的那个类的引用,与之相反,只有一个静态方法可以存在。

如果你想从静态方法调用任何非静态方法,你应该使用实例(或创建一个)到该类,以便你可以定义你真正意义的类引用。

0

在静态上下文中,“this”关键字不可访问。我们不能在静态上下文中使用这个关键字。实例变量在构造函数调用时被初始化。但是静态变量在类加载时被初始化。在类的加载过程中,如果我们在静态上下文中使用实例变量,实例变量在这段时间内仍未被识别,它会导致编译时错误,因为它们当时未被识别