---
title: Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)
category: Java
tag:
- Javaåºç¡
head:
- - meta
- name: keywords
content: é¢å对象,æé æ¹æ³,æ¥å£,æ½è±¡ç±»,String,Object
- - meta
- name: description
content: å
¨ç½è´¨éæé«çJavaåºç¡å¸¸è§ç¥è¯ç¹åé¢è¯é¢æ»ç»ï¼å¸æå¯¹ä½ æå¸®å©ï¼
---
## é¢å对象åºç¡
### é¢å对象åé¢åè¿ç¨çåºå«
é¢åè¿ç¨ç¼ç¨ï¼Procedural-Oriented Programmingï¼POPï¼åé¢å对象ç¼ç¨ï¼Object-Oriented Programmingï¼OOPï¼æ¯ä¸¤ç§å¸¸è§çç¼ç¨èå¼ï¼ä¸¤è
ç主è¦åºå«å¨äºè§£å³é®é¢çæ¹å¼ä¸åï¼
- **é¢åè¿ç¨ç¼ç¨ï¼POPï¼**ï¼é¢åè¿ç¨æè§£å³é®é¢çè¿ç¨ææä¸ä¸ªä¸ªæ¹æ³ï¼éè¿ä¸ä¸ªä¸ªæ¹æ³çæ§è¡è§£å³é®é¢ã
- **é¢å对象ç¼ç¨ï¼OOPï¼**ï¼é¢å对象ä¼å
æ½è±¡åºå¯¹è±¡ï¼ç¶åç¨å¯¹è±¡æ§è¡æ¹æ³çæ¹å¼è§£å³é®é¢ã
ç¸æ¯è¾äº POPï¼OOP å¼åçç¨åºä¸è¬å
·æä¸é¢è¿äºä¼ç¹ï¼
- **æç»´æ¤**ï¼ç±äºè¯å¥½çç»æåå°è£
æ§ï¼OOP ç¨åºé常æ´å®¹æç»´æ¤ã
- **æå¤ç¨**ï¼éè¿ç»§æ¿å夿ï¼OOP 设计使å¾ä»£ç æ´å
·å¤ç¨æ§ï¼æ¹ä¾¿æ©å±åè½ã
- **ææ©å±**ï¼æ¨¡åå设计使å¾ç³»ç»æ©å±å徿´å 容æåçµæ´»ã
POP çç¼ç¨æ¹å¼é常æ´ä¸ºç®ååç´æ¥ï¼éåå¤çä¸äºè¾ç®åçä»»å¡ã
POP å OOP çæ§è½å·®å¼ä¸»è¦åå³äºå®ä»¬çè¿è¡æºå¶ï¼èä¸ä»
ä»
æ¯ç¼ç¨è弿¬èº«ãå æ¤ï¼ç®åå°æ¯è¾ä¸¤è
çæ§è½æ¯ä¸ä¸ªå¸¸è§ç误åºï¼ç¸å
³ issue : [é¢åè¿ç¨ï¼é¢åè¿ç¨æ§è½æ¯é¢å对象é«ï¼ï¼](https://github.com/Snailclimb/JavaGuide/issues/431) ï¼ã

å¨éæ©ç¼ç¨è弿¶ï¼æ§è½å¹¶ä¸æ¯å¯ä¸çèèå ç´ ã代ç çå¯ç»´æ¤æ§ã坿©å±æ§åå¼åæçåæ ·éè¦ã
ç°ä»£ç¼ç¨è¯è¨åºæ¬é½æ¯æå¤ç§ç¼ç¨èå¼ï¼æ¢å¯ä»¥ç¨æ¥è¿è¡é¢åè¿ç¨ç¼ç¨ï¼ä¹å¯ä»¥è¿è¡é¢å对象ç¼ç¨ã
ä¸é¢æ¯ä¸ä¸ªæ±åçé¢ç§¯åå¨é¿ç示ä¾ï¼ç®ååå«å±ç¤ºäºé¢å对象åé¢åè¿ç¨ä¸¤ç§ä¸åçè§£å³æ¹æ¡ã
**é¢å对象**ï¼
```java
public class Circle {
// å®ä¹åçåå¾
private double radius;
// æé 彿°
public Circle(double radius) {
this.radius = radius;
}
// 计ç®åçé¢ç§¯
public double getArea() {
return Math.PI * radius * radius;
}
// 计ç®åçå¨é¿
public double getPerimeter() {
return 2 * Math.PI * radius;
}
public static void main(String[] args) {
// å建ä¸ä¸ªåå¾ä¸º3çå
Circle circle = new Circle(3.0);
// è¾åºåçé¢ç§¯åå¨é¿
System.out.println("åçé¢ç§¯ä¸ºï¼" + circle.getArea());
System.out.println("åçå¨é¿ä¸ºï¼" + circle.getPerimeter());
}
}
```
æä»¬å®ä¹äºä¸ä¸ª `Circle` ç±»æ¥è¡¨ç¤ºåï¼è¯¥ç±»å
å«äºåçåå¾å±æ§å计ç®é¢ç§¯ãå¨é¿çæ¹æ³ã
**é¢åè¿ç¨**ï¼
```java
public class Main {
public static void main(String[] args) {
// å®ä¹åçåå¾
double radius = 3.0;
// 计ç®åçé¢ç§¯åå¨é¿
double area = Math.PI * radius * radius;
double perimeter = 2 * Math.PI * radius;
// è¾åºåçé¢ç§¯åå¨é¿
System.out.println("åçé¢ç§¯ä¸ºï¼" + area);
System.out.println("åçå¨é¿ä¸ºï¼" + perimeter);
}
}
```
æä»¬ç´æ¥å®ä¹äºåçåå¾ï¼å¹¶ä½¿ç¨è¯¥åå¾ç´æ¥è®¡ç®åºåçé¢ç§¯åå¨é¿ã
### å建ä¸ä¸ªå¯¹è±¡ç¨ä»ä¹è¿ç®ç¬¦?对象å®ä½ä¸å¯¹è±¡å¼ç¨æä½ä¸å?
new è¿ç®ç¬¦ï¼new å建对象å®ä¾ï¼å¯¹è±¡å®ä¾å¨å å
åä¸ï¼ï¼å¯¹è±¡å¼ç¨æå对象å®ä¾ï¼å¯¹è±¡å¼ç¨åæ¾å¨æ å
åä¸ï¼ã
- ä¸ä¸ªå¯¹è±¡å¼ç¨å¯ä»¥æå 0 个æ 1 个对象ï¼ä¸æ ¹ç»³åå¯ä»¥ä¸ç³»æ°çï¼ä¹å¯ä»¥ç³»ä¸ä¸ªæ°çï¼ï¼
- ä¸ä¸ªå¯¹è±¡å¯ä»¥æ n 个å¼ç¨æåå®ï¼å¯ä»¥ç¨ n æ¡ç»³åç³»ä½ä¸ä¸ªæ°çï¼ã
### 对象çç¸çåå¼ç¨ç¸ççåºå«
- 对象çç¸çä¸è¬æ¯è¾çæ¯å
åä¸åæ¾çå
容æ¯å¦ç¸çã
- å¼ç¨ç¸çä¸è¬æ¯è¾çæ¯ä»ä»¬æåçå
åå°åæ¯å¦ç¸çã
è¿é举ä¸ä¸ªä¾åï¼
```java
String str1 = "hello";
String str2 = new String("hello");
String str3 = "hello";
// ä½¿ç¨ == æ¯è¾å符串çå¼ç¨ç¸ç
System.out.println(str1 == str2);
System.out.println(str1 == str3);
// ä½¿ç¨ equals æ¹æ³æ¯è¾å符串çç¸ç
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
```
è¾åºç»æï¼
```plain
false
true
true
true
```
ä»ä¸é¢ç代ç è¾åºç»æå¯ä»¥çåºï¼
- `str1` å `str2` ä¸ç¸çï¼è `str1` å `str3` ç¸çãè¿æ¯å 为 `==` è¿ç®ç¬¦æ¯è¾çæ¯å符串çå¼ç¨æ¯å¦ç¸çã
- `str1`ã `str2`ã`str3` ä¸è
çå
容é½ç¸çãè¿æ¯å 为`equals` æ¹æ³æ¯è¾çæ¯å符串çå
容ï¼å³ä½¿è¿äºå符串ç对象å¼ç¨ä¸åï¼åªè¦å®ä»¬çå
容ç¸çï¼å°±è®¤ä¸ºå®ä»¬æ¯ç¸ççã
### 妿ä¸ä¸ªç±»æ²¡æå£°ææé æ¹æ³ï¼è¯¥ç¨åºè½æ£ç¡®æ§è¡å?
æé æ¹æ³æ¯ä¸ç§ç¹æ®çæ¹æ³ï¼ä¸»è¦ä½ç¨æ¯å®æå¯¹è±¡çåå§åå·¥ä½ã
妿ä¸ä¸ªç±»æ²¡æå£°ææé æ¹æ³ï¼ä¹å¯ä»¥æ§è¡ï¼å 为ä¸ä¸ªç±»å³ä½¿æ²¡æå£°ææé æ¹æ³ä¹ä¼æé»è®¤çä¸å¸¦åæ°çæé æ¹æ³ã妿æä»¬èªå·±æ·»å äºç±»çæé æ¹æ³ï¼æ 论æ¯å¦æåï¼ï¼Java å°±ä¸ä¼æ·»å é»è®¤çæ åæ°çæé æ¹æ³äºã
æä»¬ä¸ç´å¨ä¸ç¥ä¸è§å°ä½¿ç¨æé æ¹æ³ï¼è¿ä¹æ¯ä¸ºä»ä¹æä»¬å¨åå»ºå¯¹è±¡çæ¶ååé¢è¦å ä¸ä¸ªæ¬å·ï¼å 为è¦è°ç¨æ åçæé æ¹æ³ï¼ã妿æä»¬éè½½äºæåçæé æ¹æ³ï¼è®°å¾é½è¦ææ åçæé æ¹æ³ä¹ååºæ¥ï¼æ 论æ¯å¦ç¨å°ï¼ï¼å 为è¿å¯ä»¥å¸®å©æä»¬å¨åå»ºå¯¹è±¡çæ¶åå°è¸©åã
### æé æ¹æ³æåªäºç¹ç¹ï¼æ¯å¦å¯è¢« override?
æé æ¹æ³å
·æä»¥ä¸ç¹ç¹ï¼
- **åç§°ä¸ç±»åç¸å**ï¼æé æ¹æ³çåç§°å¿
é¡»ä¸ç±»åå®å
¨ä¸è´ã
- **没æè¿åå¼**ï¼æé æ¹æ³æ²¡æè¿åç±»åï¼ä¸ä¸è½ä½¿ç¨ `void` 声æã
- **èªå¨æ§è¡**ï¼å¨çæç±»ç对象æ¶ï¼æé æ¹æ³ä¼èªå¨æ§è¡ï¼æ éæ¾å¼è°ç¨ã
æé æ¹æ³**ä¸è½è¢«éåï¼overrideï¼**ï¼ä½**å¯ä»¥è¢«éè½½ï¼overloadï¼**ãå æ¤ï¼ä¸ä¸ªç±»ä¸å¯ä»¥æå¤ä¸ªæé æ¹æ³ï¼è¿äºæé æ¹æ³å¯ä»¥å
·æä¸åçåæ°å表ï¼ä»¥æä¾ä¸åç对象åå§åæ¹å¼ã
### é¢å对象ä¸å¤§ç¹å¾
#### å°è£
å°è£
æ¯ææä¸ä¸ªå¯¹è±¡çç¶æä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼éèå¨å¯¹è±¡å
é¨ï¼ä¸å
许å¤é¨å¯¹è±¡ç´æ¥è®¿é®å¯¹è±¡çå
é¨ä¿¡æ¯ã使¯å¯ä»¥æä¾ä¸äºå¯ä»¥è¢«å¤ç访é®çæ¹æ³æ¥æä½å±æ§ã就好åæä»¬çä¸å°æå¨å¢ä¸ç空è°çå
é¨çé¶ä»¶ä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼ï¼ä½æ¯å¯ä»¥éè¿é¥æ§å¨ï¼æ¹æ³ï¼æ¥æ§å¶ç©ºè°ã妿屿§ä¸æ³è¢«å¤ç访é®ï¼æä»¬å¤§å¯ä¸å¿
æä¾æ¹æ³ç»å¤ç访é®ã使¯å¦æä¸ä¸ªç±»æ²¡ææä¾ç»å¤ç访é®çæ¹æ³ï¼é£ä¹è¿ä¸ªç±»ä¹æ²¡æä»ä¹æä¹äºã就好åå¦ææ²¡æç©ºè°é¥æ§å¨ï¼é£ä¹æä»¬å°±æ æ³ææ§ç©ºåå¶å·ï¼ç©ºè°æ¬èº«å°±æ²¡ææä¹äºï¼å½ç¶ç°å¨è¿æå¾å¤å
¶ä»æ¹æ³ ï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾åï¼ã
```java
public class Student {
private int id;//id屿§ç§æå
private String name;//name屿§ç§æå
//è·åidçæ¹æ³
public int getId() {
return id;
}
//设置idçæ¹æ³
public void setId(int id) {
this.id = id;
}
//è·ånameçæ¹æ³
public String getName() {
return name;
}
//设置nameçæ¹æ³
public void setName(String name) {
this.name = name;
}
}
```
#### ç»§æ¿
ä¸åç±»åç对象ï¼ç¸äºä¹é´ç»å¸¸æä¸å®æ°éçå
±åç¹ãä¾å¦ï¼å°æåå¦ãå°çº¢åå¦ãå°æåå¦ï¼é½å
±äº«å¦ççç¹æ§ï¼ç级ãå¦å·çï¼ãåæ¶ï¼æ¯ä¸ä¸ªå¯¹è±¡è¿å®ä¹äºé¢å¤çç¹æ§ä½¿å¾ä»ä»¬ä¸ä¼ä¸åãä¾å¦å°æçæ°å¦æ¯è¾å¥½ï¼å°çº¢çæ§æ ¼æ¹äººåç±ï¼å°æçåæ°æ¯è¾å¤§ãç»§æ¿æ¯ä½¿ç¨å·²åå¨çç±»çå®ä¹ä½ä¸ºåºç¡å»ºç«æ°ç±»çææ¯ï¼æ°ç±»çå®ä¹å¯ä»¥å¢å æ°çæ°æ®ææ°çåè½ï¼ä¹å¯ä»¥ç¨ç¶ç±»çåè½ï¼ä½ä¸è½éæ©æ§å°ç»§æ¿ç¶ç±»ãéè¿ä½¿ç¨ç»§æ¿ï¼å¯ä»¥å¿«éå°å建æ°çç±»ï¼å¯ä»¥æé«ä»£ç çéç¨ï¼ç¨åºçå¯ç»´æ¤æ§ï¼èç大éå建æ°ç±»çæ¶é´ ï¼æé«æä»¬çå¼åæçã
**å
³äºç»§æ¿å¦ä¸ 3 ç¹è¯·è®°ä½ï¼**
1. åç±»æ¥æç¶ç±»å¯¹è±¡ææç屿§åæ¹æ³ï¼å
æ¬ç§æå±æ§åç§ææ¹æ³ï¼ï¼ä½æ¯ç¶ç±»ä¸çç§æå±æ§åæ¹æ³åç±»æ¯æ æ³è®¿é®ï¼**åªæ¯æ¥æ**ã
2. åç±»å¯ä»¥æ¥æèªå·±å±æ§åæ¹æ³ï¼å³åç±»å¯ä»¥å¯¹ç¶ç±»è¿è¡æ©å±ã
3. åç±»å¯ä»¥ç¨èªå·±çæ¹å¼å®ç°ç¶ç±»çæ¹æ³ãï¼ä»¥åä»ç»ï¼ã
#### 夿
夿ï¼é¡¾åæä¹ï¼è¡¨ç¤ºä¸ä¸ªå¯¹è±¡å
·æå¤ç§çç¶æï¼å
·ä½è¡¨ç°ä¸ºç¶ç±»çå¼ç¨æååç±»çå®ä¾ã
**夿çç¹ç¹:**
- 对象类ååå¼ç¨ç±»åä¹é´å
·æç»§æ¿ï¼ç±»ï¼/å®ç°ï¼æ¥å£ï¼çå
³ç³»ï¼
- å¼ç¨ç±»ååéååºçæ¹æ³è°ç¨çå°åºæ¯åªä¸ªç±»ä¸çæ¹æ³ï¼å¿
é¡»å¨ç¨åºè¿è¡æé´æè½ç¡®å®ï¼
- 夿ä¸è½è°ç¨âåªå¨åç±»åå¨ä½å¨ç¶ç±»ä¸åå¨âçæ¹æ³ï¼
- 妿åç±»éåäºç¶ç±»çæ¹æ³ï¼çæ£æ§è¡çæ¯åç±»éåçæ¹æ³ï¼å¦æå类没æéåç¶ç±»çæ¹æ³ï¼æ§è¡çæ¯ç¶ç±»çæ¹æ³ã
### æ¥å£åæ½è±¡ç±»æä»ä¹å
±åç¹ååºå«ï¼
#### æ¥å£åæ½è±¡ç±»çå
±åç¹
- **å®ä¾å**ï¼æ¥å£åæ½è±¡ç±»é½ä¸è½ç´æ¥å®ä¾åï¼åªè½è¢«å®ç°ï¼æ¥å£ï¼æç»§æ¿ï¼æ½è±¡ç±»ï¼åæè½å建å
·ä½ç对象ã
- **æ½è±¡æ¹æ³**ï¼æ¥å£åæ½è±¡ç±»é½å¯ä»¥å
嫿½è±¡æ¹æ³ãæ½è±¡æ¹æ³æ²¡ææ¹æ³ä½ï¼å¿
é¡»å¨åç±»æå®ç°ç±»ä¸å®ç°ã
#### æ¥å£åæ½è±¡ç±»çåºå«
- **设计ç®ç**ï¼æ¥å£ä¸»è¦ç¨äºå¯¹ç±»çè¡ä¸ºè¿è¡çº¦æï¼ä½ å®ç°äºæä¸ªæ¥å£å°±å
·æäºå¯¹åºçè¡ä¸ºãæ½è±¡ç±»ä¸»è¦ç¨äºä»£ç å¤ç¨ï¼å¼ºè°çæ¯æå±å
³ç³»ã
- **ç»§æ¿åå®ç°**ï¼ä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªç±»ï¼å
æ¬æ½è±¡ç±»ï¼ï¼å 为 Java 䏿¯æå¤ç»§æ¿ãä½ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£ï¼ä¸ä¸ªæ¥å£ä¹å¯ä»¥ç»§æ¿å¤ä¸ªå
¶ä»æ¥å£ã
- **æååé**ï¼æ¥å£ä¸çæååéåªè½æ¯ `public static final` ç±»åçï¼ä¸è½è¢«ä¿®æ¹ä¸å¿
é¡»æåå§å¼ãæ½è±¡ç±»çæååéå¯ä»¥æä»»ä½ä¿®é¥°ç¬¦ï¼`private`, `protected`, `public`ï¼ï¼å¯ä»¥å¨åç±»ä¸è¢«éæ°å®ä¹æèµå¼ã
- **æ¹æ³**ï¼
- Java 8 ä¹åï¼æ¥å£ä¸çæ¹æ³é»è®¤æ¯ `public abstract` ï¼ä¹å°±æ¯åªè½ææ¹æ³å£°æãèª Java 8 èµ·ï¼å¯ä»¥å¨æ¥å£ä¸å®ä¹ `default`ï¼é»è®¤ï¼ æ¹æ³å `static` ï¼éæï¼æ¹æ³ã èª Java 9 èµ·ï¼æ¥å£å¯ä»¥å
å« `private` æ¹æ³ã
- æ½è±¡ç±»å¯ä»¥å
嫿½è±¡æ¹æ³åéæ½è±¡æ¹æ³ãæ½è±¡æ¹æ³æ²¡ææ¹æ³ä½ï¼å¿
é¡»å¨åç±»ä¸å®ç°ãéæ½è±¡æ¹æ³æå
·ä½å®ç°ï¼å¯ä»¥ç´æ¥å¨æ½è±¡ç±»ä¸ä½¿ç¨æå¨åç±»ä¸éåã
å¨ Java 8 å以ä¸çæ¬ä¸ï¼æ¥å£å¼å
¥äºæ°çæ¹æ³ç±»åï¼`default` æ¹æ³ã`static` æ¹æ³å `private` æ¹æ³ãè¿äºæ¹æ³è®©æ¥å£çä½¿ç¨æ´å çµæ´»ã
Java 8 å¼å
¥ç`default` æ¹æ³ç¨äºæä¾æ¥å£æ¹æ³çé»è®¤å®ç°ï¼å¯ä»¥å¨å®ç°ç±»ä¸è¢«è¦çãè¿æ ·å°±å¯ä»¥å¨ä¸ä¿®æ¹å®ç°ç±»çæ
åµä¸åç°ææ¥å£æ·»å æ°åè½ï¼ä»èå¢å¼ºæ¥å£çæ©å±æ§åååå
¼å®¹æ§ã
```java
public interface MyInterface {
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
```
Java 8 å¼å
¥ç`static` æ¹æ³æ æ³å¨å®ç°ç±»ä¸è¢«è¦çï¼åªè½éè¿æ¥å£åç´æ¥è°ç¨ï¼ `MyInterface.staticMethod()`ï¼ï¼ç±»ä¼¼äºç±»ä¸çéææ¹æ³ã`static` æ¹æ³é常ç¨äºå®ä¹ä¸äºéç¨çã䏿¥å£ç¸å
³çå·¥å
·æ¹æ³ï¼ä¸è¬å¾å°ç¨ã
```java
public interface MyInterface {
static void staticMethod() {
System.out.println("This is a static method in the interface.");
}
}
```
Java 9 å
è®¸å¨æ¥å£ä¸ä½¿ç¨ `private` æ¹æ³ã`private`æ¹æ³å¯ä»¥ç¨äºå¨æ¥å£å
é¨å
±äº«ä»£ç ï¼ä¸å¯¹å¤æ´é²ã
```java
public interface MyInterface {
// default æ¹æ³
default void defaultMethod() {
commonMethod();
}
// static æ¹æ³
static void staticMethod() {
commonMethod();
}
// ç§æéææ¹æ³ï¼å¯ä»¥è¢« static å default æ¹æ³è°ç¨
private static void commonMethod() {
System.out.println("This is a private method used internally.");
}
// å®ä¾ç§ææ¹æ³ï¼åªè½è¢« default æ¹æ³è°ç¨ã
private void instanceCommonMethod() {
System.out.println("This is a private instance method used internally.");
}
}
```
### æ·±æ·è´åæµ
æ·è´åºå«äºè§£åï¼ä»ä¹æ¯å¼ç¨æ·è´ï¼
å
³äºæ·±æ·è´åæµ
æ·è´åºå«ï¼æè¿éå
ç»ç»è®ºï¼
- **æµ
æ·è´**ï¼æµ
æ·è´ä¼å¨å ä¸å建ä¸ä¸ªæ°ç对象ï¼åºå«äºå¼ç¨æ·è´çä¸ç¹ï¼ï¼ä¸è¿ï¼å¦æå对象å
é¨ç屿§æ¯å¼ç¨ç±»åçè¯ï¼æµ
æ·è´ä¼ç´æ¥å¤å¶å
é¨å¯¹è±¡çå¼ç¨å°åï¼ä¹å°±æ¯è¯´æ·è´å¯¹è±¡åå对象å
±ç¨åä¸ä¸ªå
é¨å¯¹è±¡ã
- **æ·±æ·è´**ï¼æ·±æ·è´ä¼å®å
¨å¤å¶æ´ä¸ªå¯¹è±¡ï¼å
æ¬è¿ä¸ªå¯¹è±¡æå
å«çå
é¨å¯¹è±¡ã
ä¸é¢çç»è®ºæ²¡æå®å
¨çè§£çè¯ä¹æ²¡å
³ç³»ï¼æä»¬æ¥çä¸ä¸ªå
·ä½çæ¡ä¾ï¼
#### æµ
æ·è´
æµ
æ·è´ç示ä¾ä»£ç å¦ä¸ï¼æä»¬è¿éå®ç°äº `Cloneable` æ¥å£ï¼å¹¶éåäº `clone()` æ¹æ³ã
`clone()` æ¹æ³çå®ç°å¾ç®åï¼ç´æ¥è°ç¨çæ¯ç¶ç±» `Object` ç `clone()` æ¹æ³ã
```java
public class Address implements Cloneable{
private String name;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Address clone() {
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
public class Person implements Cloneable {
private Address address;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
```
æµè¯ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// true
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼ `person1` çå
é对象å `person1` 使ç¨çä»ç¶æ¯åä¸ä¸ª `Address` 对象ã
#### æ·±æ·è´
è¿éæä»¬ç®å对 `Person` ç±»ç `clone()` æ¹æ³è¿è¡ä¿®æ¹ï¼è¿å¸¦çè¦æ `Person` 对象å
é¨ç `Address` 对象ä¸èµ·å¤å¶ã
```java
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
person.setAddress(person.getAddress().clone());
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
```
æµè¯ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// false
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼æ¾ç¶ `person1` çå
é对象å `person1` å
å«ç `Address` å¯¹è±¡å·²ç»æ¯ä¸åçäºã
**é£ä»ä¹æ¯å¼ç¨æ·è´å¢ï¼** ç®åæ¥è¯´ï¼å¼ç¨æ·è´å°±æ¯ä¸¤ä¸ªä¸åçå¼ç¨æååä¸ä¸ªå¯¹è±¡ã
æä¸é¨ç»äºä¸å¼ 徿¥æè¿°æµ
æ·è´ãæ·±æ·è´ãå¼ç¨æ·è´ï¼

## Object
### Object ç±»çå¸¸è§æ¹æ³æåªäºï¼
Object ç±»æ¯ä¸ä¸ªç¹æ®çç±»ï¼æ¯ææç±»çç¶ç±»ï¼ä¸»è¦æä¾äºä»¥ä¸ 11 ä¸ªæ¹æ³ï¼
```java
/**
* native æ¹æ³ï¼ç¨äºè¿åå½åè¿è¡æ¶å¯¹è±¡ç Class 对象ï¼ä½¿ç¨äº final å
³é®åä¿®é¥°ï¼æ
ä¸å
许åç±»éåã
*/
public final native Class> getClass()
/**
* native æ¹æ³ï¼ç¨äºè¿å对象çåå¸ç ï¼ä¸»è¦ä½¿ç¨å¨åå¸è¡¨ä¸ï¼æ¯å¦ JDK ä¸çHashMapã
*/
public native int hashCode()
/**
* ç¨äºæ¯è¾ 2 个对象çå
åå°åæ¯å¦ç¸çï¼String ç±»å¯¹è¯¥æ¹æ³è¿è¡äºéå以ç¨äºæ¯è¾å符串ç弿¯å¦ç¸çã
*/
public boolean equals(Object obj)
/**
* native æ¹æ³ï¼ç¨äºå建并è¿åå½å对象çä¸ä»½æ·è´ã
*/
protected native Object clone() throws CloneNotSupportedException
/**
* è¿åç±»çååå®ä¾çåå¸ç ç 16 è¿å¶çå符串ã建议 Object ææçåç±»é½éåè¿ä¸ªæ¹æ³ã
*/
public String toString()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãå¤éä¸ä¸ªå¨æ¤å¯¹è±¡çè§å¨ä¸çå¾
ç线ç¨(çè§å¨ç¸å½äºå°±æ¯éçæ¦å¿µ)ã妿æå¤ä¸ªçº¿ç¨å¨çå¾
åªä¼ä»»æå¤éä¸ä¸ªã
*/
public final native void notify()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãè· notify 䏿 ·ï¼å¯ä¸çåºå«å°±æ¯ä¼å¤é卿¤å¯¹è±¡çè§å¨ä¸çå¾
çææçº¿ç¨ï¼è䏿¯ä¸ä¸ªçº¿ç¨ã
*/
public final native void notifyAll()
/**
* nativeæ¹æ³ï¼å¹¶ä¸ä¸è½éåãæå线ç¨çæ§è¡ã注æï¼sleep æ¹æ³æ²¡æéæ¾éï¼è wait æ¹æ³éæ¾äºé ï¼timeout æ¯çå¾
æ¶é´ã
*/
public final native void wait(long timeout) throws InterruptedException
/**
* å¤äº nanos åæ°ï¼è¿ä¸ªåæ°è¡¨ç¤ºé¢å¤æ¶é´ï¼ä»¥çº³ç§ä¸ºåä½ï¼èå´æ¯ 0-999999ï¼ã æä»¥è¶
æ¶çæ¶é´è¿éè¦å ä¸ nanos 纳ç§ãã
*/
public final void wait(long timeout, int nanos) throws InterruptedException
/**
* è·ä¹åç2个waitæ¹æ³ä¸æ ·ï¼åªä¸è¿è¯¥æ¹æ³ä¸ç´çå¾
ï¼æ²¡æè¶
æ¶æ¶é´è¿ä¸ªæ¦å¿µ
*/
public final void wait() throws InterruptedException
/**
* å®ä¾è¢«åå¾åæ¶å¨åæ¶çæ¶å触åçæä½
*/
protected void finalize() throws Throwable { }
```
### == å equals() çåºå«
**`==`** 对äºåºæ¬ç±»ååå¼ç¨ç±»åçä½ç¨æææ¯ä¸åçï¼
- 对äºåºæ¬æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¼ã
- 对äºå¼ç¨æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¯¹è±¡çå
åå°åã
> å 为 Java åªæå¼ä¼ éï¼æä»¥ï¼å¯¹äº == æ¥è¯´ï¼ä¸ç®¡æ¯æ¯è¾åºæ¬æ°æ®ç±»åï¼è¿æ¯å¼ç¨æ°æ®ç±»åçåéï¼å
¶æ¬è´¨æ¯è¾ç齿¯å¼ï¼åªæ¯å¼ç¨ç±»ååéåç弿¯å¯¹è±¡çå°åã
**`equals()`** ä¸è½ç¨äºå¤æåºæ¬æ°æ®ç±»åçåéï¼åªè½ç¨æ¥å¤æä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸çã`equals()`æ¹æ³åå¨äº`Object`ç±»ä¸ï¼è`Object`ç±»æ¯ææç±»çç´æ¥æé´æ¥ç¶ç±»ï¼å æ¤ææçç±»é½æ`equals()`æ¹æ³ã
`Object` ç±» `equals()` æ¹æ³ï¼
```java
public boolean equals(Object obj) {
return (this == obj);
}
```
`equals()` æ¹æ³åå¨ä¸¤ç§ä½¿ç¨æ
åµï¼
- **类没æéå `equals()`æ¹æ³**ï¼éè¿`equals()`æ¯è¾è¯¥ç±»ç两个对象æ¶ï¼çä»·äºéè¿â==âæ¯è¾è¿ä¸¤ä¸ªå¯¹è±¡ï¼ä½¿ç¨çé»è®¤æ¯ `Object`ç±»`equals()`æ¹æ³ã
- **ç±»éåäº `equals()`æ¹æ³**ï¼ä¸è¬æä»¬é½éå `equals()`æ¹æ³æ¥æ¯è¾ä¸¤ä¸ªå¯¹è±¡ä¸ç屿§æ¯å¦ç¸çï¼è¥å®ä»¬ç屿§ç¸çï¼åè¿å true(å³ï¼è®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ç¸ç)ã
举个ä¾åï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾ãå®é
ä¸ï¼ä½ æç
§ä¸é¢è¿ç§åæ³çè¯ï¼å IDEA è¿ç§æ¯è¾æºè½ç IDE é½ä¼æç¤ºä½ å° `==` æ¢æ `equals()` ï¼ï¼
```java
String a = new String("ab"); // a 为ä¸ä¸ªå¼ç¨
String b = new String("ab"); // b为å¦ä¸ä¸ªå¼ç¨,对象çå
容䏿 ·
String aa = "ab"; // æ¾å¨å¸¸éæ± ä¸
String bb = "ab"; // ä»å¸¸éæ± ä¸æ¥æ¾
System.out.println(aa == bb);// true
System.out.println(a == b);// false
System.out.println(a.equals(b));// true
System.out.println(42 == 42.0);// true
```
`String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çï¼å 为 `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åï¼è `String` ç `equals` æ¹æ³æ¯è¾çæ¯å¯¹è±¡çå¼ã
å½å建 `String` ç±»åç对象æ¶ï¼èææºä¼å¨å¸¸éæ± ä¸æ¥æ¾ææ²¡æå·²ç»åå¨çå¼åè¦å建çå¼ç¸åç对象ï¼å¦ææå°±æå®èµç»å½åå¼ç¨ãå¦ææ²¡æå°±å¨å¸¸éæ± ä¸éæ°å建ä¸ä¸ª `String` 对象ã
`String`ç±»`equals()`æ¹æ³ï¼
```java
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
```
### hashCode() æä»ä¹ç¨ï¼
`hashCode()` çä½ç¨æ¯è·ååå¸ç ï¼`int` æ´æ°ï¼ï¼ä¹ç§°ä¸ºæ£åç ãè¿ä¸ªåå¸ç çä½ç¨æ¯ç¡®å®è¯¥å¯¹è±¡å¨åå¸è¡¨ä¸çç´¢å¼ä½ç½®ã

`hashCode()` å®ä¹å¨ JDK ç `Object` ç±»ä¸ï¼è¿å°±æå³ç Java ä¸çä»»ä½ç±»é½å
嫿 `hashCode()` 彿°ãå¦å¤éè¦æ³¨æçæ¯ï¼`Object` ç `hashCode()` æ¹æ³æ¯æ¬å°æ¹æ³ï¼ä¹å°±æ¯ç¨ C è¯è¨æ C++ å®ç°çã
> â ï¸ æ³¨æï¼è¯¥æ¹æ³å¨ **Oracle OpenJDK8** ä¸é»è®¤æ¯ "使ç¨çº¿ç¨å±é¨ç¶ææ¥å®ç° Marsaglia's xor-shift éæºæ°çæ", 并䏿¯ "å°å" æè
"å°å转æ¢èæ¥", ä¸å JDK/VM å¯è½ä¸åãå¨ **Oracle OpenJDK8** 䏿å
ç§çææ¹å¼ (å
¶ä¸ç¬¬äºç§æ¯è¿åå°å), éè¿æ·»å VM åæ°: -XX:hashCode=4 å¯ç¨ç¬¬äºç§ãåèæºç :
>
> -