「时光不负,创作不停,本文正在参加2021年终总结征文大赛」 |
---|
想想今年阅读的 Java 书籍,也就那本《 Java 核心技术卷》,很多人说《卷 Ⅰ 》的内容太过基础,没有什么营养可言,但在真正阅读后才发现,这本基础的工具书仍能替自己扫盲。
在平时的阅读中,一旦有眼前一亮的感觉,我总会把书中的内容打磨一番,发一发沸点,想想 2021年 也临近年底了,今天就来做个总结。
- 方法签名的组成部分有且仅有方法名和参数列表。
因此构成方法重载的条件是方法名相同,参数列表不同,与返回值、抛出的异常类型无关。
-
方法的显示参数(又称实参)传递的是副本。 如果传递的是基本数据类型,则副本的数值变化不会影响到原数据; 如果传递的是引用数据类型,副本和原数据共享引用地址,被引用的对象属性的变化会同步给副本和原数据。
-
数组(Array)与数组列表(ArrayList)的区别。
new E[100]
会创建一个有 100 个元素 E 对应初始值的数组,初始值如 null、0、false;new ArrayList<E>(100)
只是表示可能将会保存 100 个元素 E ,在前 100 次使用add(E e)
添加元素时不需要扩容,创建时并不会赋值任何初始值。 -
枚举类中的所有枚举项即是这个枚举类的实例。
同一种枚举项即使创建多个对象,这些对象的引用地址也相同,即引用自同一个实例。
- 基本数据类型不属于对象,也不算做泛型,但基本数据类型的数组是一种特殊的对象或泛型,派生于 Object。
例如
int[] a = {1, 2, 3};
,可以将 a 赋值给 Object,但不可将 a 赋值给 Object[] 。
-
Arrays 的
copyOf(T[] original, int newLength)
方法和集合中toArray()
方法都是基于反射包下 Array 类的newInstance(Class<?> componentType, int length)
方法实现,而newInstance()
方法需要的 componentType 参数则通过 java.lang 包下 Class 类的getComponentType()
方法获取的,此方法仅仅为获取数组元素的泛型而存在,其实这个方法更适合放在 Array 类中。 -
一个类要想实现克隆操作,必须满足两个条件:①. 实现 Cloneable 接口,将其标记为克隆合法的类 ②. 重写 Object 类中的
clone()
方法,使用super.clone()
调用原生的克隆方法,并将其修饰符改为 public ,否则重写的clone()
方法只能在类本身和其子类中调用。 -
生成日志和调试消息时,通常要通过
getClass()
方法来获取当前的类信息,但因为此方法前隐藏了一个 this 关键字,所以在静态方法中无法使用。此时可以利用以下表达式获取当前类信息:
new Object() {}.getClass().getEnclosingClass();
这里的new Object() {}
会建立 Object 的匿名子类的一个匿名对象,getEnclosingClass()
则能得到其外围类,即包含这个静态方法的类。
- 在使用 finally 子句时不要写上如 return、thow、break、continue 这种能改变控制流程的语句。
例如 finally 子句中的 return 语句会覆盖掉 try 子句中的 return 语句,甚至不在 catch 捕获范围中的异常也会被吞,不会正常向上抛出。 如果 finally 子句用作资源释放,且资源直接或间接实现了 AutoCloseable 接口,则建议使用 try-with-resources 语句替换 finally 去释放资源。
- 防止变量被垃圾回收器回收的方法是使用静态变量存储引用。
JVM加载类的过程中会为静态变量在方法区分配内存,这个变量与类的生命周期一致。而垃圾回收一般是指堆内存的回收,没有引用的话在垃圾回收器空闲了就会进行回收。
以上就是我在阅读时觉得自己忽视的 10 条 Java 基础,如果对您也有帮助,麻烦留下个暖心的赞🐸。