Java面试核心知识点——第二章Java基础

2.1 集合

在这里插入图片描述

2.2 异常分类及处理

2.2.1 异常分类

在这里插入图片描述

2.2.2 异常处理

throws 作用于方法上
thorw 作用于方法内

2.3反射机制

2.3.1动态语言的概念

概念:程序在运行时候可以改变结构的语言,如新的属性或方法的添加、删除等结构上的变化
从反射的角度上说Java属于半动态语言

2.3.2 反射概念

反射机制是指在程序运行过程中,对任意一个类都能动态获取其所有属性和方法,并对任何一个对象都能调用其任意方法

这种动态获取类和对象的信息,以及动态调用对象的方法的功能被称为Java语言的反射机制

2.3.3 反射的应用

Java中对象有两种类型:1编译时类型、2运行时类型
编译时类型可在声明对象时使用,
运行时类型为对象赋值时所采用的类型

通过反射可以获取在编译时无法得到的运行时类型。

2.3.4 Java的反射API

位于java.lang.reflect包下
常用的API有:
1)Class类
2)Constructor类
3)Field类
4)Method类

2.3.5 反射的步骤

1)获取想要的类的Class对象
2)调用Class对象所定义的方法
3) 使用其他三个反射的Api获取或调用更多信息和方法

2.3.6 创建对象的方式

我们以要创建类Target的对象 target为例

1)直接Target target = new Target(args[]);

2)反射class.newInstance(); 这种是无参构造

3)反射先获取其构造器,指定构造器constructor.newInstance();

2.3.7 Method的invoke方法

如何使用invoke动态调用目标类的方法?

1)获取目标类的Method对象method

2)调用method.invoke(obj,args);

2.4 注解

2.4.1注解的概念

注解(Annotation):是Java提供的设置程序中元素的关联信息和元数据(MetaData)的方法,它是一个接口,程序可以通过反射获取指定程序元素中的注解对象,然后通过该注解对象获取注解中的元数据信息

2.4.2 标准元注解

@Target

说明了注解所修饰的对象范围

@Retention

定义该注解在说明级别有效
SOURCE:在源文件有效
CLASS:在Class文件有效
RUNTIME:在运行时有效

@Documented

表明这个注解应该被javadoc工具记录,因此可以被javadoc类的工具文档化

@Inherited

标记注解,表明某个被标注的类型是可以被继承的

2.4.3 注解处理器

注解用于描述元数据的信息,使用的重点在于对注解处理器的定义

2.5内部类

2.5.1 静态内部类

位置:类内
修饰符:(1)public static class! (2)protected static class(3)static class (4)protected static class
访问方式:外部类.静态内部类
和正常类差不多

2.5.2 成员内部类

位置:类内
修饰符:(1)public class! (2)protected class(3)class (4)protected class
访问方式:必须先把主类new出来再,通过 对象.new 操作符得到成员内部类
无法定义静态
在这里插入图片描述

2.5.3 局部内部类

位置:方法内
修饰符:class
访问方式:外部无法访问,只有在方法中才能访问
无法定义静态

2.5.4 匿名内部类

位置:表达式参数
修饰符:new 父类/抽象类/接口(){
字段
定义要实现的方法
}
访问方式:直接作为返回值或者直接
无法定义静态
在这里插入图片描述

2.6 泛型

2.6.1 泛型标记和泛型限定

E-Element 在集合中使用,表示集合中存放的类型
T-Type Java类,基本类和自定义的类
K-Key 键
V-Value 值
N-Number 数值类型
? 不确定的Java类型

如果希望将类的继承关系加入泛型应用中,就需要对泛型做限定

在这里插入图片描述
对于读写:
1)读是接收范围大大取大
2)写是接受范围小小取小
如果取到?,则无法写入,因为无法明确写入的到底是什么类型,就无法写入。

1.对泛型上限的限定:<? extends T>

大大取大:T
小小取小:?不明确无法写入

接收:T的子类
读:T~Object
写:不可写入

2.对泛型下限的限定: <? super T>

大大取大:Object
小小取小:T

接收:T的父类
读:可读Object
写:可写入T的子类

2.6.5 类型擦除

类型参数会在编译时被擦除,这就是类型擦除
字节码文件中不会有泛型的类型信息
如果指定上界,那么就是该上界T存在字节码中
如果没有指定就是,Object存在字节码中

2.7 序列化

为什么要序列化,对象随着虚拟机的生命周期结束而结束,如果要保存进行持久化怎么办?
我们可以使用Java序列化技术保存对象及其状态信息,对象和状态信息会被保存在一组字节数组中
在需要的时候将这些字节数组反序列化为对象
序列化保存的是对象的状态,所以静态变量不会被序列化

对象序列化除了用于持久化对象,在RPC(远程过程调用)或者网络传输中也经常被使用

2.7.1 Java序列化API的使用

如何序列化?
1)实现 java.io.Serializable接口
2)序列化和反序列化必须保持序列化的ID一致,一般使用private static final long serialVersionUID 定义序列化ID
3)序列化并不保存静态变量
4)在需要序列化父类变量时,父类也需要实现Serializable接口
5)使用Transient关键字可以阻止该变量被序列化,在被反序列化后,transient变量的值被设置为对应的初始值(default)

2.7.2 JKD原生的序列化和反序列化

ObjectOutputStream和ObjectInputStream

//序列化到磁盘
FileOutputStream fos = new FileOutputStream("save.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Target srcTarget = new Target();
//设置对象状态
target.setState1("state1");
target.setState2("state2");
oos.writeObject(target);
oos.flush();
oos.close();

//反序列化磁盘数据并解析
FileInputStream fis = new FileInputStream("save.txt);
ObjectInputStream ois = new ObjectInputStream(fis);
Target destTarget = (Target)ois.readObject();

如果state2属性被添加了Transient关键字,则在反序列后不会还原其值,是初始值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值