JAVA第八周
- 多方法接口要实现里面所有的抽象方法
- 单方法接口
- marked interface标志性接口
- 对marked接口举例: 如何clone?
- 很可能会报错CloneNotSupportedException
- 要弄成可以克隆的,比如实现Cloneable的接口
- 复制的adress对象居然也会被修改
- 为什么有的属性被修改了?这样岂不是p2影响到p1?很不安全?
- 先回到最原始的问题–如何克隆?
- 基本数据类型的成员变量存在对象自己的堆里,是私有的,clone之后p1和p2的pid就不一样了,所以可以单独修改。
- 而string类是不变类,immutable的且是一个对象,一开始p1和p2指向第一个pname,然后改变之后p2就指向了新建的pname,所以这个也可以单独修改。
- 而如果clone的对象里面还有对象那需要深度克隆,因为指向同一个对象,修改了这个对象,p1和p2指向的address对象都被修改了,或者说本来就只有一个被修,就一起修。
- 解决办法把address变成cloneable,然后在person的clone方法里面设定address也clone一下
- 当然上面几个一开始都只是浅层拷贝
- jdk1.8新增了一个特性
- 我们都知道java得接口一旦写的时候多了一个方法就会导致本来调用的这个借口的类报错(因为要实现全部方法)
- 解决办法就是使用伴生类,或者写defalut关键字,或者使用static关键字
- Functional interface用lamda来表达,但是只能有一个无方法体的方法,不然他不知道你的lamda是为了服务谁的
异常处理
- Exception and Error
- 关于error和exception的区别是error表示恢复不是不可能但很困难的情况下的一种严重问题是exception表示一种设计或实现问题
- 如果不使用try catch就变成这样!!没有可读性 丑爆了
 - 如果try到了exception就丢入catch里,这个exception是一种特殊机制
- Exception也是一个对象,会扔出去report给,而exception是一个栈形式的扔出
- 为什么c也需要try catch?因为b不知道是d导致异常,但是c可能有异常,所以要使用
- throw是真的抛,throws是可能抛
-
写了throws的话就要继续抛或者catch
-
当你main函数依旧搁哪throws
 -
这catch是虚拟机干的,是被异常终止的,然后把异常给你打了出来
-

-
谁来catch?反正不能jvm,因为会直接shut down
-
解决异常要as soon ad possible
-
- catch可以限定类型
- 如果想要同时catch两种异常该怎么办?
- 那就继续扔(记得加throws)
- 异常其实就是一个快照,你拿到哪里,在哪里打出来,都会是一样
- 多个exception其实无所谓 因为只会catch一个相对应的异常
- 如果有异常马上不做去做finally
- runtime exception!不需要throws
- 为什么有的异常非说book呢?
- runtime exception有null pointer exception
- 现在我们的程序都是面向对象的,传个对象,掉个方法都很正常,而当你传对象的时候,你可能传了个空的就会导致(NullPointerException),所以这样的话,岂不是写一行一个try catch,所以不是一定要写,不过如果还是有错误就会被jvm kill到程序,但是还是可以try catch来保证程序的可行性