「持续100 天更新 Java 相关面试题」—— 第 7 天

前言

阳了一个周没更新,今天是更新第 7 天,今天的主要内容是 Java 基础

正文

1. Java 中 final、finally、finalize 的区别与用法

  1. final

    • 被 final 修饰的类无法被继承
    • 对于一个 final 变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
      如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。但是它指向的对象的内容是可变的
    • 被final修饰的方法将无法被重写,但允许重载
      注意:类的 private 方法会隐式地被指定为final方法。
  2. finally

    • 在异常处理时,不管有没有异常被抛出或者捕获,finally 块都会执行,通常用于释放资源。
    • finally 块正常情况下一定会被执行。但是有至少两个极端情况:
      如果对应的 try 块没有执行,则这个try块的finally块并不会被执行
      如果在 try 块中 jvm 关机,例如system.exit(n),则 finally 块也不会执行
    • finally 块中如果有 return 语句,则会覆盖 try 或者 catch 中的 return 语句,导致二者无法 return,所以强烈建议 finally 块中不要存在 return 关键字
  3. finalize

    • finalize() 是 Object 类的 protected 方法,子类可以覆盖该方法以实现资源清理工作。
    • GC在回收对象之前都会调用该方法

2. 序列化

Java 平台允许我们在内存中创建可复用的 Java 对象,但一般情况下,只有当 JVM 处于运行时,这些对象才可能存在,即:这些对象的生命周期不会比 JVM 的生命周期更长。但在现实应用中,可能要求在 JVM 停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java 对象序列化就能够帮助我们实现该功能。

使用 Java 对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。对象序列化保存的是对象的”状态”,即它的成员变量,静态变量不保存。

除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java 序列化 API 为处理对象序列化提供了一个标准机制。

  • 在 Java 中,只要一个类实现了java.io.Serializable 接口,那么它就可以被序列化。
  • 通过ObjectOutputStreamObjectInputStream 对对象进行序列化及反序列化。
  • 在类中增加writeObject readObject方法可以实现自定义序列化。
  • 要想将父类对象也序列化,就需要让父类也实现 Serializable 接口。
  • 在变量声明前加上Transient 关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

3. 泛型

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用 Java 泛型。

泛型方法

泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

public static <E> void printArray(E[] array) {
    
	for (E element: array) {
    	System.out.printf("%s", element);
    }
}
  1. <? extends T>表示该通配符所代表的类型是 T 类型及 T 类型的`子类`。
  2. <? super T>表示该通配符所代表的类型是 T 类型及 T 类型的`父类`。

泛型类

在类名后面添加了类型参数声明部分

public class Box<T> {
    private T t;
    
    public void set(T t) {
    	this.t = t;
    }
    
	public T get() {
		return t;
    }
}

类型通配符

类型通配符一般是使用? 代替具体的类型参数。

例如 List<?> 在逻辑上是List,List 等所有List<具体类型实参>的父类。

类型擦除

Java 中的泛型基本上都是在编译器这个层次来实现的。在生成的Java 字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。

如在代码中定义的List和List等类型,在编译之后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。

类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。这个具体类一般是Object。把代码中的类型参数都替换成具体的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值