diff --git a/notes/Java 基础.md b/notes/Java 基础.md
index e5629d33..9e445edc 100644
--- a/notes/Java 基础.md
+++ b/notes/Java 基础.md
@@ -27,6 +27,7 @@
* [Java 各版本的新特性](#java-各版本的新特性)
* [Java 与 C++ 的区别](#java-与-c++-的区别)
* [JRE or JDK](#jre-or-jdk)
+* [参考资料](#参考资料)
@@ -34,41 +35,55 @@
## final
- **1. 数据**
+**1. 数据**
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
- 对于基本类型,final 使数值不变;
- 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
- **2. 方法**
+```java
+final int x = 1;
+x = 2; // cannot assign value to final variable 'x'
+final A y = new A();
+y.a = 1;
+```
+
+**2. 方法**
声明方法不能被子类覆盖。
private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是覆盖基类方法,而是重载了。
- **3. 类**
+**3. 类**
声明类不允许被继承。
## static
- **1. 静态变量**
+**1. 静态变量**
静态变量在内存中只存在一份,只在类第一次实例化时初始化一次。
-- 静态变量: 类所有的实例都共享静态变量,可以直接通过类名来访问它;
+- 静态变量:类所有的实例都共享静态变量,可以直接通过类名来访问它;
- 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
- **2. 静态方法**
+```java
+public class A {
+ private int x; // 实例变量
+ public static int y; // 静态变量
+}
+```
+
+**2. 静态方法**
静态方法在类加载的时候就存在了,它不依赖于任何实例,所以 static 方法必须实现,也就是说它不能是抽象方法(abstract)。
- **3. 静态语句块**
+**3. 静态语句块**
静态语句块和静态变量一样在类第一次实例化时运行一次。
- **4. 初始化顺序**
+**4. 初始化顺序**
静态数据优先于其它数据的初始化,静态变量和静态语句块哪个先运行取决于它们在代码中的顺序。
@@ -141,13 +156,53 @@ protected void finalize() throws Throwable {}
## clone()
- **1. 浅拷贝**
+**1. cloneable**
-引用类型引用同一个对象。clone() 方法默认就是浅拷贝实现。
+clone() 是 Object 的受保护方法,这意味着,如果一个类不显式去重载 clone() 就没有这个方法。
-
+```java
+public class CloneTest {
+ private int a;
+ private int b;
+}
+```
+
+```java
+CloneTest x = new CloneTest();
+CloneTest y = x.clone(); // 'clone()' has protected access in 'java.lang.Object'
+```
+
+接下来重载 Object 的 clone() 得到以下实现:
+
+```java
+public class CloneTest{
+ private int a;
+ private int b;
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+}
+```
+
+```java
+CloneTest x = new CloneTest();
+try {
+ CloneTest y = (CloneTest) x.clone();
+} catch (CloneNotSupportedException e) {
+ e.printStackTrace();
+}
+```
+
+```html
+java.lang.CloneNotSupportedException: CloneTest
+```
+
+以上跑出了 CloneNotSupportedException,这是因为 CloneTest 没有实现 Cloneable 接口。应该注意的是,clone() 方法并不是 Cloneable 接口的方法,而是 Object 的一个 protect 方法。Cloneable 接口只是规定,如果一个类没有实现 Cloneable 接口又调用了 clone() 方法,就会抛出 CloneNotSupportedException。
+
+**2. 深拷贝与浅拷贝**
- **2. 深拷贝**
可以使用序列化实现。
@@ -155,6 +210,11 @@ protected void finalize() throws Throwable {}
> [How do I copy an object in Java?](https://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java)
+- 浅拷贝:引用类型引用同一个对象。
+- 深拷贝:引用类型引用新的对象。
+
+
+
## equals()
**1. == 与 equals() 区别**
@@ -551,3 +611,8 @@ Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Obje
- JRE is the JVM program, Java application need to run on JRE.
- JDK is a superset of JRE, JRE + tools for developing java programs. e.g, it provides the compiler "javac"
+
+# 参考资料
+
+- Eckel B. Java 编程思想[M]. 机械工业出版社, 2002.
+- Bloch J. Effective java[M]. Addison-Wesley Professional, 2017.
diff --git a/pics/CLone_20_281_29.png b/pics/CLone_20_281_29.png
new file mode 100644
index 00000000..8b5b9308
Binary files /dev/null and b/pics/CLone_20_281_29.png differ