auto commit
This commit is contained in:
parent
855bd5de40
commit
03a8e2cae3
@ -27,6 +27,7 @@
|
|||||||
* [Java 各版本的新特性](#java-各版本的新特性)
|
* [Java 各版本的新特性](#java-各版本的新特性)
|
||||||
* [Java 与 C++ 的区别](#java-与-c++-的区别)
|
* [Java 与 C++ 的区别](#java-与-c++-的区别)
|
||||||
* [JRE or JDK](#jre-or-jdk)
|
* [JRE or JDK](#jre-or-jdk)
|
||||||
|
* [参考资料](#参考资料)
|
||||||
<!-- GFM-TOC -->
|
<!-- GFM-TOC -->
|
||||||
|
|
||||||
|
|
||||||
@ -34,41 +35,55 @@
|
|||||||
|
|
||||||
## final
|
## final
|
||||||
|
|
||||||
<font size=4> **1. 数据** </font> </br>
|
**1. 数据**
|
||||||
|
|
||||||
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
|
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
|
||||||
|
|
||||||
- 对于基本类型,final 使数值不变;
|
- 对于基本类型,final 使数值不变;
|
||||||
- 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
|
- 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
|
||||||
|
|
||||||
<font size=4> **2. 方法** </font> </br>
|
```java
|
||||||
|
final int x = 1;
|
||||||
|
x = 2; // cannot assign value to final variable 'x'
|
||||||
|
final A y = new A();
|
||||||
|
y.a = 1;
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. 方法** </font> </br>
|
||||||
|
|
||||||
声明方法不能被子类覆盖。
|
声明方法不能被子类覆盖。
|
||||||
|
|
||||||
private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是覆盖基类方法,而是重载了。
|
private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是覆盖基类方法,而是重载了。
|
||||||
|
|
||||||
<font size=4> **3. 类** </font> </br>
|
**3. 类**
|
||||||
|
|
||||||
声明类不允许被继承。
|
声明类不允许被继承。
|
||||||
|
|
||||||
## static
|
## static
|
||||||
|
|
||||||
<font size=4> **1. 静态变量** </font> </br>
|
**1. 静态变量**
|
||||||
|
|
||||||
静态变量在内存中只存在一份,只在类第一次实例化时初始化一次。
|
静态变量在内存中只存在一份,只在类第一次实例化时初始化一次。
|
||||||
|
|
||||||
- 静态变量: 类所有的实例都共享静态变量,可以直接通过类名来访问它;
|
- 静态变量:类所有的实例都共享静态变量,可以直接通过类名来访问它;
|
||||||
- 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
|
- 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
|
||||||
|
|
||||||
<font size=4> **2. 静态方法** </font> </br>
|
```java
|
||||||
|
public class A {
|
||||||
|
private int x; // 实例变量
|
||||||
|
public static int y; // 静态变量
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. 静态方法**
|
||||||
|
|
||||||
静态方法在类加载的时候就存在了,它不依赖于任何实例,所以 static 方法必须实现,也就是说它不能是抽象方法(abstract)。
|
静态方法在类加载的时候就存在了,它不依赖于任何实例,所以 static 方法必须实现,也就是说它不能是抽象方法(abstract)。
|
||||||
|
|
||||||
<font size=4> **3. 静态语句块** </font> </br>
|
**3. 静态语句块**
|
||||||
|
|
||||||
静态语句块和静态变量一样在类第一次实例化时运行一次。
|
静态语句块和静态变量一样在类第一次实例化时运行一次。
|
||||||
|
|
||||||
<font size=4> **4. 初始化顺序** </font> </br>
|
**4. 初始化顺序**
|
||||||
|
|
||||||
静态数据优先于其它数据的初始化,静态变量和静态语句块哪个先运行取决于它们在代码中的顺序。
|
静态数据优先于其它数据的初始化,静态变量和静态语句块哪个先运行取决于它们在代码中的顺序。
|
||||||
|
|
||||||
@ -141,13 +156,53 @@ protected void finalize() throws Throwable {}
|
|||||||
|
|
||||||
## clone()
|
## clone()
|
||||||
|
|
||||||
<font size=4> **1. 浅拷贝** </font> </br>
|
**1. cloneable**
|
||||||
|
|
||||||
引用类型引用同一个对象。clone() 方法默认就是浅拷贝实现。
|
clone() 是 Object 的受保护方法,这意味着,如果一个类不显式去重载 clone() 就没有这个方法。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//d990c0e7-64d1-4ba3-8356-111bc91e53c5.png"/> </div><br>
|
```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. 深拷贝与浅拷贝**
|
||||||
|
|
||||||
<font size=4> **2. 深拷贝** </font> </br>
|
|
||||||
|
|
||||||
可以使用序列化实现。
|
可以使用序列化实现。
|
||||||
|
|
||||||
@ -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)
|
> [How do I copy an object in Java?](https://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java)
|
||||||
|
|
||||||
|
- 浅拷贝:引用类型引用同一个对象。
|
||||||
|
- 深拷贝:引用类型引用新的对象。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//CLone_20_281_29.png" width="800"/> </div><br>
|
||||||
|
|
||||||
## equals()
|
## equals()
|
||||||
|
|
||||||
<font size=4> **1. == 与 equals() 区别** </font> </br>
|
<font size=4> **1. == 与 equals() 区别** </font> </br>
|
||||||
@ -551,3 +611,8 @@ Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Obje
|
|||||||
|
|
||||||
- JRE is the JVM program, Java application need to run on JRE.
|
- 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"
|
- 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.
|
||||||
|
BIN
pics/CLone_20_281_29.png
Normal file
BIN
pics/CLone_20_281_29.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
Loading…
x
Reference in New Issue
Block a user