一、Java异常分类以及处理
概念:Java程序方法不能按照正常途径完成任务,就可以通过另一条途径跳出方法。此时通常会抛出一个异常对象。这时候方法不能执行方向下面的语句了,异常处理通常会交给异常处理器。
Java异常的分类:分为Error和Exception
简单来说一下error是什么:error是由Java虚拟机内部产生错误而导致的,比如说Java虚拟机内除不足,资源耗尽等
Exception:又分为:一 个 是 运 行 时 异 常 RuntimeException , 一 个 是 CheckedException。
RuntimeException:比如说npe 空指针异常等等 ;CheckedException:RuntimeException
Java异常的处理方式:
一种是遇到问题不具体解决而是抛给调用者如throw、throws、二是主动捕获异常进行处理 三、还有一种是系统自动抛出异常
Throw和Throws的区别:
一、用的位置不同,throw用于方法中,throws用于方法名后面
二、作用不同 throw是抛出一个异常对象,throws是用于声明可能产生的异常
三、效果不一样:throw 它后面的语句都不会执行了,说明此时一定有了异常;throws表示出现异常的一种可能性,并不一定会发生异常。
二、Java反射
概念:在Java程序运行的过程中,对于任意一个类都能知道其对应的方法属性,对于任意一个对象我们都能够知道该对象的方法,这种动态的获取类的信息的机制就是Java反射
Java反射的应用场景
1.比如 Person p=new Student();
其中编译时类型为 Person,运行时类型为 Student。
2.在程序运行的过程中,可能需要从外部接入信息,其对象编译是object ,但是程序需要调用该对象的运行时的方法,此时就要通过反射来解决该问题
Java 反射 API 反射 API 用来生成 JVM 中的类、接口或则对象的信息。
1. Class 类:反射的核心类,可以获取类的属性,方法等信息。
2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性 值。
3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或 者执行方法。
4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。
反射使用步骤(获取 Class 对象、调用对象方法)
1. 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方 法。
2. 调用 Class 类中的方法,既就是反射的使用阶段。
3. 使用反射 API 来操作这些信息。
首先获取class对象 有几种方式:
拿到class对象后,我们想要创建对应类的对象该怎么办呢?
三、Java内部类
首先java的内部类有四种:静态内部类、成员内部类、局部内部类、匿名内部类
内部类简单来说就是写在一个类里面的类
静态内部类就是,用static修饰的内部类
1. 静态内部类可以访问外部类所有的静态变量和方法,即使是 private 的也一样。
2. 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。
3. 其它类使用静态内部类需要使用“外部类.静态内部类”方式,如下所示:Out.Inner inner = new Out.Inner();inner.print();
4. Java集合类HashMap内部就有一个静态内部类Entry。Entry是HashMap存放元素的抽象, HashMap 内部维护 Entry 数组用了存放元素,但是 Entry 对使用者是透明的。像这种和外部 类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。
成员内部类,是写在内部中的普通类
局部内部类:是写在外部类中方法里面的类
匿名内部类:必须实现一个接口或者继承一个父类,直接使用是用new一个对象来引用
记录匿名内部类的编译类型是实现接口或者父类的类型,运行类型是系统内部实现的一个匿名类的类型!
四、Java泛型
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本 质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法, 能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用 Java 泛型。
类型通配符?
类型通配符一般是使用 ? 代 替 具 体 的 类 型 参 数 。 例 如 List 在逻辑上是 List,List 等所有 List的父类。
五、Java的序列化
简单来说就是创建可复用的Java对象
使用 Java 对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装 成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对 象序列化不会关注类中的静态变量。
Serializable 实现序列化 在 Java 中,只要一个类实现了 java.io.Serializable 接口,那么它就可以被序列化。
六、Java复制
将一个对象的引用复制给另外一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式 是浅拷贝,第三种是深拷贝。所以大家知道了哈,这三种概念实际上都是为了拷贝对象。
直接赋值。在 Java 中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是 说 a1 和 a2 指向的是同一个对象。因此,当 a1 变化的时候,a2 里面的成员变量也会跟 着变化。
浅复制(复制引用但不复制引用的对象):浅复制和直接复制的区别是需要创建一个新对象,对于基本类型,会直接赋相同的值,对于引用类型,是指向同一个引用对象的,当对象修改时原本和副本都会改变
深复制 和浅复制的区别就是 深拷贝不仅复制对象本身,而且复制对象包含的引用指向的所有对象。相当于是全部创建了一个新的引用!!!