文章目录
1.static和final的区别?
2.为什么有些java类要实现Serializable接口?
为了网络进行传输或者持久化
什么是序列化
将对象的状态信息转换为可以存储或传输的形式的过程
除了实现Serializable接口还有什么序列化方式
-
Json序列化
-
FastJson序列化
-
ProtoBuff序列化
3.什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,
要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java
对象变成某个格式的字节流再传输。
但是,jre本身就提供了这种支持,我们可以调用 OutputStream 的 writeObject 方法来做,如果要让
java帮我们做,要被传输的对象必须实现 serializable 接口,这样,javac编译时就会进行特殊处理,
编译的类才可以被 writeObject 方法操作,这就是所谓的序列化。需要被序列化的类必须实现
Serializable 接口,该接口是一个mini接口,其中没有需要实现方法,implements Serializable只是
为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬
盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输,被传输的对象就
必须实现Serializable接口。
4.什么是内部类?内部类的作用
内部类的定义
将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
内部类的作用:
1、成员内部类 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态
成员)。 当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问
的是成员内部类的成员。
2、局部内部类 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局
部内部类的访问仅限于方法内或者该作用域内。
3、匿名内部类 匿名内部类就是没有名字的内部类
4、静态内部类 指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外
部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但
是可以访问静态成员变量和静态方法(包括私有类型) 一个 静态内部类去掉static 就是成员内部类,他
可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法
5.Excption与Error包结构
Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException)**,**运行时异常
(RuntimeException),错误(Error)
1、运行时异常
**定义:**RuntimeException及其子类都被称为运行时异常。
**特点:**Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fast机制产生的ConcurrentModificationException异常(java.util包下面的所有的集合类都是快速失败的,“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制,这个错叫并发修改异常。Fail-safe,java.util.concurrent包下面的所有的类都是安全失败的,在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出ConcurrentModificationException异常。如果未遍历的数组上的内容发生了变化,则有可能反映到迭代过程中。这就是ConcurrentHashMap迭代器弱一致的表现。ConcurrentHashMap的弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡。要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样了。)等,都属于运行时异常。
常见的五种运行时异常:
-
ClassCastException (类转换异常)
-
IndexOutOfBoundsException (数组越界)
-
NullPointerException (空指针异常)
-
ArrayStoreException (数据存储异常,操作数组是类型不一致)
-
BufferOverflowException 参考这位博主的博客
2、被检查异常
**定义:**Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异
常。
特点 : Java编译器会检查它。 此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。
当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。 如:
-
IOException
-
FileNotFoundException
-
SQLException
被检查的异常适用于那些不是因程序引起的错误情况,比如:读取文件时文件不存在引发的
FileNotFoundException 。然而,不被检查的异常通常都是由于糟糕的编程引起的,比如:在对象引
用时没有确保对象非空而引起的 NullPointerException 。
3、错误
定义 : Error类及其子类。
特点 : 和运行时异常一样,编译器也不会对错误进行检查。
当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。OutOfMemoryError、ThreadDeath。