我一直不明白为什么下面给出的代码是有效的,如果有人帮助我,我将不胜感激。
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 的实例?
我知道静态方法属于类而不是任何特定实例,但这是否意味着编译器首先分析所有非静态内容并使该代码可用于静态方法?
看看这些要点是否对你有帮助。
1. Java 程序的执行从特殊方法开始public static void main(String[] args)
.由于Java是一种面向对象的语言,因此所有内容都必须在类内部,这种特殊的方法main()
也不例外。这就是为什么它在一个类中,即A
这里。
阿拉伯数字。
对我来说,我可以创建一个我仍在构建过程中的东西的实例似乎是错误的
你的这个想法是错误的。当程序运行时,一切都已经构建好了(你肯定知道编译是在运行之前完成的),所以当程序已经启动并运行时,构建过程中的概念没有任何意义。如果你在构建过程中将你的语句与A
实例的构建相关联,那么这将是错误的,因为main()
方法是静态的,所以不需要存在A
实例就可以调用它。事实上,main()
是在 JVM 实例化应用程序中的任何其他类之前
调用的。3.main(String[] args)
作为执行的起点,必须允许它实例化某个类。现在,您的类A
就像其他类一样,因此main()
也可以实例化它。
更多阅读在这里:
- 为什么 Java 主方法是静态的?
- 为什么要让类创建自身的实例?
它之所以有效,是因为您可以在任何上下文中创建对象。它之所以有效,是因为如果它不起作用,您将永远无法创建对象。静态成员在类初始化时可用,不是"首先可用于非静态代码",而是在类初始化完成后对任何内容(静态或非静态)可用。main
直到类初始化后才会运行。此时,该类的所有功能都可用于静态和非静态代码,其中包括创建对象的能力。它之所以有效,是因为JLS说这就是它的工作原理。
JVM负责静态成员的执行,在这种情况下,静态方法就是JVM设计的。因为,我们需要从静态成员创建一个对象
这似乎与程序员相反,因为如果您将代码作为过程脚本阅读,则类的实例似乎"愿意"存在。但这不是您正在查看的逐行过程。这是正在编译然后运行的代码。
也是的,在现实世界中,杯子不会变成杯子,云也不会因为内部调用而变成云,"将自己"存在,至少据我们所知不是。但这是编程,你可以创造这些情况。有点像看蛇咬尾巴的地方,对吧?你会习惯的。
有时答案是技术性的,有时在编程中你需要尊重抽象过程。站得离莫奈太近,它看起来像一堆点。