如果我们在静态方法中创建一个实例,那么该实例是否会隐式变为静态?

时间:2015-01-17 15:06:38

标签: java

class A
{
int i = 10;
public static void main(String[] args)
{
A a= new A();
a.i=20;
}
}

运行正常,但在尝试编写以下代码时

class A
{
A a= new A();
int i = 10;
public static void main(String[] args)
{
a.i=20;
}
}

它给出了编译时错误。这意味着我们在静态方法中编写的任何(假设引用变量)都被隐式地视为静态变量。

1 个答案:

答案 0 :(得分:0)

您正在混淆类范围,方法范围和实例范围。

首先请记住,当您拥有静态内容时,该类可用于该类的所有实例。当某些东西不是静态的时,它只能用于某个类的特定实例,并且不会被共享。因此,静态方法不能对实例变量(或方法)起作用。

在第一个示例中,您创建了一个范围为A方法的main()main()是静态的这一事实与它无关,这是方法级别的范围。当您在.i的该实例上调用A时,您将在您的示波器本地实例上调用它。

在第二个示例中,您要说的是,只要A被实例化,它就会有另一个A实例(导致其他问题,见下文)。这是在对象实例范围内。当您尝试从静态范围的main()方法调用它时,编译器不知道您要使用哪个A的特定实例。每个人都有自己的版本i

最后,通过在AA)的每个其他实例中创建A a = new A();的实例,您的代码将永远无法运行,您将获得StackOverflowException

修改以回答问题:

好的,当你做这样的事情时:

public class Person {
    String name = null;
}

您说,对于我们创建的每个Person(通过新的),他们都有name适用于他们,而且只适用于他们。他们不与任何人分享。

所以当你做这样的事情时:

public class A {
    A a = new A();
}

你说的是,对于我们创建的每个A(通过new),它都有另一个A,仅适用于该实例和该实例。看看这是怎么回事?你最终会无限制地创建A个对象,直到java为它们的堆栈空间耗尽。第一个A已创建,并尝试创建其内部A,尝试创建其内部A,依此类推。