示例:
System.out.println(new Date());
现在显然这是一个较大程序的一部分,但是您可以看到它的作用。现在,我运行一次编译器,然后运行程序。然后,无需再次编译该程序,而是运行它并更新日期。这看起来很愚蠢,但是如何在不更新字节码的情况下更新日期?
根据我的理解,通过阅读本文,Java编译器获取了源代码并将其编译为字节码,该字节码保存在类文件中。 JIT将此代码转换为机器代码,然后运行。但是,Date对象的状态不会保持不变吗?显然不是。我只是对它的变化感到困惑。
答案 0 :(得分:2)
使用no-arg构造函数初始化的jooqContext
.select()
.from(MY_TABLE)
.fetch()
对象将访问Date
并使用计算机上的当前时间戳。换句话说,时间戳不是“编译进去的”,而是包含了访问机器时钟并在每次运行程序时从那里获取时间戳的代码。
答案 1 :(得分:2)
Answer by Mureinik是正确的。您的代码中定义的对象是在run-time而非compile-time处构造的。
Compilation就像让工程师审查建筑师的建筑计划,然后写出更详细的规格。尚无建筑物。现在,我们已经完全准备建造了,但实际上直到建造人员到达现场时才真正建造任何东西。
在这个比喻中,您的source code是建筑师的图纸。工程师更详细的规范是Java编译器发出的bytecode。运行您应用的字节码的JVM是施工人员要在现场工作。
另一种思考方式:
此外,您永远不要使用Date
类。该类和Java最早版本中的其他旧式日期时间类都很糟糕,设计选择不胜枚举。多年前,现代的 java.time 类取代了它们。
java.time 类使用factory methods进行实例化,而不是使用constructors和new
。
Instant.now() // Capture current moment in UTC.
OffsetDateTime.now( ZoneOffset.UTC ) // Capture current moment in UTC.
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ) // Capture current moment as seen though the wall-clock time used by the people of a particular region (a time zone).
LocalDate.of( 2018 , Month.JANUARY , 23 ) // A date-only value, without time-of-day and without time zone.