2 回答
TA贡献1804条经验 获得超7个赞
编译时与运行时
Mureinik的回答是正确的。代码中定义的对象是在运行时构造的,而不是在编译时构造的。
编译就像让工程师审查建筑师的建筑计划,然后写出更详细的规格。还没有建造任何建筑物。我们现在已经完全准备好建造,但直到施工人员到达现场的“运行时间”才真正建造任何东西。
在这个比喻中,您的源代码是建筑师的图纸。工程师更详细的规范是 Java编译器发出的字节码。运行应用程序字节码的JVM是在现场工作的施工人员。
另一种思考方式:
类是在编译时确定的。
对象(实例)在运行时确定。
java.time
此外,您永远不应该使用Date
该类。该类和 Java 最早版本中的其他遗留日期时间类非常糟糕,充斥着糟糕的设计选择。它们在几年前被现代java.time类所取代。
该java.time类使用工厂方法实例化,而不是建设者和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.
TA贡献1802条经验 获得超4个赞
Date
使用无参数构造函数初始化的对象将访问System.currTimeMilis()
并使用机器中的当前时间戳。换句话说,时间戳不是“编译到其中”,而是包含访问机器时钟并在每次程序运行时从那里获取时间戳的代码。
添加回答
举报