为什么我们可以在静态方法中创建一个 class 的实例?
Why can we create an instance of a class inside a static method?
我从来没有真正理解为什么下面给出的代码是有效的,如果有人帮助我,我将不胜感激。
public class A{
int x;
int y;
void hello() {
System.out.println("Hello World");
}
public static void main(String[] args) {
A my_instance = new A();
my_instance.hello();
}
}
输出:
Hello World
问题:为什么允许我们在 A 的一个静态方法中创建一个实例?
我知道静态方法属于 class 而不是任何特定实例,但这是否意味着在后台编译器首先分析所有非静态的内容并使该代码可用于静态方法?
之所以有效,是因为您可以在任何上下文中创建对象。它之所以有效,是因为如果它不起作用,您将永远无法创建对象。静态成员在 class 初始化时可用,而不是 "available to non-static code first",但在 class 初始化完成后可用于任何东西,无论是否静态。 main
甚至 运行 直到 class 初始化之后。那时 class 的所有功能都可用于静态和非静态代码,包括创建对象的功能。它之所以有效,是因为 JLS 说这就是它的工作原理。
看看这些要点是否对你有帮助。
1. Java 程序的执行以特殊方法 public static void main(String[] args)
开始。由于Java是一门面向对象的语言,所以一切都必须在class里面,这个特殊的方法main()
也不例外。这就是为什么它在 class 内,即这里的 A
。
2.
It just seems wrong to me that I can create an instance of something that I'm still in the process of building
你这个想法是错误的。当程序是 运行 时,一切都已经 built 了(当然你知道编译在 运行 之前),所以当程序已经启动并且 运行 时,概念 in the process of building 没有任何意义。如果您将 in the process of building 的语句与 A
实例的构建相关联,那么这又是错误的,因为 main()
方法是静态的,因此不需要 A
的实例就可以调用它。事实上,main()
在 JVM 实例化应用程序中的任何其他 class 之前被调用。
3.
main(String[] args)
是执行的起点,必须允许它实例化一些 class。现在,你的 class A
是 一个 class 就像其他任何东西一样,因此 main()
也可以实例化它。
在这里阅读更多内容:
- Why is the Java main method static?
- Why make a class create an instance of itself?
JVM 负责静态成员的执行,在这种情况下,JVM 以这种方式设计静态方法。因为,我们需要从静态成员创建对象
这似乎与程序员相反,因为如果您将代码作为过程脚本来阅读,那么 class 的实例似乎“愿意”自身存在。但这不是您正在查看的一行又一行的程序。这是正在编译的代码,然后运行.
也是的,在现实世界中,杯子不会变成杯子,云也不会通过“将自己”存在的内部调用变成云,至少就我们所知是这样。但这是编程,你可以创造这些情况。有点像看蛇咬尾巴的地方,对吧?你会习惯的。
有时答案是技术性的,有时在编程中您需要尊重抽象过程。离莫奈的画太近了,看起来像一堆点。
我从来没有真正理解为什么下面给出的代码是有效的,如果有人帮助我,我将不胜感激。
public class A{
int x;
int y;
void hello() {
System.out.println("Hello World");
}
public static void main(String[] args) {
A my_instance = new A();
my_instance.hello();
}
}
输出:
Hello World
问题:为什么允许我们在 A 的一个静态方法中创建一个实例?
我知道静态方法属于 class 而不是任何特定实例,但这是否意味着在后台编译器首先分析所有非静态的内容并使该代码可用于静态方法?
之所以有效,是因为您可以在任何上下文中创建对象。它之所以有效,是因为如果它不起作用,您将永远无法创建对象。静态成员在 class 初始化时可用,而不是 "available to non-static code first",但在 class 初始化完成后可用于任何东西,无论是否静态。 main
甚至 运行 直到 class 初始化之后。那时 class 的所有功能都可用于静态和非静态代码,包括创建对象的功能。它之所以有效,是因为 JLS 说这就是它的工作原理。
看看这些要点是否对你有帮助。
1. Java 程序的执行以特殊方法 public static void main(String[] args)
开始。由于Java是一门面向对象的语言,所以一切都必须在class里面,这个特殊的方法main()
也不例外。这就是为什么它在 class 内,即这里的 A
。
2.
It just seems wrong to me that I can create an instance of something that I'm still in the process of building
你这个想法是错误的。当程序是 运行 时,一切都已经 built 了(当然你知道编译在 运行 之前),所以当程序已经启动并且 运行 时,概念 in the process of building 没有任何意义。如果您将 in the process of building 的语句与 A
实例的构建相关联,那么这又是错误的,因为 main()
方法是静态的,因此不需要 A
的实例就可以调用它。事实上,main()
在 JVM 实例化应用程序中的任何其他 class 之前被调用。
3.
main(String[] args)
是执行的起点,必须允许它实例化一些 class。现在,你的 class A
是 一个 class 就像其他任何东西一样,因此 main()
也可以实例化它。
在这里阅读更多内容:
- Why is the Java main method static?
- Why make a class create an instance of itself?
JVM 负责静态成员的执行,在这种情况下,JVM 以这种方式设计静态方法。因为,我们需要从静态成员创建对象
这似乎与程序员相反,因为如果您将代码作为过程脚本来阅读,那么 class 的实例似乎“愿意”自身存在。但这不是您正在查看的一行又一行的程序。这是正在编译的代码,然后运行.
也是的,在现实世界中,杯子不会变成杯子,云也不会通过“将自己”存在的内部调用变成云,至少就我们所知是这样。但这是编程,你可以创造这些情况。有点像看蛇咬尾巴的地方,对吧?你会习惯的。
有时答案是技术性的,有时在编程中您需要尊重抽象过程。离莫奈的画太近了,看起来像一堆点。