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;
}
}
它给出了编译时错误。这意味着我们在静态方法中编写的任何(假设引用变量)都被隐式地视为静态变量。
答案 0 :(得分:0)
您正在混淆类范围,方法范围和实例范围。
首先请记住,当您拥有静态内容时,该类可用于该类的所有实例。当某些东西不是静态的时,它只能用于某个类的特定实例,并且不会被共享。因此,静态方法不能对实例变量(或方法)起作用。
在第一个示例中,您创建了一个范围为A
方法的main()
。 main()
是静态的这一事实与它无关,这是方法级别的范围。当您在.i
的该实例上调用A
时,您将在您的示波器本地实例上调用它。
在第二个示例中,您要说的是,只要A
被实例化,它就会有另一个A
实例(导致其他问题,见下文)。这是在对象实例范围内。当您尝试从静态范围的main()
方法调用它时,编译器不知道您要使用哪个A
的特定实例。每个人都有自己的版本i
。
最后,通过在A
(A
)的每个其他实例中创建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
,依此类推。