1、Java异常分类及处理
异常处理是为了解决在程序处理时发生错误而无法退出的问题。
(1)异常分类
Object —— Throwable(所有错误或异常的超类)
(2)异常的处理方式
自然抛出异常有三种形式:throw、throws、系统自动抛出异常
捕获异常并处理是以 try…catch… 作为捕获异常并处理代码的结构
(3)throw 与 throws 的区别
2、Java 反射
(1)动态语言: 是指程序运行时可以改变其结构,即新的函数可以引进,已有的函数可以被删除等结构上的变化。
(2)反射机制的概念: Java中的反射机制是在运行状态中,对于任意一个类都能获取这个类所有的属性和方法,并且对于任意一个对象,都能调用它的任意一个方法。
(3)反射的应用场合: 编译时类型和运行时类型
Person person = new Student();
,声明的是Person类型,但运行时是Student类型当程序运行时可能会接收外部传入的对象,该对象在编译时类型为Object,但程序调用需要知道该对象的运行时类型,所以可以利用反射来获取该对象的类型以及类信息。
(4)反射API
反射 API 用来生成JVM中的类、接口或对象的信息。
(5)反射的步骤
(6)获取Class对象的方法
(7)创建Class对象的方法
3、Java注解
(1)概念: Annotation 是 Java 提供的一种对元程序中关联信息和元数据(metadata)的途径和方法;它是一种接口,程序可以通过反射来获取指定程序中的Annotation对象,通过Annotation对象来获取元数据信息。
(2)元注解: 元注解的作用是负责注解说明其它注解,JDK 5 定义了 4 个标准的 meta-annotation 类型。
(3)注解处理器
注解处理器是用于注解读取与使用注解的核心程序。
实现注解处理器:
//1、创建注解处理器
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
public int id() default -1;
public String name() default "";
public String address default "";
}
//2、使用注解处理器
public class Apple{
@FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路")
private String appleProvider;
public void setAppleProvider(String appleProvider){
this.appleProvider = appleProvider;
}
public String getAppleProviderO (
return appleProvider;
}
}
//3、注解处理器
public class FruitInfoUtil {
public static void getFruitInfo(Class<?> clazz) {
String strFruitProvicer = "供应商信息:";
Field[] fields = clazz.getDeclaredFields(); //获取成员变量
for (Field field : fields){
FruitProvider fruitProvider = (FruitProvider) field.getAnnotation(FruitProvider.class);
strFruitProvicer = "供应商编号:" + fruitProvider.id() + "供应商名称:" + fruitProvider.name() + "供应商地址:" + fruitProvider.address();
System.out.println(strFruitProvicer);
}
}
}
4、Java内部类
Java类中不仅可以定义变量和方法,还可以定义类,定义在类内部的类称为内部类,根据定义方式不同,内部类分为静态内部类、成员内部类、局部内部类、匿名内部类四种。
外部类名.内部类名
获得编译时类型。例如,HashMap类内部就有一个静态内部类Entry。5、泛型
泛型是用来声明无法确定的对象类型,编译器会通过传入的值来确定对象类型。
(1)泛型方法
public static <E> void printArray(E[] inputArray){
for(E element : inputArray) {
System.out.printf("%s", element);
}
}
extends T>
: 表示该通配符代表T的所有子类 super T>
:表示该通配符代表T的所有父类(2)泛型类
public class Box<T>{
private T t;
public void add(T t){
this.t = t;
}
public T get(){
return t;
}
}
(3)类型通配符 >
类型通配符通常使用 ?来代替具体的类型参数,例如List> 在逻辑上是所有List具有泛型约束的父类
(4)类型擦除
Java中的泛型基本上是在编译器层面的实现,在生成的字节码中是不存在泛型的,在编译时,自动将传入的数据类型覆盖到泛型使用的位置上,这样的过程叫类型擦除。
6、序列化
(1)序列化的作用: 序列化操作可以持久化对象及其状态到内存或者磁盘中
(2)序列化的存储: 序列化是将传入对象转为字节数组进行存储,但是序列化只关注其成员变量,而不关注静态资源
(3)序列化的使用场景: 持久化对象;网络传递对象等等…
(4)序列化的实现:
java.io.Serializable
接口,只要类实现接口,就可以被序列化(5)反序列化的关键点——序列化ID:
(6)序列化在子父类中的使用: 若子类实现序列化,而想要父类也能够序列化,那么父类必须也实现Serializable接口
(7)阻止某个变量不进行序列化: Java 提供了 Transient 关键字来声明变量不参与序列化过程,在反序列化时,对应的 trasient 变量则被初始化。
7、Java复制
Java 程序中若想要将一个对象复制给另一个对象,一共有三种方法:直接赋值、浅拷贝、深拷贝。