盘点2021年自己所忽视的Java基础 | 掘金年度征文

1,657 阅读4分钟
「时光不负,创作不停,本文正在参加2021年终总结征文大赛

想想今年阅读的 Java 书籍,也就那本《 Java 核心技术卷》,很多人说《卷 Ⅰ 》的内容太过基础,没有什么营养可言,但在真正阅读后才发现,这本基础的工具书仍能替自己扫盲。

在平时的阅读中,一旦有眼前一亮的感觉,我总会把书中的内容打磨一番,发一发沸点,想想 2021年 也临近年底了,今天就来做个总结。


  1. 方法签名的组成部分有且仅有方法名参数列表

因此构成方法重载的条件是方法名相同,参数列表不同,与返回值、抛出的异常类型无关。

  1. 方法的显示参数(又称实参)传递的是副本。 如果传递的是基本数据类型,则副本的数值变化不会影响到原数据; 如果传递的是引用数据类型,副本和原数据共享引用地址,被引用的对象属性的变化会同步给副本和原数据。

  2. 数组(Array)与数组列表(ArrayList)的区别。 new E[100]会创建一个有 100 个元素 E 对应初始值的数组,初始值如 null、0、false; new ArrayList<E>(100)只是表示可能将会保存 100 个元素 E ,在前 100 次使用add(E e)添加元素时不需要扩容,创建时并不会赋值任何初始值。

  3. 枚举类中的所有枚举项即是这个枚举类的实例

同一种枚举项即使创建多个对象,这些对象的引用地址也相同,即引用自同一个实例。

  1. 基本数据类型不属于对象,也不算做泛型,但基本数据类型的数组是一种特殊的对象或泛型,派生于 Object。

例如int[] a = {1, 2, 3};,可以将 a 赋值给 Object,但不可将 a 赋值给 Object[] 。

  1. Arrays 的copyOf(T[] original, int newLength)方法和集合中toArray()方法都是基于反射包下 Array 类的newInstance(Class<?> componentType, int length)方法实现,而newInstance()方法需要的 componentType 参数则通过 java.lang 包下 Class 类的getComponentType()方法获取的,此方法仅仅为获取数组元素的泛型而存在,其实这个方法更适合放在 Array 类中。

  2. 一个类要想实现克隆操作,必须满足两个条件:①. 实现 Cloneable 接口,将其标记为克隆合法的类 ②. 重写 Object 类中的clone()方法,使用super.clone()调用原生的克隆方法,并将其修饰符改为 public ,否则重写的clone()方法只能在类本身和其子类中调用。

  3. 生成日志和调试消息时,通常要通过getClass()方法来获取当前的类信息,但因为此方法前隐藏了一个 this 关键字,所以在静态方法中无法使用。此时可以利用以下表达式获取当前类信息:

    new Object() {}.getClass().getEnclosingClass();

这里的new Object() {}会建立 Object 的匿名子类的一个匿名对象,getEnclosingClass()则能得到其外围类,即包含这个静态方法的类。

  1. 在使用 finally 子句时不要写上如 return、thow、break、continue 这种能改变控制流程的语句

例如 finally 子句中的 return 语句会覆盖掉 try 子句中的 return 语句,甚至不在 catch 捕获范围中的异常也会被吞,不会正常向上抛出。 如果 finally 子句用作资源释放,且资源直接或间接实现了 AutoCloseable 接口,则建议使用 try-with-resources 语句替换 finally 去释放资源。

  1. 防止变量垃圾回收器回收的方法使用静态变量存储引用。

JVM加载类的过程中会为静态变量在方法区分配内存,这个变量与类的生命周期一致。而垃圾回收一般是指堆内存的回收,没有引用的话在垃圾回收器空闲了就会进行回收。


以上就是我在阅读时觉得自己忽视的 10 条 Java 基础,如果对您也有帮助,麻烦留下个暖心的赞🐸。

微信图片_20211213160152.jpg