Java小白踩坑录 - 类执行顺序

简介: Java小白踩坑录 - 类执行顺序

image.png


小白要实现一个记录奶酪生产期限的程序,昨天自测完后,提交给测试 MM 进行测试,测试 MM 测试完后说没有问题后小白才下班。今天早上测试 MM 走自动回归测试时,发现了 bug。

import java.util.Date;
public class Cheese {
  public static final Cheese cheese=new Cheese();
  private final long produceTimes;
  private static final long produceDate =new Date(119,8,1).getTime();
  private Cheese() {
    produceTimes=new Date().getTime()-produceDate;
  }
  public long produceTimes() {
    return produceTimes;
  }
  public static void main(String[] args) {
    System.out.println("current time in day(from 1900:00:00) : "+new Date().getTime()/(1000*60*60*24L));
    System.out.println("cheese had produces : "+ cheese.produceTimes()/(1000*60*60*24L) +" days");
  }
}
   

小白把测试环境的代码拉下来,进行调试,发现运行结果果然不对:

current time in day(from 1900:00:00) : 18153
cheese had produces : 18153 days

难道昨天和测试 MM 都眼花了?不可能呀!肯定是代码的问题。拉出看历史提交记录,发现仅有小胖对程序做了改动,将两行代码的顺序做了调换。调换前的程序如下:

import java.util.Date;
public class Cheese {
  private final long produceTimes;
  private static final long produceDate =new Date(119,8,1).getTime();//这里
  public static final Cheese cheese=new Cheese();//这里
  private Cheese() {
    produceTimes=new Date().getTime()-produceDate;
  }
  public long produceTimes() {
    return produceTimes;
  }
  public static void main(String[] args) {
    System.out.println("current time in day(from 1900:00:00) : "+new Date().getTime()/(1000*60*60*24L));
    System.out.println("cheese had produces : "+ cheese.produceTimes()/(1000*60*60*24L) +" days");
  }
} 

运行结果:

current time in day(from 1900:00:00) : 18153
cheese had produces : 13 days

这才是小白想要的结果,也是测试 MM 期望看到的结果。


追根究底

原来,实例的初始化也是有讲究的。


static 字段先设置默认值,其中 cheese 被设置为 null,produceDate 被设置为 0;


然后 static 初始器执行,按照声明出现的顺序执行:

如果先执行 cheese 的话,调用 Cheese () 构造方法,此时用 produceDate=0 为值;

如果先执行 produceDate 的话,producteDate 被设置为 2019-09-01,再调用 cheese () 构造方法。


最后从构造器返回 cheese 类的初始化。

另外,还学习了新的一招


Date 设置日期为 2019-09-01 为何设置为:


new Date(119,8,1)


进去源码看一眼:


 /**
 * Allocates a <code>Date</code> object and initializes it so that
 * it represents midnight, local time, at the beginning of the day
 * specified by the <code>year</code>, <code>month</code>, and
 * <code>date</code> arguments.
 *
 * @param year the year minus 1900.
 * @param month the month between 0-11.
 * @param date the day of the month between 1-31.
 * @see java.util.Calendar
 * @deprecated As of JDK version 1.1,
 * replaced by <code>Calendar.set(year + 1900, month, date)</code>
 * or <code>GregorianCalendar(year + 1900, month, date)</code>.
 */
 @Deprecated
 public Date(int year, int month, int date) {
     this(year, month, date, 0, 0, 0);
 }

其中,year 份是从 1900 年开始的年数,即 2019-1900=119;

month 是 0~11 计数的,需要实际月份减 1,即 9-1=8;

date 是 1~31 计数的,实际天就可以 即 1。

目录
相关文章
|
2月前
|
Java 编译器 API
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
265 83
|
3月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
176 35
|
4月前
|
存储 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(7):不可变类设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中Java不可变类设计指南,废话不多说让我们直接开始。
72 0
|
20天前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
114 0
|
2月前
|
Java API
Java API中Math类功能全景扫描
在实际使用时,这些方法的精确度和性能得到了良好的优化。当处理复杂数学运算或高精度计算时,`Math`类通常是足够的。然而,对于非常精细或特殊的数学运算,可能需要考虑使用 `java.math`包中的 `BigDecimal`类或其他专业的数学库。
84 11
|
2月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
58 0
|
2月前
|
安全 Java
JAVA:Collections类的shuffle()方法
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的工具方法,适用于洗牌、抽奖等场景。该方法直接修改原列表,支持自定义随机数生成器以实现可重现的打乱顺序。使用时需注意其原地修改特性及非线程安全性。
87 0
|
2月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
|
2月前
|
SQL Java 数据库连接
Java 期末考试救急必备涵盖绝大多数核心考点及五大类经典代码助你过关
本文为Java期末考试复习指南,涵盖基础语法、面向对象编程、异常处理、文件操作、数据库连接五大核心考点,提供详细解析与实用代码示例,助力快速掌握重点,高效备考,轻松应对考试。
68 0

热门文章

最新文章