我从来没有真正理解为什么下面给出的代码是有效的,如果有人帮助我,我会非常感激。
Hello World
输出:
let tables: Array<string> = [
"OneTable", "AnotherTable", "DataStoredHere", "Video"
]
tables.forEach((table) => {
console.log(`Copying ${table} table`);
sourceDB.each(`select * from ${table}`, (error, row) => {
console.log(row);
destDB.run(`insert into ${table} values (?)`, ...row) // this is the problem
})
})
问题:为什么我们允许在其自己的一个静态方法中创建A的实例?
我理解静态方法属于类,而不属于任何特定实例,但是这是否意味着编译器首先会分析非静态的所有内容并使该代码可用于静态方法?
答案 0 :(得分:1)
看看这些要点对你有帮助吗。
1。 Java程序的执行以特殊方法public static void main(String[] args)
开始。由于Java是一种面向对象的语言,所以一切都必须在类中,这种特殊的方法main()
也不例外。这就是为什么它在一个类中,即A
。
<强> 2 强>
我似乎错误地认为我可以创建一个我仍在构建过程中的实例
你的这个想法是错误的。当程序正在运行时,所有内容都已已构建(当然您知道编译在运行之前),因此构建过程中的概念当程序已经启动并运行时没有任何意义。如果您在构建的过程中将语句与A
的实例构建关联起来,那么这又是错误的,因为main()
方法是静态的,所以不会不需要存在A
的实例,以便调用它。实际上,在JVM实例化应用程序中的任何其他类之前,都会调用main()
。
第3 强>
main(String[] args)
是执行的起点,必须允许它实例化某个类。现在,您的班级A
就像其他任何类一样一个类,因此main()
也可以实例化它。
在这里阅读更多内容:
答案 1 :(得分:0)
它的工作原理是因为您可以在任何上下文中创建对象。它的工作原理是因为如果它不起作用你永远不会创建一个对象。在类初始化完成后,静态成员在类初始化时可用,而不是“首先可用于非静态代码”,而是静态或不静态。在课程初始化之后,main
甚至都没有运行。此时,类的所有功能都可用于静态和非静态代码,包括创建对象的能力。它的工作原理是因为JLS说它是如何工作的。
答案 2 :(得分:0)
JVM负责静态成员的执行,在这种情况下,静态方法以JVM设计的方式执行。因为,我们需要从静态成员创建对象
答案 3 :(得分:0)
这似乎与程序员相反,因为如果您将代码作为过程脚本阅读,则该类的实例似乎“愿意”自己存在。但这不是您正在查看的一行接一行的程序。这是正在编译然后运行的代码。
同样是的,在现实的世界杯中,杯子不会变成杯子,云也不会通过“将自己”存在的内部调用变成云,至少在我们所知的范围内不是这样。但这是编程,您可以创建此类情况。有点像看蛇咬尾巴的地方,对吧?你会习惯的。
有时答案是技术性的,有时在编程中您需要尊重抽象过程。站在离莫奈太近的地方,它看起来就像一堆点。