Java 如果我们在静态方法中创建一个实例,该实例会隐式地变为静态吗?

Java 如果我们在静态方法中创建一个实例,该实例会隐式地变为静态吗?,java,Java,运行正常,但尝试编写以下代码时 class A { int i = 10; public static void main(String[] args) { A a= new A(); a.i=20; } } 它给出了编译时错误。这意味着,我们在静态方法中编写的所有ASSUE引用变量都被隐式地视为静态变量。您混淆了类范围、方法范围和实例范围 首先请记住,当您有静态的东西时,它对该类的所有实例都是可用的。当某些内容不是静态的时,它仅对类的特定实例可用,并且不共享。因此,静态方法不能作用于实例变量

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

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

它给出了编译时错误。这意味着,我们在静态方法中编写的所有ASSUE引用变量都被隐式地视为静态变量。

您混淆了类范围、方法范围和实例范围

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

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

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

最后,通过在A=新A的每个其他实例中创建A的实例;你的代码永远不会运行,你会得到一个StackOverflowException

编辑以回答问题:

好的,当你这样做的时候:

class A
{
A a= new A();
int i = 10;
public static void main(String[] args)
{
a.i=20;
}
}
public class Person {
    String name = null;
}
你是说,对于我们通过new创建的每个人,他们都有一个名字,而且只是他们的名字。他们不会和任何人分享

所以当你这样做的时候:

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

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

实例几乎与静态相反。关于您的问题的背景信息:为什么必须在静态方法中创建实例?感谢您的回复。但在第二个示例中,我无法理解如何创建两个实例?@托德