---
title: Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)
category: Java
description: Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»ï¼å
å«Javaè¯è¨ç¹ç¹ãJVM/JDK/JREåºå«ãåèç 详解ãåºæ¬æ°æ®ç±»åãèªå¨è£
ç®±æç®±ãæ¹æ³éè½½ä¸éåçæ ¸å¿ç¥è¯ç¹ï¼å©åJavaå¼åè
é¢è¯éå
³ã
tag:
- Javaåºç¡
head:
- - meta
- name: keywords
content: Javaåºç¡,JVM,JDK,JRE,Java SE,åèç ,Javaç¼è¯,èªå¨è£
ç®±,åºæ¬æ°æ®ç±»å,æ¹æ³éè½½,Javaé¢è¯é¢
---
## åºç¡æ¦å¿µä¸å¸¸è¯
### Java è¯è¨æåªäºç¹ç¹?
1. ç®åæå¦ï¼è¯æ³ç®åï¼ä¸æå®¹æï¼ï¼
2. é¢å对象ï¼å°è£
ï¼ç»§æ¿ï¼å¤æï¼ï¼
3. 平尿 å
³æ§ï¼Java èææºå®ç°å¹³å°æ å
³æ§ï¼ï¼
4. æ¯æå¤çº¿ç¨ï¼C++ è¯è¨æ²¡æå
ç½®çå¤çº¿ç¨æºå¶ï¼å æ¤å¿
é¡»è°ç¨æä½ç³»ç»çå¤çº¿ç¨åè½æ¥è¿è¡å¤çº¿ç¨ç¨åºè®¾è®¡ï¼è Java è¯è¨å´æä¾äºå¤çº¿ç¨æ¯æï¼ï¼
5. å¯é æ§ï¼å
·å¤å¼å¸¸å¤çåèªå¨å
åç®¡çæºå¶ï¼ï¼
6. å®å
¨æ§ï¼Java è¯è¨æ¬èº«ç设计就æä¾äºå¤éå®å
¨é²æ¤æºå¶å¦è®¿é®æé修饰符ãéå¶ç¨åºç´æ¥è®¿é®æä½ç³»ç»èµæºï¼ï¼
7. 髿æ§ï¼éè¿ Just In Time ç¼è¯å¨çææ¯çä¼åï¼Java è¯è¨çè¿è¡æçè¿æ¯é常ä¸éçï¼ï¼
8. æ¯æç½ç»ç¼ç¨å¹¶ä¸å¾æ¹ä¾¿ï¼
9. ç¼è¯ä¸è§£éå¹¶åï¼
10. â¦â¦
> **ð ä¿®æ£ï¼åè§ï¼[issue#544](https://github.com/Snailclimb/JavaGuide/issues/544)ï¼**ï¼C++11 å¼å§ï¼2011 å¹´çæ¶åï¼ï¼C++ å°±å¼å
¥äºå¤çº¿ç¨åºï¼å¨ WindowsãLinuxãmacOS é½å¯ä»¥ä½¿ç¨`std::thread`å`std::async`æ¥å建线ç¨ãåè龿¥ï¼
ð æå±ä¸ä¸ï¼
âWrite Once, Run Anywhereï¼ä¸æ¬¡ç¼åï¼éå¤è¿è¡ï¼âè¿å¥å®£ä¼ å£å·ï¼çå¿ç»å
¸ï¼æµä¼ äºå¥½å¤å¹´ï¼ä»¥è³äºï¼ç´å°ä»å¤©ï¼ä¾ç¶æå¾å¤äººè§å¾è·¨å¹³å°æ¯ Java è¯è¨æå¤§çä¼å¿ãå®é
ä¸ï¼è·¨å¹³å°å·²ç»ä¸æ¯ Java æå¤§çåç¹äºï¼åç§ JDK æ°ç¹æ§ä¹ä¸æ¯ãç®åå¸é¢ä¸èæåææ¯å·²ç»é常æçï¼æ¯å¦ä½ éè¿ Docker å°±å¾å®¹æå®ç°è·¨å¹³å°äºãå¨æçæ¥ï¼Java 强大ççæææ¯ï¼
### Java SE vs Java EE
- Java SEï¼Java Platform, Standard Editionï¼: Java 平尿 åçï¼Java ç¼ç¨è¯è¨çåºç¡ï¼å®å
å«äºæ¯æ Java åºç¨ç¨åºå¼ååè¿è¡çæ ¸å¿ç±»åºä»¥åèææºçæ ¸å¿ç»ä»¶ãJava SE å¯ä»¥ç¨äºæå»ºæ¡é¢åºç¨ç¨åºæç®åçæå¡å¨åºç¨ç¨åºã
- Java EEï¼Java Platform, Enterprise Editionï¼ï¼Java å¹³å°ä¼ä¸çï¼å»ºç«å¨ Java SE çåºç¡ä¸ï¼å
å«äºæ¯æä¼ä¸çº§åºç¨ç¨åºå¼ååé¨ç½²çæ ååè§èï¼æ¯å¦ ServletãJSPãEJBãJDBCãJPAãJTAãJavaMailãJMSï¼ã Java EE å¯ä»¥ç¨äºæå»ºåå¸å¼ãå¯ç§»æ¤ãå¥å£®ãå¯ä¼¸ç¼©åå®å
¨çæå¡ç«¯ Java åºç¨ç¨åºï¼ä¾å¦ Web åºç¨ç¨åºã
ç®åæ¥è¯´ï¼Java SE æ¯ Java çåºç¡çæ¬ï¼Java EE æ¯ Java çé«çº§çæ¬ãJava SE æ´éåå¼åæ¡é¢åºç¨ç¨åºæç®åçæå¡å¨åºç¨ç¨åºï¼Java EE æ´éåå¼å夿çä¼ä¸çº§åºç¨ç¨åºæ Web åºç¨ç¨åºã
é¤äº Java SE å Java EEï¼è¿æä¸ä¸ª Java MEï¼Java Platformï¼Micro Editionï¼ãJava ME æ¯ Java çå¾®åçæ¬ï¼ä¸»è¦ç¨äºå¼ååµå
¥å¼æ¶è´¹çµå设å¤çåºç¨ç¨åºï¼ä¾å¦ææºãPDAãæºé¡¶çãå°ç®±ã空è°çãJava ME æ ééç¹å
³æ³¨ï¼ç¥éæè¿ä¸ªä¸è¥¿å°±å¥½äºï¼ç°å¨å·²ç»ç¨ä¸ä¸äºã
### âï¸JVM vs JDK vs JRE
#### JVM
Java èææºï¼Java Virtual Machine, JVMï¼æ¯è¿è¡ Java åèç çèææºãJVM æé对ä¸åç³»ç»çç¹å®å®ç°ï¼Windowsï¼Linuxï¼macOSï¼ï¼ç®çæ¯ä½¿ç¨ç¸åçåèç ï¼å®ä»¬é½ä¼ç»åºç¸åçç»æãåèç åä¸åç³»ç»ç JVM å®ç°æ¯ Java è¯è¨â䏿¬¡ç¼è¯ï¼éå¤å¯ä»¥è¿è¡âçå
³é®æå¨ã
å¦ä¸å¾æç¤ºï¼ä¸åç¼ç¨è¯è¨ï¼JavaãGroovyãKotlinãJRubyãClojure ...ï¼éè¿åèªçç¼è¯å¨ç¼è¯æ `.class` æä»¶ï¼å¹¶æç»éè¿ JVM å¨ä¸åå¹³å°ï¼WindowsãMacãLinuxï¼ä¸è¿è¡ã

**JVM 并䏿¯åªæä¸ç§ï¼åªè¦æ»¡è¶³ JVM è§èï¼æ¯ä¸ªå
¬å¸ãç»ç»æè
个人é½å¯ä»¥å¼åèªå·±çä¸å± JVMã** ä¹å°±æ¯è¯´æä»¬å¹³æ¶æ¥è§¦å°ç HotSpot VM ä»
ä»
æ¯æ¯ JVM è§èçä¸ç§å®ç°èå·²ã
é¤äºæä»¬å¹³æ¶æå¸¸ç¨ç HotSpot VM å¤ï¼è¿æ J9 VMãZing VMãJRockit VM ç JVM ãç»´åºç¾ç§ä¸å°±æå¸¸è§ JVM ç对æ¯ï¼[Comparison of Java virtual machines](https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines) ï¼æå
´è¶£çå¯ä»¥å»ççãå¹¶ä¸ï¼ä½ å¯ä»¥å¨ [Java SE Specifications](https://docs.oracle.com/javase/specs/index.html) 䏿¾å°åä¸ªçæ¬ç JDK 对åºç JVM è§èã

#### JDK å JRE
JDKï¼Java Development Kitï¼æ¯ä¸ä¸ªåè½é½å
¨ç Java å¼åå·¥å
·å
ï¼ä¾å¼åè
使ç¨ï¼ç¨äºå建åç¼è¯ Java ç¨åºãå®å
å«äº JREï¼Java Runtime Environmentï¼ï¼ä»¥åç¼è¯å¨ javac åå
¶ä»å·¥å
·ï¼å¦ javadocï¼ææ¡£çæå¨ï¼ãjdbï¼è°è¯å¨ï¼ãjconsoleï¼çæ§å·¥å
·ï¼ãjavapï¼åç¼è¯å·¥å
·ï¼çã
JRE æ¯è¿è¡å·²ç¼è¯ Java ç¨åºæéçç¯å¢ï¼ä¸»è¦å
å«ä»¥ä¸ä¸¤ä¸ªé¨åï¼
1. **JVM** : ä¹å°±æ¯æä»¬ä¸é¢æå°ç Java èææºã
2. **Java åºç¡ç±»åºï¼Class Libraryï¼**ï¼ä¸ç»æ åçç±»åºï¼æä¾å¸¸ç¨çåè½å APIï¼å¦ I/O æä½ãç½ç»éä¿¡ãæ°æ®ç»æçï¼ã
ç®åæ¥è¯´ï¼JRE åªå
å«è¿è¡ Java ç¨åºæéçç¯å¢åç±»åºï¼è JDK ä¸ä»
å
å« JREï¼è¿å
æ¬ç¨äºå¼ååè°è¯ Java ç¨åºçå·¥å
·ã
妿éè¦ç¼åãç¼è¯ Java ç¨åºæä½¿ç¨ Java API ææ¡£ï¼å°±éè¦å®è£
JDKãæäºéè¦ Java ç¹æ§çåºç¨ç¨åºï¼å¦ JSP 转æ¢ä¸º Servlet æä½¿ç¨åå°ï¼ä¹å¯è½éè¦ JDK æ¥ç¼è¯åè¿è¡ Java 代ç ãå æ¤ï¼å³ä½¿ä¸è¿è¡ Java å¼åå·¥ä½ï¼ææ¶ä¹å¯è½éè¦å®è£
JDKã
ä¸å¾æ¸
æ°å±ç¤ºäº JDKãJRE å JVM çå
³ç³»ã

ä¸è¿ï¼ä» JDK 9 å¼å§ï¼å°±ä¸éè¦åºå JDK å JRE çå
³ç³»äºï¼åè代ä¹çæ¯æ¨¡åç³»ç»ï¼JDK è¢«éæ°ç»ç»æ 94 个模åï¼+ [jlink](http://openjdk.java.net/jeps/282) å·¥å
· (é Java 9 ä¸èµ·åå¸çæ°å½ä»¤è¡å·¥å
·ï¼ç¨äºçæèªå®ä¹ Java è¿è¡æ¶æ åï¼è¯¥æ åä»
å
å«ç»å®åºç¨ç¨åºæéçæ¨¡å) ãå¹¶ä¸ï¼ä» JDK 11 å¼å§ï¼Oracle ä¸åæä¾åç¬ç JRE ä¸è½½ã
å¨ [Java 9 æ°ç¹æ§æ¦è§](https://javaguide.cn/java/new-features/java9.html)è¿ç¯æç« ä¸ï¼æå¨ä»ç»æ¨¡ååç³»ç»çæ¶åæå°ï¼
> å¨å¼å
¥äºæ¨¡åç³»ç»ä¹åï¼JDK è¢«éæ°ç»ç»æ 94 个模åãJava åºç¨å¯ä»¥éè¿æ°å¢ç jlink å·¥å
·ï¼å建åºåªå
嫿ä¾èµç JDK 模åçèªå®ä¹è¿è¡æ¶éåãè¿æ ·å¯ä»¥æå¤§çåå° Java è¿è¡æ¶ç¯å¢ç大å°ã
ä¹å°±æ¯è¯´ï¼å¯ä»¥ç¨ jlink æ ¹æ®èªå·±çéæ±ï¼å建ä¸ä¸ªæ´å°ç runtimeï¼è¿è¡æ¶ï¼ï¼è䏿¯ä¸ç®¡ä»ä¹åºç¨ï¼é½æ¯åæ ·ç JREã
å®å¶çãæ¨¡ååç Java è¿è¡æ¶æ åæå©äºç®å Java åºç¨çé¨ç½²åèçå
åå¹¶å¢å¼ºå®å
¨æ§åå¯ç»´æ¤æ§ãè¿å¯¹äºæ»¡è¶³ç°ä»£åºç¨ç¨åºæ¶æçéæ±ï¼å¦èæåã容å¨åãå¾®æå¡åäºåçå¼åï¼æ¯é常éè¦çã
### âï¸ä»ä¹æ¯åèç ?éç¨åèç ç好夿¯ä»ä¹?
å¨ Java ä¸ï¼JVM å¯ä»¥çè§£ç代ç å°±å«ååèç ï¼å³æ©å±å为 `.class` çæä»¶ï¼ï¼å®ä¸é¢åä»»ä½ç¹å®çå¤çå¨ï¼åªé¢åèææºãJava è¯è¨éè¿åèç çæ¹å¼ï¼å¨ä¸å®ç¨åº¦ä¸è§£å³äºä¼ ç»è§£éåè¯è¨æ§è¡æçä½çé®é¢ï¼åæ¶åä¿çäºè§£éåè¯è¨å¯ç§»æ¤çç¹ç¹ãæä»¥ï¼ Java ç¨åºè¿è¡æ¶ç¸å¯¹æ¥è¯´è¿æ¯é«æçï¼ä¸è¿ï¼å Cã C++ï¼Rustï¼Go çè¯è¨è¿æ¯æä¸å®å·®è·çï¼ï¼èä¸ï¼ç±äºåèç å¹¶ä¸é对ä¸ç§ç¹å®çæºå¨ï¼å æ¤ï¼Java ç¨åºæ 须鿰ç¼è¯ä¾¿å¯å¨å¤ç§ä¸åæä½ç³»ç»çè®¡ç®æºä¸è¿è¡ã
**Java ç¨åºä»æºä»£ç å°è¿è¡çè¿ç¨å¦ä¸å¾æç¤º**ï¼

æä»¬éè¦æ ¼å¤æ³¨æçæ¯ `.class->æºå¨ç ` è¿ä¸æ¥ãå¨è¿ä¸æ¥ JVM ç±»å è½½å¨é¦å
å è½½åèç æä»¶ï¼ç¶åéè¿è§£éå¨éè¡è§£éæ§è¡ï¼è¿ç§æ¹å¼çæ§è¡é度ä¼ç¸å¯¹æ¯è¾æ
¢ãèä¸ï¼æäºæ¹æ³å代ç 忝ç»å¸¸éè¦è¢«è°ç¨ç(ä¹å°±æ¯æè°ççç¹ä»£ç )ï¼æä»¥åé¢å¼è¿äº **JITï¼Just in Time Compilationï¼** ç¼è¯å¨ï¼è JIT å±äºè¿è¡æ¶ç¼è¯ãå½ JIT ç¼è¯å¨å®æç¬¬ä¸æ¬¡ç¼è¯åï¼å
¶ä¼å°åèç 对åºçæºå¨ç ä¿å䏿¥ï¼ä¸æ¬¡å¯ä»¥ç´æ¥ä½¿ç¨ãèæä»¬ç¥éï¼æºå¨ç çè¿è¡æçè¯å®æ¯é«äº Java è§£éå¨çãè¿ä¹è§£éäºæä»¬ä¸ºä»ä¹ç»å¸¸ä¼è¯´ **Java æ¯ç¼è¯ä¸è§£éå
±åçè¯è¨** ã
> ð æå±é
读ï¼
>
> - [åºæ¬å | Java 峿¶ç¼è¯å¨åçè§£æåå®è·µ - ç¾å¢ææ¯å¢é](https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html)
> - [åºäºéæç¼è¯æå»ºå¾®æå¡åºç¨ - é¿éå·´å·´ä¸é´ä»¶](https://mp.weixin.qq.com/s/4haTyXUmh8m-dBQaEzwDJw)

> HotSpot éç¨äºæ°æ§è¯ä¼°(Lazy Evaluation)çåæ³ï¼æ ¹æ®äºå
«å®å¾ï¼æ¶è大é¨åç³»ç»èµæºçåªæé£ä¸å°é¨åç代ç ï¼çç¹ä»£ç ï¼ï¼èè¿ä¹å°±æ¯ JIT æéè¦ç¼è¯çé¨åãJVM 伿 ¹æ®ä»£ç æ¯æ¬¡è¢«æ§è¡çæ
嵿¶éä¿¡æ¯å¹¶ç¸åºå°ååºä¸äºä¼åï¼å æ¤æ§è¡ç次æ°è¶å¤ï¼å®çé度就è¶å¿«ã
JDKãJREãJVMãJIT è¿åè
çå
³ç³»å¦ä¸å¾æç¤ºã

ä¸é¢è¿å¼ 徿¯ JVM ç大è´ç»ææ¨¡åã

### âï¸ä¸ºä»ä¹è¯´ Java è¯è¨âç¼è¯ä¸è§£éå¹¶åâï¼
å
¶å®è¿ä¸ªé®é¢æä»¬è®²åèç çæ¶åå·²ç»æå°è¿ï¼å 为æ¯è¾éè¦ï¼æä»¥æä»¬è¿éåæä¸ä¸ã
æä»¬å¯ä»¥å°é«çº§ç¼ç¨è¯è¨æç
§ç¨åºçæ§è¡æ¹å¼å为两ç§ï¼
- **ç¼è¯å**ï¼[ç¼è¯åè¯è¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E8%AA%9E%E8%A8%80) ä¼éè¿[ç¼è¯å¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E5%99%A8)å°æºä»£ç 䏿¬¡æ§ç¿»è¯æå¯è¢«è¯¥å¹³å°æ§è¡çæºå¨ç ãä¸è¬æ
åµä¸ï¼ç¼è¯è¯è¨çæ§è¡é度æ¯è¾å¿«ï¼å¼åæçæ¯è¾ä½ã常è§çç¼è¯æ§è¯è¨æ CãC++ãGoãRust ççã
- **è§£éå**ï¼[è§£éåè¯è¨](https://zh.wikipedia.org/wiki/%E7%9B%B4%E8%AD%AF%E8%AA%9E%E8%A8%80)ä¼éè¿[è§£éå¨](https://zh.wikipedia.org/wiki/ç´è¯å¨)ä¸å¥ä¸å¥çå°ä»£ç è§£éï¼interpretï¼ä¸ºæºå¨ä»£ç ååæ§è¡ãè§£éåè¯è¨å¼åæçæ¯è¾å¿«ï¼æ§è¡é度æ¯è¾æ
¢ã常è§çè§£éæ§è¯è¨æ PythonãJavaScriptãPHP ççã

æ ¹æ®ç»´åºç¾ç§ä»ç»ï¼
> ä¸ºäºæ¹åè§£éè¯è¨çæçèåå±åºç[峿¶ç¼è¯](https://zh.wikipedia.org/wiki/å³æç·¨è¯)ææ¯ï¼å·²ç»ç¼©å°äºè¿ä¸¤ç§è¯è¨é´çå·®è·ãè¿ç§ææ¯æ··åäºç¼è¯è¯è¨ä¸è§£éåè¯è¨çä¼ç¹ï¼å®åç¼è¯è¯è¨ä¸æ ·ï¼å
æç¨åºæºä»£ç ç¼è¯æ[åèç ](https://zh.wikipedia.org/wiki/åèç )ãå°æ§è¡ææ¶ï¼åå°åèç ç´è¯ï¼ä¹åæ§è¡ã[Java](https://zh.wikipedia.org/wiki/Java)ä¸[LLVM](https://zh.wikipedia.org/wiki/LLVM)æ¯è¿ç§ææ¯ç代表产ç©ã
>
> ç¸å
³é
读ï¼[åºæ¬å | Java 峿¶ç¼è¯å¨åçè§£æåå®è·µ](https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html)
**为ä»ä¹è¯´ Java è¯è¨âç¼è¯ä¸è§£éå¹¶åâï¼**
è¿æ¯å 为 Java è¯è¨æ¢å
·æç¼è¯åè¯è¨çç¹å¾ï¼ä¹å
·æè§£éåè¯è¨çç¹å¾ãå 为 Java ç¨åºè¦ç»è¿å
ç¼è¯ï¼åè§£é两个æ¥éª¤ï¼ç± Java ç¼åçç¨åºéè¦å
ç»è¿ç¼è¯æ¥éª¤ï¼çæåèç ï¼`.class` æä»¶ï¼ï¼è¿ç§åèç å¿
é¡»ç± Java è§£é卿¥è§£éæ§è¡ã
### AOT æä»ä¹ä¼ç¹ï¼ä¸ºä»ä¹ä¸å
¨é¨ä½¿ç¨ AOT å¢ï¼
JDK 9 å¼å
¥äºä¸ç§æ°çç¼è¯æ¨¡å¼ **AOT(Ahead of Time Compilation)** ãå JIT ä¸åçæ¯ï¼è¿ç§ç¼è¯æ¨¡å¼ä¼å¨ç¨åºè¢«æ§è¡åå°±å°å
¶ç¼è¯ææºå¨ç ï¼å±äºéæç¼è¯ï¼Cã C++ï¼Rustï¼Go çè¯è¨å°±æ¯éæç¼è¯ï¼ãAOT é¿å
äº JIT é¢ççåæ¹é¢çå¼éï¼å¯ä»¥æé« Java ç¨åºçå¯å¨é度ï¼é¿å
é¢çæ¶é´é¿ãå¹¶ä¸ï¼AOT è¿è½åå°å
åå ç¨åå¢å¼º Java ç¨åºçå®å
¨æ§ï¼AOT ç¼è¯åç代ç ä¸å®¹æè¢«åç¼è¯åä¿®æ¹ï¼ï¼ç¹å«éåäºåçåºæ¯ã
**JIT ä¸ AOT 两è
çå
³é®ææ 对æ¯**ï¼
| 对æ¯ç»´åº¦ | JITï¼å³æ¶ç¼è¯ï¼ | AOTï¼æåç¼è¯ï¼ |
| ---------------- | ------------------ | ---------------------------- |
| **ç¼è¯æ¶æº** | è¿è¡æ¶ç¼è¯ | è¿è¡åç¼è¯ |
| **å¯å¨é度** | è¾æ
¢ï¼éè¦é¢çï¼ | å¿«ï¼æ éé¢çï¼ |
| **峰弿§è½** | æ´é«ï¼è¿è¡æ¶ä¼åï¼ | è¾ä½ï¼ç¼ºå°è¿è¡æ¶ä¿¡æ¯ï¼ |
| **å
åå ç¨** | è¾é« | è¾ä½ |
| **æå
ä½ç§¯** | è¾å° | è¾å¤§ï¼å
嫿ºå¨ç ï¼ |
| **å¨æç¹æ§æ¯æ** | å®å
¨æ¯æ | åéï¼åå°ã卿代ççï¼ |
| **éç¨åºæ¯** | é¿æ¶é´è¿è¡çæå¡ | äºåçãServerlessãCLI å·¥å
· |
å¯ä»¥çåºï¼**AOT ç主è¦ä¼å¿å¨äºå¯å¨æ¶é´ãå
åå ç¨åæå
ä½ç§¯**ã**JIT ç主è¦ä¼å¿å¨äºå
·å¤æ´é«çæéå¤çè½å**ï¼å¯ä»¥éä½è¯·æ±çæå¤§å»¶è¿ã
æå° AOT å°±ä¸å¾ä¸æ [GraalVM](https://www.graalvm.org/) äºï¼GraalVM æ¯ä¸ç§é«æ§è½ç JDKï¼å®æ´ç JDK åè¡çæ¬ï¼ï¼å®å¯ä»¥è¿è¡ Java åå
¶ä» JVM è¯è¨ï¼ä»¥å JavaScriptãPython çé JVM è¯è¨ã GraalVM ä¸ä»
è½æä¾ AOT ç¼è¯ï¼è¿è½æä¾ JIT ç¼è¯ãæå
´è¶£çåå¦ï¼å¯ä»¥å»çç GraalVM ç宿¹ææ¡£ï¼ã妿è§å¾å®æ¹ææ¡£ççæ¯è¾é¾çè§£çè¯ï¼ä¹å¯ä»¥æ¾ä¸äºæç« æ¥ççï¼æ¯å¦ï¼
- [åºäºéæç¼è¯æå»ºå¾®æå¡åºç¨](https://mp.weixin.qq.com/s/4haTyXUmh8m-dBQaEzwDJw)
- [èµ°å Native åï¼Spring&Dubbo AOT ææ¯ç¤ºä¾ä¸åç讲解](https://cn.dubbo.apache.org/zh-cn/blog/2023/06/28/%e8%b5%b0%e5%90%91-native-%e5%8c%96springdubbo-aot-%e6%8a%80%e6%9c%af%e7%a4%ba%e4%be%8b%e4%b8%8e%e5%8e%9f%e7%90%86%e8%ae%b2%e8%a7%a3/)
**æ¢ç¶ AOT è¿ä¹å¤ä¼ç¹ï¼é£ä¸ºä»ä¹ä¸å
¨é¨ä½¿ç¨è¿ç§ç¼è¯æ¹å¼å¢ï¼**
æä»¬åé¢ä¹å¯¹æ¯è¿ JIT ä¸ AOTï¼ä¸¤è
åæä¼ç¹ï¼åªè½è¯´ AOT æ´éåå½ä¸çäºåçåºæ¯ï¼å¯¹å¾®æå¡æ¶æçæ¯æä¹æ¯è¾å好ã餿¤ä¹å¤ï¼AOT ç¼è¯æ æ³æ¯æ Java çä¸äºå¨æç¹æ§ï¼å¦åå°ã卿代çã卿å è½½ãJNIï¼Java Native Interfaceï¼çãç¶èï¼å¾å¤æ¡æ¶ååºï¼å¦ SpringãCGLIBï¼é½ç¨å°äºè¿äºç¹æ§ã妿åªä½¿ç¨ AOT ç¼è¯ï¼é£å°±æ²¡åæ³ä½¿ç¨è¿äºæ¡æ¶ååºäºï¼æè
说éè¦é对æ§å°å»åéé
åä¼åã举个ä¾åï¼CGLIB 卿代ç使ç¨çæ¯ ASM ææ¯ï¼èè¿ç§ææ¯å¤§è´åçæ¯è¿è¡æ¶ç´æ¥å¨å
åä¸çæå¹¶å 载修æ¹åçåèç æä»¶ä¹å°±æ¯ `.class` æä»¶ï¼å¦æå
¨é¨ä½¿ç¨ AOT æåç¼è¯ï¼ä¹å°±ä¸è½ä½¿ç¨ ASM ææ¯äºãä¸ºäºæ¯æç±»ä¼¼çå¨æç¹æ§ï¼æä»¥éæ©ä½¿ç¨ JIT 峿¶ç¼è¯å¨ã
### Oracle JDK vs OpenJDK
å¯è½å¨çè¿ä¸ªé®é¢ä¹åå¾å¤äººåæä¸æ ·å¹¶æ²¡ææ¥è§¦å使ç¨è¿ OpenJDK ãé£ä¹ Oracle JDK å OpenJDK ä¹é´æ¯å¦åå¨é大差å¼ï¼ä¸é¢æéè¿æ¶éå°çä¸äºèµæï¼ä¸ºä½ è§£çè¿ä¸ªè¢«å¾å¤äººå¿½è§çé®é¢ã
é¦å
ï¼2006 å¹´ SUN å
¬å¸å° Java 弿ºï¼ä¹å°±æäº OpenJDKã2009 å¹´ Oracle æ¶è´äº Sun å
¬å¸ï¼äºæ¯èªå·±å¨ OpenJDK çåºç¡ä¸æäºä¸ä¸ª Oracle JDKãOracle JDK æ¯ä¸å¼æºçï¼å¹¶ä¸åå¼å§çå ä¸ªçæ¬ï¼Java8 ~ Java11ï¼è¿ä¼ç¸æ¯äº OpenJDK æ·»å ä¸äºç¹æçåè½åå·¥å
·ã
å
¶æ¬¡ï¼å¯¹äº Java 7 èè¨ï¼OpenJDK å Oracle JDK æ¯å忥è¿çã Oracle JDK æ¯åºäº OpenJDK 7 æå»ºçï¼åªæ·»å äºä¸äºå°åè½ï¼ç± Oracle å·¥ç¨å¸åä¸ç»´æ¤ã
ä¸é¢è¿æ®µè¯æèª Oracle 宿¹å¨ 2012 å¹´å表çä¸ä¸ªå客ï¼
> é®ï¼OpenJDK åå¨åºä¸çæºä»£ç ä¸ç¨äºæå»º Oracle JDK ç代ç ä¹é´æä»ä¹åºå«ï¼
>
> çï¼é常æ¥è¿ - æä»¬ç Oracle JDK çæ¬æå»ºè¿ç¨åºäº OpenJDK 7 æå»ºï¼åªæ·»å äºå 个é¨åï¼ä¾å¦é¨ç½²ä»£ç ï¼å
¶ä¸å
æ¬ Oracle ç Java æä»¶å Java WebStart çå®ç°ï¼ä»¥åä¸äºéæºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦å¾å½¢å
æ
åå¨ï¼ä¸äºå¼æºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦ Rhinoï¼ä»¥åä¸äºé¶ç¢çä¸è¥¿ï¼å¦éå ææ¡£æç¬¬ä¸æ¹åä½ãå±ææªæ¥ï¼æä»¬çç®çæ¯å¼æº Oracle JDK çææé¨åï¼é¤äºæä»¬èèåä¸åè½çé¨åã
æåï¼ç®åæ»ç»ä¸ä¸ Oracle JDK å OpenJDK çåºå«ï¼
1. **æ¯å¦å¼æº**ï¼OpenJDK æ¯ä¸ä¸ªåèæ¨¡å并䏿¯å®å
¨å¼æºçï¼è Oracle JDK æ¯åºäº OpenJDK å®ç°çï¼å¹¶ä¸æ¯å®å
¨å¼æºçï¼ä¸ªäººè§ç¹ï¼ä¼æå¨ç¥ï¼JDK åæ¥æ¯ SUN å
¬å¸å¼åçï¼åæ¥ SUN å
¬å¸ååç»äº Oracle å
¬å¸ï¼Oracle å
¬å¸ä»¥ Oracle æ°æ®åºèèåï¼è Oracle æ°æ®åºåæ¯éæºçï¼è¿ä¸ªæ¶å Oracle å
¬å¸å°±ä¸æ³å®å
¨å¼æºäºï¼ä½æ¯åæ¥ç SUN å
¬å¸åæ JDK ç»å¼æºäºï¼å¦æè¿ä¸ªæ¶å Oracle æ¶è´åæ¥ä¹åå°±æä»ç»éæºï¼å¿
ç¶ä¼å¼èµ·å¾å¤ Java å¼åè
ç䏿»¡ï¼å¯¼è´å¤§å®¶å¯¹ Java 失å»ä¿¡å¿ï¼é£ Oracle å
¬å¸æ¶è´åæ¥ä¸å°±æ Java ç卿éäºåï¼ç¶åï¼Oracle å
¬å¸å°±æ³äºä¸ªéªæä½ï¼è¿æ ·å§ï¼ææä¸é¨åæ ¸å¿ä»£ç 弿ºåºæ¥ç»ä½ 们ç©ï¼å¹¶ä¸æè¦åä½ ä»¬èªå·±æç JDK åºåä¸ï¼ä½ ä»¬å« OpenJDKï¼æå« Oracle JDKï¼æå叿çï¼ä½ 们继ç»ç©ä½ 们çï¼è¦æ¯ä½ 们æåºæ¥ä»ä¹å¥½ç©çä¸è¥¿ï¼æåç»åå¸ Oracle JDK ä¹ä¼æ¿æ¥ç¨ä¸ä¸ï¼ä¸ä¸¾ä¸¤å¾ï¼ï¼OpenJDK 弿ºé¡¹ç®ï¼[https://github.com/openjdk/jdk](https://github.com/openjdk/jdk) ã
2. **æ¯å¦å
è´¹**ï¼Oracle JDK 伿ä¾å
è´¹çæ¬ï¼ä½ä¸è¬ææ¶é´éå¶ãJDK17 ä¹åççæ¬å¯ä»¥å
è´¹ååååç¨ï¼ä½æ¯ä»
æ 3 å¹´æ¶é´ï¼3 å¹´åæ æ³å
è´¹åç¨ãä¸è¿ï¼JDK8u221 ä¹ååªè¦ä¸å级å¯ä»¥æ éæå
è´¹ãOpenJDK æ¯å®å
¨å
è´¹çã
3. **åè½æ§**ï¼Oracle JDK å¨ OpenJDK çåºç¡ä¸æ·»å äºä¸äºç¹æçåè½åå·¥å
·ï¼æ¯å¦ Java Flight Recorderï¼JFRï¼ä¸ç§çæ§å·¥å
·ï¼ãJava Mission Controlï¼JMCï¼ä¸ç§çæ§å·¥å
·ï¼çå·¥å
·ãä¸è¿ï¼å¨ Java 11 ä¹åï¼OracleJDK å OpenJDK çåè½åºæ¬ä¸è´ï¼ä¹å OracleJDK ä¸çç§æç»ä»¶å¤§å¤æ°ä¹å·²ç»è¢«æèµ ç»å¼æºç»ç»ã
4. **ç¨³å®æ§**ï¼OpenJDK ä¸æä¾ LTS æå¡ï¼è OracleJDK å¤§æ¦æ¯ä¸å¹´é½ä¼æ¨åºä¸ä¸ª LTS çè¿è¡é¿ææ¯æãä¸è¿ï¼å¾å¤å
¬å¸é½åºäº OpenJDK æä¾äºå¯¹åºçå OracleJDK 卿ç¸åç LTS çãå æ¤ï¼ä¸¤è
ç¨³å®æ§å
¶å®ä¹æ¯å·®ä¸å¤çã
5. **åè®®**ï¼Oracle JDK ä½¿ç¨ BCL/OTN åè®®è·å¾è®¸å¯ï¼è OpenJDK æ ¹æ® GPL v2 许å¯è·å¾è®¸å¯ã
> æ¢ç¶ Oracle JDK è¿ä¹å¥½ï¼é£ä¸ºä»ä¹è¿è¦æ OpenJDKï¼
>
> çï¼
>
> 1. OpenJDK æ¯å¼æºçï¼å¼æºæå³çä½ å¯ä»¥å¯¹å®æ ¹æ®ä½ èªå·±çéè¦è¿è¡ä¿®æ¹ãä¼åï¼æ¯å¦ Alibaba åºäº OpenJDK å¼åäº Dragonwell8ï¼[https://github.com/alibaba/dragonwell8](https://github.com/alibaba/dragonwell8)
> 2. OpenJDK æ¯åä¸å
è´¹çï¼è¿ä¹æ¯ä¸ºä»ä¹éè¿ yum å
管çå¨ä¸é»è®¤å®è£
ç JDK æ¯ OpenJDK è䏿¯ Oracle JDKï¼ãè½ç¶ Oracle JDK 乿¯åä¸å
è´¹ï¼æ¯å¦ JDK 8ï¼ï¼ä½å¹¶ä¸æ¯ææçæ¬é½æ¯å
è´¹çã
> 3. OpenJDK æ´æ°é¢çæ´å¿«ãOracle JDK ä¸è¬æ¯æ¯ 6 个æåå¸ä¸ä¸ªæ°çæ¬ï¼è OpenJDK ä¸è¬æ¯æ¯ 3 个æåå¸ä¸ä¸ªæ°çæ¬ãï¼ç°å¨ä½ ç¥éä¸ºå¥ Oracle JDK æ´ç¨³å®äºå§ï¼å
å¨ OpenJDK è¯è¯æ°´ï¼æå¤§é¨åé®é¢é½è§£å³æäºæå¨ Oracle JDK ä¸åå¸ï¼
>
> åºäºä»¥ä¸è¿äºåå ï¼OpenJDK è¿æ¯æåå¨çå¿
è¦çï¼

**Oracle JDK å OpenJDK å¦ä½éæ©ï¼**
å»ºè®®éæ© OpenJDK æè
åºäº OpenJDK çåè¡çï¼æ¯å¦ AWS ç Amazon Correttoï¼é¿éå·´å·´ç Alibaba Dragonwellã
ð æå±ä¸ä¸ï¼
- BCL åè®®ï¼Oracle Binary Code License Agreementï¼ï¼å¯ä»¥ä½¿ç¨ JDKï¼æ¯æåç¨ï¼ï¼ä½æ¯ä¸è½è¿è¡ä¿®æ¹ã
- OTN åè®®ï¼Oracle Technology Network License Agreementï¼ï¼11 åä¹åæ°åå¸ç JDK ç¨ç齿¯è¿ä¸ªåè®®ï¼å¯ä»¥èªå·±ç§ä¸ç¨ï¼ä½æ¯åç¨éè¦ä»è´¹ã
### Java å C++ çåºå«?
æç¥éå¾å¤äººæ²¡å¦è¿ C++ï¼ä½æ¯é¢è¯å®å°±æ¯æ²¡äºå欢æ¿å±ä»¬ Java å C++ æ¯åï¼æ²¡åæ³ï¼ï¼ï¼å°±ç®æ²¡å¦è¿ C++ï¼ä¹è¦è®°ä¸æ¥ã
è½ç¶ï¼Java å C++ 齿¯é¢å对象çè¯è¨ï¼é½æ¯æå°è£
ãç»§æ¿å夿ï¼ä½æ¯ï¼å®ä»¬è¿æ¯ææºå¤ä¸ç¸åçå°æ¹ï¼
- Java ä¸æä¾æéæ¥ç´æ¥è®¿é®å
åï¼ç¨åºå
åæ´å å®å
¨
- Java çç±»æ¯åç»§æ¿çï¼C++ æ¯æå¤éç»§æ¿ï¼è½ç¶ Java çç±»ä¸å¯ä»¥å¤ç»§æ¿ï¼ä½æ¯æ¥å£å¯ä»¥å¤ç»§æ¿ã
- Java æèªå¨å
å管çåå¾åæ¶æºå¶(GC)ï¼ä¸éè¦ç¨åºåæå¨éæ¾æ ç¨å
åã
- C ++åæ¶æ¯ææ¹æ³éè½½åæä½ç¬¦éè½½ï¼ä½æ¯ Java åªæ¯ææ¹æ³éè½½ï¼æä½ç¬¦éè½½å¢å äºå¤ææ§ï¼è¿ä¸ Java æåçè®¾è®¡ææ³ä¸ç¬¦ï¼ã
- â¦â¦
## åºæ¬è¯æ³
### 注éæåªå ç§å½¢å¼ï¼
Java ä¸ç注éæä¸ç§ï¼
1. **åè¡æ³¨é**ï¼é常ç¨äºè§£éæ¹æ³å
æåè¡ä»£ç çä½ç¨ã
2. **å¤è¡æ³¨é**ï¼é常ç¨äºè§£é䏿®µä»£ç çä½ç¨ã
3. **ææ¡£æ³¨é**ï¼é常ç¨äºçæ Java å¼åææ¡£ã
ç¨çæ¯è¾å¤çè¿æ¯åè¡æ³¨éåææ¡£æ³¨éï¼å¤è¡æ³¨éå¨å®é
å¼åä¸ä½¿ç¨çç¸å¯¹è¾å°ã

卿们ç¼å代ç çæ¶åï¼å¦æä»£ç 鿝è¾å°ï¼æä»¬èªå·±æè
å¢éå
¶ä»æåè¿å¯ä»¥å¾è½»æå°çæä»£ç ï¼ä½æ¯å½é¡¹ç®ç»æä¸æ¦å¤æèµ·æ¥ï¼æä»¬å°±éè¦ç¨å°æ³¨éäºã注éå¹¶ä¸ä¼æ§è¡(ç¼è¯å¨å¨ç¼è¯ä»£ç ä¹å伿代ç ä¸çæææ³¨éæ¹æï¼åèç ä¸ä¸ä¿ç注é)ï¼æ¯æä»¬ç¨åºååç»èªå·±ççï¼æ³¨éæ¯ä½ ç代ç 说æä¹¦ï¼è½å¤å¸®å©ç代ç ç人快éå°çæ¸
代ç ä¹é´çé»è¾å
³ç³»ãå æ¤ï¼å¨åç¨åºçæ¶åéæå 䏿³¨éæ¯ä¸ä¸ªé常好çä¹ æ¯ã
ãClean Codeãè¿æ¬ä¹¦æç¡®æåºï¼
> **代ç çæ³¨é䏿¯è¶è¯¦ç»è¶å¥½ãå®é
ä¸å¥½çä»£ç æ¬èº«å°±æ¯æ³¨éï¼æä»¬è¦å°½éè§èåç¾åèªå·±çä»£ç æ¥åå°ä¸å¿
è¦ç注éã**
>
> **è¥ç¼ç¨è¯è¨è¶³å¤æè¡¨è¾¾åï¼å°±ä¸éè¦æ³¨éï¼å°½ééè¿ä»£ç æ¥éè¿°ã**
>
> 举个ä¾åï¼
>
> 廿ä¸é¢å¤æç注éï¼åªéè¦å建ä¸ä¸ªä¸æ³¨éæè¨åä¸äºç©ç彿°å³å¯
>
> ```java
> // check to see if the employee is eligible for full benefits
> if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
> ```
>
> åºæ¿æ¢ä¸º
>
> ```java
> if (employee.isEligibleForFullBenefits())
> ```
### æ è¯ç¬¦åå
³é®åçåºå«æ¯ä»ä¹ï¼
卿们ç¼åç¨åºçæ¶åï¼éè¦å¤§éå°ä¸ºç¨åºãç±»ãåéãæ¹æ³çåååï¼äºæ¯å°±æäº **æ è¯ç¬¦** ãç®åæ¥è¯´ï¼ **æ è¯ç¬¦å°±æ¯ä¸ä¸ªåå** ã
æä¸äºæ è¯ç¬¦ï¼Java è¯è¨å·²ç»èµäºäºå
¶ç¹æ®çå«ä¹ï¼åªè½ç¨äºç¹å®çå°æ¹ï¼è¿äºç¹æ®çæ è¯ç¬¦å°±æ¯ **å
³é®å** ãç®åæ¥è¯´ï¼**å
³é®åæ¯è¢«èµäºç¹æ®å«ä¹çæ è¯ç¬¦** ãæ¯å¦ï¼å¨æä»¬çæ¥å¸¸çæ´»ä¸ï¼å¦ææä»¬æ³è¦å¼ä¸å®¶åºï¼åè¦ç»è¿ä¸ªåºèµ·ä¸ä¸ªååï¼èµ·çè¿ä¸ªâååâ就嫿 è¯ç¬¦ã使¯æä»¬åºçååä¸è½å«âè¦å¯å±âï¼å 为âè¦å¯å±âè¿ä¸ªååå·²ç»è¢«èµäºäºç¹æ®çå«ä¹ï¼èâè¦å¯å±âå°±æ¯æä»¬æ¥å¸¸çæ´»ä¸çå
³é®åã
### Java è¯è¨å
³é®åæåªäºï¼
| åç±» | å
³é®å | | | | | | |
| :------------------- | -------- | ---------- | -------- | ------------ | ---------- | --------- | ------ |
| è®¿é®æ§å¶ | private | protected | public | | | | |
| ç±»ï¼æ¹æ³ååé修饰符 | abstract | class | extends | final | implements | interface | native |
| | new | static | strictfp | synchronized | transient | volatile | enum |
| ç¨åºæ§å¶ | break | continue | return | do | while | if | else |
| | for | instanceof | switch | case | default | assert | |
| é误å¤ç | try | catch | throw | throws | finally | | |
| å
ç¸å
³ | import | package | | | | | |
| åºæ¬ç±»å | boolean | byte | char | double | float | int | long |
| | short | | | | | | |
| åéå¼ç¨ | super | this | void | | | | |
| ä¿çå | goto | const | | | | | |
> Tipsï¼ææçå
³é®å齿¯å°åçï¼å¨ IDE ä¸ä¼ä»¥ç¹æ®é¢è²æ¾ç¤ºã
>
> `default` è¿ä¸ªå
³é®åå¾ç¹æ®ï¼æ¢å±äºç¨åºæ§å¶ï¼ä¹å±äºç±»ï¼æ¹æ³ååé修饰符ï¼è¿å±äºè®¿é®æ§å¶ã
>
> - å¨ç¨åºæ§å¶ä¸ï¼å½å¨ `switch` ä¸å¹é
ä¸å°ä»»ä½æ
嵿¶ï¼å¯ä»¥ä½¿ç¨ `default` æ¥ç¼åé»è®¤å¹é
çæ
åµã
> - å¨ç±»ï¼æ¹æ³ååé修饰符ä¸ï¼ä» JDK8 å¼å§å¼å
¥äºé»è®¤æ¹æ³ï¼å¯ä»¥ä½¿ç¨ `default` å
³é®åæ¥å®ä¹ä¸ä¸ªæ¹æ³çé»è®¤å®ç°ã
> - å¨è®¿é®æ§å¶ä¸ï¼å¦æä¸ä¸ªæ¹æ³å没æä»»ä½ä¿®é¥°ç¬¦ï¼åé»è®¤ä¼æä¸ä¸ªä¿®é¥°ç¬¦ `default`ï¼ä½æ¯è¿ä¸ªä¿®é¥°ç¬¦å ä¸äºå°±ä¼æ¥éã
â ï¸ æ³¨æï¼è½ç¶ `true`, `false`, å `null` çèµ·æ¥åå
³é®åä½å®é
ä¸ä»ä»¬æ¯åé¢å¼ï¼åæ¶ä½ ä¹ä¸å¯ä»¥ä½ä¸ºæ è¯ç¬¦æ¥ä½¿ç¨ã
宿¹ææ¡£ï¼[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/\_keywords.html](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html)
### âï¸èªå¢èªåè¿ç®ç¬¦
å¨å代ç çè¿ç¨ä¸ï¼å¸¸è§çä¸ç§æ
嵿¯éè¦æä¸ªæ´æ°ç±»ååéå¢å 1 æåå° 1ãJava æä¾äºèªå¢è¿ç®ç¬¦ (`++`) åèªåè¿ç®ç¬¦ (`--`) æ¥ç®åè¿ç§æä½ã
`++` å `--` è¿ç®ç¬¦å¯ä»¥æ¾å¨åéä¹åï¼ä¹å¯ä»¥æ¾å¨åéä¹åï¼
- **åç¼å½¢å¼**ï¼ä¾å¦ `++a` æ `--a`ï¼ï¼å
èªå¢/èªååéçå¼ï¼ç¶åå使ç¨è¯¥åéï¼ä¾å¦ï¼`b = ++a` å
å° `a` å¢å 1ï¼ç¶åæå¢å åçå¼èµç» `b`ã
- **åç¼å½¢å¼**ï¼ä¾å¦ `a++` æ `a--`ï¼ï¼å
使ç¨åéçå½åå¼ï¼ç¶ååèªå¢/èªååéçå¼ãä¾å¦ï¼`b = a++` å
å° `a` çå½åå¼èµç» `b`ï¼ç¶ååå° `a` å¢å 1ã
ä¸ºäºæ¹ä¾¿è®°å¿ï¼å¯ä»¥ä½¿ç¨ä¸é¢çå£è¯ï¼**符å·å¨åå°±å
å /åï¼ç¬¦å·å¨åå°±åå /å**ã
```mermaid
flowchart LR
%% å®ä¹å
¨å±æ ·å¼
classDef step fill:#4CA497,color:#fff,rx:10,ry:10
classDef example fill:#E99151,color:#fff,rx:10,ry:10
subgraph Prefix["åç¼å½¢å¼ ++a / --a"]
direction TB
style Prefix fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px
P1["ç¬¬ä¸æ¥ï¼åéèªå¢/èªå"]:::step --> P2["ç¬¬äºæ¥ï¼ä½¿ç¨æ°å¼åä¸è¿ç®"]:::step
P3["示ä¾ï¼b = ++a
S2["ç¬¬äºæ¥ï¼åéèªå¢/èªå"]:::step
S3["示ä¾ï¼b = a++
>>:æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥0è¡¥é½
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```
**使ç¨ç§»ä½è¿ç®ç¬¦ç主è¦åå **ï¼
1. **髿**ï¼ç§»ä½è¿ç®ç¬¦ç´æ¥å¯¹åºäºå¤çå¨çç§»ä½æä»¤ãç°ä»£å¤çå¨å
·æä¸é¨ç硬件æä»¤æ¥æ§è¡è¿äºç§»ä½æä½ï¼è¿äºæä»¤é常å¨ä¸ä¸ªæ¶é卿å
宿ãç¸æ¯ä¹ä¸ï¼ä¹æ³å餿³çç®æ¯è¿ç®å¨ç¡¬ä»¶å±é¢ä¸éè¦æ´å¤çæ¶é卿æ¥å®æã
2. **èçå
å**ï¼éè¿ç§»ä½æä½ï¼å¯ä»¥ä½¿ç¨ä¸ä¸ªæ´æ°ï¼å¦ `int` æ `long`ï¼æ¥åå¨å¤ä¸ªå¸å°å¼ææ å¿ä½ï¼ä»èèçå
åã
ç§»ä½è¿ç®ç¬¦æå¸¸ç¨äºå¿«éä¹ä»¥æé¤ä»¥ 2 ç广¬¡æ¹ã餿¤ä¹å¤ï¼å®è¿å¨ä»¥ä¸æ¹é¢åæ¥çéè¦ä½ç¨ï¼
- **ä½å段管ç**ï¼ä¾å¦åå¨åæä½å¤ä¸ªå¸å°å¼ã
- **åå¸ç®æ³åå å¯è§£å¯**ï¼éè¿ç§»ä½åä¸ãæçæä½æ¥æ··æ·æ°æ®ã
- **æ°æ®å缩**ï¼ä¾å¦é夫æ¼ç¼ç éè¿ç§»ä½è¿ç®ç¬¦å¯ä»¥å¿«éå¤çåæä½äºè¿å¶æ°æ®ï¼ä»¥çæç´§åçåç¼©æ ¼å¼ã
- **æ°æ®æ ¡éª**ï¼ä¾å¦ CRCï¼å¾ªç¯å使 ¡éªï¼éè¿ç§»ä½åå¤é¡¹å¼é¤æ³çæåæ ¡éªæ°æ®å®æ´æ§ã
- **å
å对é½**ï¼éè¿ç§»ä½æä½ï¼å¯ä»¥è½»æ¾è®¡ç®åè°æ´æ°æ®ç对é½å°åã
ææ¡æåºæ¬çç§»ä½è¿ç®ç¬¦ç¥è¯è¿æ¯å¾æå¿
è¦çï¼è¿ä¸å
å¯ä»¥å¸®å©æä»¬å¨ä»£ç ä¸ä½¿ç¨ï¼è¿å¯ä»¥å¸®å©æä»¬çè§£æºç 䏿¶åå°ç§»ä½è¿ç®ç¬¦ç代ç ã
```mermaid
flowchart TB
%% å®ä¹å
¨å±æ ·å¼ï¼ä¿æç»ä¸é£æ ¼
classDef left fill:#4CA497,color:#fff,rx:10,ry:10
classDef right fill:#00838F,color:#fff,rx:10,ry:10
classDef uright fill:#E99151,color:#fff,rx:10,ry:10
subgraph ShiftOps["Java ä¸ç§ç§»ä½è¿ç®ç¬¦"]
direction TB
style ShiftOps fill:#F0F2F5,stroke:#E0E6ED,stroke-width:1.5px
subgraph Left["左移 <<"]
style Left fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px
L1["æä½ï¼åå·¦ç§»å¨ n ä½"]:::left
L2["è§åï¼é«ä½ä¸¢å¼ï¼ä½ä½è¡¥ 0"]:::left
L3["ææï¼ç¸å½äº à 2^n"]:::left
L4["示ä¾ï¼8 << 2 = 32"]:::left
end
subgraph Right["带符å·å³ç§» >>"]
style Right fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px
R1["æä½ï¼åå³ç§»å¨ n ä½"]:::right
R2["è§åï¼ä½ä½ä¸¢å¼ï¼é«ä½è¡¥ç¬¦å·ä½"]:::right
R3["ææï¼ç¸å½äº ÷ 2^n"]:::right
R4["示ä¾ï¼-8 >> 2 = -2"]:::right
end
subgraph URight["æ 符å·å³ç§» >>>"]
style URight fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px
U1["æä½ï¼åå³ç§»å¨ n ä½"]:::uright
U2["è§åï¼ä½ä½ä¸¢å¼ï¼é«ä½è¡¥ 0"]:::uright
U3["ææï¼é»è¾å³ç§»"]:::uright
U4["示ä¾ï¼-8 >>> 2 = 1073741822"]:::uright
end
end
linkStyle default stroke-width:1.5px,opacity:0.8
```
Java 䏿ä¸ç§ç§»ä½è¿ç®ç¬¦ï¼
- `<<` :左移è¿ç®ç¬¦ï¼å左移è¥å¹²ä½ï¼é«ä½ä¸¢å¼ï¼ä½ä½è¡¥é¶ã`x << n`ï¼ç¸å½äº x ä¹ä»¥ 2 ç n 次æ¹(䏿º¢åºçæ
åµä¸)ã
- `>>` :带符å·å³ç§»ï¼åå³ç§»è¥å¹²ä½ï¼é«ä½è¡¥ç¬¦å·ä½ï¼ä½ä½ä¸¢å¼ãæ£æ°é«ä½è¡¥ 0ï¼è´æ°é«ä½è¡¥ 1ã`x >> n`ï¼ç¸å½äº x é¤ä»¥ 2 ç n 次æ¹ã
- `>>>` :æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥ 0 è¡¥é½ã
è½ç¶ç§»ä½è¿ç®æ¬è´¨ä¸å¯ä»¥å为左移åå³ç§»ï¼ä½å¨å®é
åºç¨ä¸ï¼å³ç§»æä½éè¦èè符å·ä½çå¤çæ¹å¼ã
ç±äº `double`ï¼`float` å¨äºè¿å¶ä¸çè¡¨ç°æ¯è¾ç¹æ®ï¼å æ¤ä¸è½æ¥è¿è¡ç§»ä½æä½ã
ç§»ä½æä½ç¬¦å®é
䏿¯æçç±»ååªæ`int`å`long`ï¼ç¼è¯å¨å¨å¯¹`short`ã`byte`ã`char`ç±»åè¿è¡ç§»ä½åï¼é½ä¼å°å
¶è½¬æ¢ä¸º`int`ç±»ååæä½ã
**å¦æç§»ä½ç使°è¶
è¿æ°å¼æå æç使°ä¼ææ ·ï¼**
å½ int ç±»å左移/å³ç§»ä½æ°å¤§äºçäº 32 使使¶ï¼ä¼å
æ±ä½ï¼%ï¼ååè¿è¡å·¦ç§»/å³ç§»æä½ãä¹å°±æ¯è¯´å·¦ç§»/å³ç§» 32 ä½ç¸å½äºä¸è¿è¡ç§»ä½æä½ï¼32%32=0ï¼ï¼å·¦ç§»/å³ç§» 42 ä½ç¸å½äºå·¦ç§»/å³ç§» 10 ä½ï¼42%32=10ï¼ãå½ long ç±»åè¿è¡å·¦ç§»/å³ç§»æä½æ¶ï¼ç±äº long 对åºçäºè¿å¶æ¯ 64 ä½ï¼å æ¤æ±ä½æä½çåºæ°ä¹åæäº 64ã
ä¹å°±æ¯è¯´ï¼`x<<42`çåäº`x<<10`ï¼`x>>42`çåäº`x>>10`ï¼`x >>>42`çåäº`x >>> 10`ã
**左移è¿ç®ç¬¦ä»£ç 示ä¾**ï¼
```java
int i = -1;
System.out.println("åå§æ°æ®ï¼" + i);
System.out.println("åå§æ°æ®å¯¹åºçäºè¿å¶å符串ï¼" + Integer.toBinaryString(i));
i <<= 10;
System.out.println("左移 10 ä½åçæ°æ® " + i);
System.out.println("左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 " + Integer.toBinaryString(i));
```
è¾åºï¼
```plain
åå§æ°æ®ï¼-1
åå§æ°æ®å¯¹åºçäºè¿å¶å符串ï¼11111111111111111111111111111111
左移 10 ä½åçæ°æ® -1024
左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 11111111111111111111110000000000
```
ç±äºå·¦ç§»ä½æ°å¤§äºçäº 32 使使¶ï¼ä¼å
æ±ä½ï¼%ï¼ååè¿è¡å·¦ç§»æä½ï¼æä»¥ä¸é¢ç代ç 左移 42 ä½ç¸å½äºå·¦ç§» 10 ä½ï¼42%32=10ï¼ï¼è¾åºç»æååé¢ç代ç 䏿 ·ã
```java
int i = -1;
System.out.println("åå§æ°æ®ï¼" + i);
System.out.println("åå§æ°æ®å¯¹åºçäºè¿å¶å符串ï¼" + Integer.toBinaryString(i));
i <<= 42;
System.out.println("左移 10 ä½åçæ°æ® " + i);
System.out.println("左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 " + Integer.toBinaryString(i));
```
å³ç§»è¿ç®ç¬¦ä½¿ç¨ç±»ä¼¼ï¼ç¯å¹
é®é¢ï¼è¿éå°±ä¸åæ¼ç¤ºäºã
### continueãbreak å return çåºå«æ¯ä»ä¹ï¼
å¨å¾ªç¯ç»æä¸ï¼å½å¾ªç¯æ¡ä»¶ä¸æ»¡è¶³æè
å¾ªç¯æ¬¡æ°è¾¾å°è¦æ±æ¶ï¼å¾ªç¯ä¼æ£å¸¸ç»æã使¯ï¼ææ¶åå¯è½éè¦å¨å¾ªç¯çè¿ç¨ä¸ï¼å½åçäºæç§æ¡ä»¶ä¹å ï¼æåç»æ¢å¾ªç¯ï¼è¿å°±éè¦ç¨å°ä¸é¢å 个å
³é®è¯ï¼
1. `continue`ï¼æè·³åºå½åçè¿ä¸æ¬¡å¾ªç¯ï¼ç»§ç»ä¸ä¸æ¬¡å¾ªç¯ã
2. `break`ï¼æè·³åºæ´ä¸ªå¾ªç¯ä½ï¼ç»§ç»æ§è¡å¾ªç¯ä¸é¢çè¯å¥ã
`return` ç¨äºè·³åºæå¨æ¹æ³ï¼ç»æè¯¥æ¹æ³çè¿è¡ãreturn ä¸è¬æä¸¤ç§ç¨æ³ï¼
1. `return;`ï¼ç´æ¥ä½¿ç¨ return ç»ææ¹æ³æ§è¡ï¼ç¨äºæ²¡æè¿åå¼å½æ°çæ¹æ³
2. `return value;`ï¼return ä¸ä¸ªç¹å®å¼ï¼ç¨äºæè¿åå¼å½æ°çæ¹æ³
```mermaid
flowchart TB
subgraph Method["æ¹æ³ä½"]
direction TB
style Method fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px
Start["æ¹æ³å¼å§"] --> Loop
subgraph Loop["循ç¯ä½ for/while"]
direction TB
style Loop fill:#F0F2F5,stroke:#E0E6ED,stroke-width:1.5px
L1["å¾ªç¯æ¡ä»¶å¤æ"] -->|"满足"| L2["æ§è¡å¾ªç¯ä½"]
L2 --> L3{{"éå°å
³é®åï¼"}}
L3 -->|"continue"| Continue["è·³è¿æ¬æ¬¡
ç»§ç»ä¸ä¸æ¬¡å¾ªç¯"]
L3 -->|"break"| Break["è·³åºæ´ä¸ªå¾ªç¯"]
L3 -->|"æ "| L1
Continue --> L1
end
Break --> AfterLoop["循ç¯åç代ç "]
L1 -->|"䏿»¡è¶³"| AfterLoop
AfterLoop --> L4{{"éå° returnï¼"}}
L4 -->|"æ¯"| Return["ç»ææ´ä¸ªæ¹æ³"]
L4 -->|"å¦"| End["æ¹æ³æ£å¸¸ç»æ"]
end
classDef start fill:#E99151,color:#fff,rx:10,ry:10
classDef loop fill:#4CA497,color:#fff,rx:10,ry:10
classDef decision fill:#00838F,color:#fff,rx:10,ry:10
classDef alert fill:#C44545,color:#fff,rx:10,ry:10
class Start,End start
class L1,L2,AfterLoop loop
class L3,L4 decision
class Continue,Break,Return alert
linkStyle default stroke-width:1.5px,opacity:0.8
```
æèä¸ä¸ï¼ä¸åè¯å¥çè¿è¡ç»ææ¯ä»ä¹ï¼
```java
public static void main(String[] args) {
boolean flag = false;
for (int i = 0; i <= 3; i++) {
if (i == 0) {
System.out.println("0");
} else if (i == 1) {
System.out.println("1");
continue;
} else if (i == 2) {
System.out.println("2");
flag = true;
} else if (i == 3) {
System.out.println("3");
break;
} else if (i == 4) {
System.out.println("4");
}
System.out.println("xixi");
}
if (flag) {
System.out.println("haha");
return;
}
System.out.println("heihei");
}
```
è¿è¡ç»æï¼
```plain
0
xixi
1
2
xixi
3
haha
```
## âï¸åºæ¬æ°æ®ç±»å
### Java ä¸çå ç§åºæ¬æ°æ®ç±»åäºè§£ä¹ï¼
Java 䏿 8 ç§åºæ¬æ°æ®ç±»åï¼åå«ä¸ºï¼
- 6 ç§æ°åç±»åï¼
- 4 ç§æ´æ°åï¼`byte`ã`short`ã`int`ã`long`
- 2 ç§æµ®ç¹åï¼`float`ã`double`
- 1 ç§å符类åï¼`char`
- 1 ç§å¸å°åï¼`boolean`ã
```mermaid
flowchart TB
Root["Java 8ç§åºæ¬æ°æ®ç±»å"] --> Numeric["æ°åç±»åï¼6ç§ï¼"]
Root --> Char["å符类å"]
Root --> Bool["å¸å°ç±»å"]
Numeric --> IntType["æ´æ°åï¼4ç§ï¼"]
Numeric --> FloatType["æµ®ç¹åï¼2ç§ï¼"]
IntType --> byte["byte
8ä½"]
IntType --> short["short
16ä½"]
IntType --> int["int
32ä½"]
IntType --> long["long
64ä½"]
FloatType --> float["float
32ä½"]
FloatType --> double["double
64ä½"]
Char --> char["char
16ä½"]
Bool --> boolean["boolean
1ä½"]
classDef root fill:#E99151,color:#fff,rx:10,ry:10
classDef category fill:#00838F,color:#fff,rx:10,ry:10
classDef type fill:#4CA497,color:#fff,rx:10,ry:10
class Root root
class Numeric,Char,Bool,IntType,FloatType category
class byte,short,int,long,float,double,char,boolean type
linkStyle default stroke-width:1.5px,opacity:0.8
```
è¿ 8 ç§åºæ¬æ°æ®ç±»åçé»è®¤å¼ä»¥åæå 空é´ç大å°å¦ä¸ï¼
| åºæ¬ç±»å | 使° | åè | é»è®¤å¼ | åå¼èå´ |
| :-------- | :--- | :--- | :------ | -------------------------------------------------------------- |
| `byte` | 8 | 1 | 0 | -128 ~ 127 |
| `short` | 16 | 2 | 0 | -32768ï¼-2^15ï¼ ~ 32767ï¼2^15 - 1ï¼ |
| `int` | 32 | 4 | 0 | -2147483648 ~ 2147483647 |
| `long` | 64 | 8 | 0L | -9223372036854775808ï¼-2^63ï¼ ~ 9223372036854775807ï¼2^63 -1ï¼ |
| `char` | 16 | 2 | 'u0000' | 0 ~ 65535ï¼2^16 - 1ï¼ |
| `float` | 32 | 4 | 0f | 1.4E-45 ~ 3.4028235E38 |
| `double` | 64 | 8 | 0d | 4.9E-324 ~ 1.7976931348623157E308 |
| `boolean` | 1 | | false | trueãfalse |
å¯ä»¥çå°ï¼å `byte`ã`short`ã`int`ã`long`è½è¡¨ç¤ºçæå¤§æ£æ°é½å 1 äºãè¿æ¯ä¸ºä»ä¹å¢ï¼è¿æ¯å 为å¨äºè¿å¶è¡¥ç 表示æ³ä¸ï¼æé«ä½æ¯ç¨æ¥è¡¨ç¤ºç¬¦å·çï¼0 è¡¨ç¤ºæ£æ°ï¼1 è¡¨ç¤ºè´æ°ï¼ï¼å
¶ä½ä½è¡¨ç¤ºæ°å¼é¨åãæä»¥ï¼å¦ææä»¬è¦è¡¨ç¤ºæå¤§çæ£æ°ï¼æä»¬éè¦æé¤äºæé«ä½ä¹å¤çææä½é½è®¾ä¸º 1ã妿æä»¬åå 1ï¼å°±ä¼å¯¼è´æº¢åºï¼åæä¸ä¸ªè´æ°ã
å¯¹äº `boolean`ï¼å®æ¹ææ¡£æªæç¡®å®ä¹ï¼å®ä¾èµäº JVM ååçå
·ä½å®ç°ãé»è¾ä¸çè§£æ¯å ç¨ 1 ä½ï¼ä½æ¯å®é
ä¸ä¼èèè®¡ç®æºé«æåå¨å ç´ ã
å¦å¤ï¼Java çæ¯ç§åºæ¬ç±»åæå åå¨ç©ºé´ç大å°ä¸ä¼åå
¶ä»å¤§å¤æ°è¯è¨é£æ ·éæºå¨ç¡¬ä»¶æ¶æçååèååãè¿ç§æå åå¨ç©ºé´å¤§å°çä¸åæ§æ¯ Java ç¨åºæ¯ç¨å
¶ä»å¤§å¤æ°è¯è¨ç¼åçç¨åºæ´å
·å¯ç§»æ¤æ§çåå ä¹ä¸ï¼ãJava ç¼ç¨ææ³ã2.2 èææå°ï¼ã
**注æï¼**
1. Java éä½¿ç¨ `long` ç±»åçæ°æ®ä¸å®è¦å¨æ°å¼åé¢å ä¸ **L**ï¼å¦åå°ä½ä¸ºæ´åè§£æã
2. Java éä½¿ç¨ `float` ç±»åçæ°æ®ä¸å®è¦å¨æ°å¼åé¢å ä¸ **f æ F**ï¼å¦åå°æ æ³éè¿ç¼è¯ã
3. `char a = 'h'`char :åå¼å·ï¼`String a = "hello"` :åå¼å·ã
è¿å
«ç§åºæ¬ç±»å齿坹åºçå
è£
ç±»åå«ä¸ºï¼`Byte`ã`Short`ã`Integer`ã`Long`ã`Float`ã`Double`ã`Character`ã`Boolean` ã
### åºæ¬ç±»ååå
è£
ç±»åçåºå«ï¼
- **ç¨é**ï¼é¤äºå®ä¹ä¸äºå¸¸éåå±é¨åéä¹å¤ï¼æä»¬å¨å
¶ä»å°æ¹æ¯å¦æ¹æ³åæ°ãå¯¹è±¡å±æ§ä¸å¾å°ä¼ä½¿ç¨åºæ¬ç±»åæ¥å®ä¹åéãå¹¶ä¸ï¼å
è£
ç±»åå¯ç¨äºæ³åï¼èåºæ¬ç±»åä¸å¯ä»¥ã
- **å卿¹å¼**ï¼åºæ¬æ°æ®ç±»åçå±é¨åéåæ¾å¨ Java èææºæ ä¸çå±é¨åé表ä¸ï¼åºæ¬æ°æ®ç±»åçæååéï¼æªè¢« `static` 修饰 ï¼åæ¾å¨ Java èææºçå ä¸ãå
è£
ç±»åå±äºå¯¹è±¡ç±»åï¼æä»¬ç¥éå 乿æå¯¹è±¡å®ä¾é½åå¨äºå ä¸ã
- **å ç¨ç©ºé´**ï¼ç¸æ¯äºå
è£
ç±»åï¼å¯¹è±¡ç±»åï¼ï¼ åºæ¬æ°æ®ç±»åå ç¨ç空é´å¾å¾é常å°ã
- **é»è®¤å¼**ï¼æååéå
è£
ç±»åä¸èµå¼å°±æ¯ `null` ï¼èåºæ¬ç±»åæé»è®¤å¼ä¸ä¸æ¯ `null`ã
- **æ¯è¾æ¹å¼**ï¼å¯¹äºåºæ¬æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¼ã对äºå
è£
æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¯¹è±¡çå
åå°åãæææ´åå
è£
类对象ä¹é´å¼çæ¯è¾ï¼å
¨é¨ä½¿ç¨ `equals()` æ¹æ³ã
**为ä»ä¹è¯´æ¯å 乿æå¯¹è±¡å®ä¾é½åå¨äºå ä¸å¢ï¼** è¿æ¯å 为 HotSpot èææºå¼å
¥äº JIT ä¼åä¹åï¼ä¼å¯¹å¯¹è±¡è¿è¡éé¸åæï¼å¦æåç°æä¸ä¸ªå¯¹è±¡å¹¶æ²¡æéé¸å°æ¹æ³å¤é¨ï¼é£ä¹å°±å¯è½éè¿æ éæ¿æ¢æ¥å®ç°æ ä¸åé
ï¼èé¿å
å ä¸åé
å
å
â ï¸ æ³¨æï¼**åºæ¬æ°æ®ç±»å忾卿 䏿¯ä¸ä¸ªå¸¸è§ç误åºï¼** åºæ¬æ°æ®ç±»åçåå¨ä½ç½®åå³äºå®ä»¬çä½ç¨ååå£°ææ¹å¼ã妿å®ä»¬æ¯å±é¨åéï¼é£ä¹å®ä»¬ä¼åæ¾å¨æ ä¸ï¼å¦æå®ä»¬æ¯æååéï¼é£ä¹å®ä»¬ä¼åæ¾å¨å /æ¹æ³åº/å
空é´ä¸ã
```java
public class Test {
// æååéï¼åæ¾å¨å ä¸
int a = 10;
// 被 static 修饰çæååéï¼JDK 1.6 åä¹åä½äºæ°¸ä¹
代ï¼1.7 åç§»åºæ°¸ä¹
代ï¼ä¸ç´åæ¾å¨å ä¸ã
// åéå±äºç±»ï¼ä¸å±äºå¯¹è±¡ã
static int b = 20;
public void method() {
// å±é¨åéï¼åæ¾å¨æ ä¸
int c = 30;
static int d = 40; // ç¼è¯é误ï¼ä¸è½å¨æ¹æ³ä¸ä½¿ç¨ static 修饰å±é¨åé
}
}
```
### å
è£
ç±»åçç¼åæºå¶äºè§£ä¹ï¼
Java åºæ¬æ°æ®ç±»åçå
è£
ç±»åç大é¨åé½ç¨å°äºç¼åæºå¶æ¥æåæ§è½ã
`Byte`,`Short`,`Integer`,`Long` è¿ 4 ç§å
è£
ç±»é»è®¤åå»ºäºæ°å¼ **[-128ï¼127]** çç¸åºç±»åçç¼åæ°æ®ï¼`Character` åå»ºäºæ°å¼å¨ **[0,127]** èå´çç¼åæ°æ®ï¼`Boolean` ç´æ¥è¿å `TRUE` or `FALSE`ã
å¯¹äº `Integer`ï¼å¯ä»¥éè¿ JVM åæ° `-XX:AutoBoxCacheMax=` ä¿®æ¹ç¼åä¸éï¼ä½ä¸è½ä¿®æ¹ä¸é -128ãå®é
ä½¿ç¨æ¶ï¼å¹¶ä¸å»ºè®®è®¾ç½®è¿å¤§çå¼ï¼é¿å
浪费å
åï¼çè³æ¯ OOMã
对äº`Byte`,`Short`,`Long` ,`Character` 没æç±»ä¼¼ `-XX:AutoBoxCacheMax` åæ°å¯ä»¥ä¿®æ¹ï¼å æ¤ç¼åèå´æ¯åºå®çï¼æ æ³éè¿ JVM åæ°è°æ´ã`Boolean` åç´æ¥è¿åé¢å®ä¹ç `TRUE` å `FALSE` å®ä¾ï¼æ²¡æç¼åèå´çæ¦å¿µã
**Integer ç¼åæºç ï¼**
```java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static {
// high value may be configured by property
int h = 127;
}
}
```
**`Character` ç¼åæºç :**
```java
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
private static class CharacterCache {
private CharacterCache(){}
static final Character cache[] = new Character[127 + 1];
static {
for (int i = 0; i < cache.length; i++)
cache[i] = new Character((char)i);
}
}
```
**`Boolean` ç¼åæºç ï¼**
```java
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
```
妿è¶
åºå¯¹åºèå´ä»ç¶ä¼å»å建æ°ç对象ï¼ç¼åçèå´åºé´ç大å°åªæ¯å¨æ§è½åèµæºä¹é´çæè¡¡ã
ä¸¤ç§æµ®ç¹æ°ç±»åçå
è£
ç±» `Float`,`Double` 并没æå®ç°ç¼åæºå¶ã
```java
Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// è¾åº true
Float i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// è¾åº false
Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// è¾åº false
```
ä¸é¢æä»¬æ¥çä¸ä¸ªé®é¢ï¼ä¸é¢ç代ç çè¾åºç»ææ¯ `true` è¿æ¯ `false` å¢ï¼
```java
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
```
`Integer i1=40` è¿ä¸è¡ä»£ç ä¼åçè£
ç®±ï¼ä¹å°±æ¯è¯´è¿è¡ä»£ç çä»·äº `Integer i1=Integer.valueOf(40)` ãå æ¤ï¼`i1` ç´æ¥ä½¿ç¨çæ¯ç¼åä¸ç对象ãè`Integer i2 = new Integer(40)` ä¼ç´æ¥å建æ°ç对象ã
å æ¤ï¼çæ¡æ¯ `false` ãä½ ç对äºåï¼
è®°ä½ï¼**æææ´åå
è£
类对象ä¹é´å¼çæ¯è¾ï¼å
¨é¨ä½¿ç¨ equals æ¹æ³æ¯è¾**ã

### èªå¨è£
ç®±ä¸æç®±äºè§£åï¼åçæ¯ä»ä¹ï¼
**ä»ä¹æ¯èªå¨æè£
ç®±ï¼**
- **è£
ç®±ï¼Boxingï¼**ï¼å°åºæ¬ç±»åç¨å®ä»¬å¯¹åºçå¼ç¨ç±»åå
è£
èµ·æ¥ï¼
- **æç®±ï¼Unboxingï¼**ï¼å°å
è£
ç±»å转æ¢ä¸ºåºæ¬æ°æ®ç±»åï¼
```mermaid
flowchart LR
subgraph Row["è£
ç®±ä¸æç®±å¯¹æ¯"]
direction LR
style Row fill:#F0F2F5,stroke:#E0E6ED,stroke-width:1.5px
subgraph Unboxing["æç®±è¿ç¨"]
direction LR
style Unboxing fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px
D["Integer obj"] -->|"èªå¨æç®±"| E["obj.intValue()"]
E --> F["int åºæ¬ç±»å"]
end
subgraph Boxing["è£
ç®±è¿ç¨"]
direction LR
style Boxing fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px
A["int i = 10"] -->|"èªå¨è£
ç®±"| B["Integer.valueOf(10)"]
B --> C["Integer 对象"]
end
end
classDef core fill:#4CA497,color:#fff,rx:10,ry:10
classDef highlight fill:#E99151,color:#fff,rx:10,ry:10
class A,D core
class C,F highlight
linkStyle default stroke-width:1.5px,opacity:0.8
```
举ä¾ï¼
```java
Integer i = 10; //è£
ç®±
int n = i; //æç®±
```
ä¸é¢è¿ä¸¤è¡ä»£ç 对åºçåèç 为ï¼
```java
L1
LINENUMBER 8 L1
ALOAD 0
BIPUSH 10
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
PUTFIELD AutoBoxTest.i : Ljava/lang/Integer;
L2
LINENUMBER 9 L2
ALOAD 0
ALOAD 0
GETFIELD AutoBoxTest.i : Ljava/lang/Integer;
INVOKEVIRTUAL java/lang/Integer.intValue ()I
PUTFIELD AutoBoxTest.n : I
RETURN
```
ä»åèç ä¸ï¼æä»¬åç°è£
ç®±å
¶å®å°±æ¯è°ç¨äº å
è£
ç±»ç`valueOf()`æ¹æ³ï¼æç®±å
¶å®å°±æ¯è°ç¨äº `xxxValue()`æ¹æ³ã
å æ¤ï¼
- `Integer i = 10` çä»·äº `Integer i = Integer.valueOf(10)`
- `int n = i` çä»·äº `int n = i.intValue()`;
注æï¼**妿é¢ç¹æè£
ç®±çè¯ï¼ä¹ä¼ä¸¥éå½±åç³»ç»çæ§è½ãæä»¬åºè¯¥å°½éé¿å
ä¸å¿
è¦çæè£
ç®±æä½ã**
```java
private static long sum() {
// åºè¯¥ä½¿ç¨ long è䏿¯ Long
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
```
### 为ä»ä¹æµ®ç¹æ°è¿ç®çæ¶åä¼æç²¾åº¦ä¸¢å¤±çé£é©ï¼
æµ®ç¹æ°è¿ç®ç²¾åº¦ä¸¢å¤±ä»£ç æ¼ç¤ºï¼
```java
float a = 2.0f - 1.9f;
float b = 1.8f - 1.7f;
System.out.printf("%.9f",a);// 0.100000024
System.out.println(b);// 0.099999905
System.out.println(a == b);// false
```
**为ä»ä¹ä¼åºç°è¿ä¸ªé®é¢å¢ï¼**
è¿ä¸ªåè®¡ç®æºä¿åæµ®ç¹æ°çæºå¶æå¾å¤§å
³ç³»ãæä»¬ç¥éè®¡ç®æºæ¯äºè¿å¶çï¼èä¸è®¡ç®æºå¨è¡¨ç¤ºä¸ä¸ªæ°åæ¶ï¼å®½åº¦æ¯æéçï¼æ é循ç¯çå°æ°åå¨å¨è®¡ç®æºæ¶ï¼åªè½è¢«æªæï¼æä»¥å°±ä¼å¯¼è´å°æ°ç²¾åº¦åçæå¤±çæ
åµãè¿ä¹å°±è§£éäºä¸ºä»ä¹æµ®ç¹æ°æ²¡æåæ³ç¨äºè¿å¶ç²¾ç¡®è¡¨ç¤ºã
å°±æ¯å¦è¯´åè¿å¶ä¸ç 0.2 å°±æ²¡åæ³ç²¾ç¡®è½¬æ¢æäºè¿å¶å°æ°ï¼
```java
// 0.2 转æ¢ä¸ºäºè¿å¶æ°çè¿ç¨ä¸ºï¼ä¸æä¹ä»¥ 2ï¼ç´å°ä¸åå¨å°æ°ä¸ºæ¢ï¼
// å¨è¿ä¸ªè®¡ç®è¿ç¨ä¸ï¼å¾å°çæ´æ°é¨åä»ä¸å°ä¸æåå°±æ¯äºè¿å¶çç»æã
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0ï¼åç循ç¯ï¼
...
```
å
³äºæµ®ç¹æ°çæ´å¤å
容ï¼å»ºè®®çä¸ä¸[è®¡ç®æºç³»ç»åºç¡ï¼åï¼æµ®ç¹æ°](http://kaito-kidd.com/2018/08/08/computer-system-float-point/)è¿ç¯æç« ã
### å¦ä½è§£å³æµ®ç¹æ°è¿ç®ç精度丢失é®é¢ï¼
`BigDecimal` å¯ä»¥å®ç°å¯¹æµ®ç¹æ°çè¿ç®ï¼ä¸ä¼é æç²¾åº¦ä¸¢å¤±ãé常æ
åµä¸ï¼å¤§é¨åéè¦æµ®ç¹æ°ç²¾ç¡®è¿ç®ç»æçä¸å¡åºæ¯ï¼æ¯å¦æ¶åå°é±çåºæ¯ï¼é½æ¯éè¿ `BigDecimal` æ¥åçã
```java
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(c);
BigDecimal y = b.subtract(c);
System.out.println(x); /* 0.2 */
System.out.println(y); /* 0.20 */
// æ¯è¾å
容ï¼ä¸æ¯æ¯è¾å¼
System.out.println(Objects.equals(x, y)); /* false */
// æ¯è¾å¼ç¸çç¨ç¸çcompareToï¼ç¸çè¿å0
System.out.println(0 == x.compareTo(y)); /* true */
```
å
³äº `BigDecimal` ç详ç»ä»ç»ï¼å¯ä»¥ççæåçè¿ç¯æç« ï¼[BigDecimal 详解](https://javaguide.cn/java/basis/bigdecimal.html)ã
### è¶
è¿ long æ´åçæ°æ®åºè¯¥å¦ä½è¡¨ç¤ºï¼
åºæ¬æ°å¼ç±»å齿ä¸ä¸ªè¡¨è¾¾èå´ï¼å¦æè¶
è¿è¿ä¸ªèå´å°±ä¼ææ°å¼æº¢åºçé£é©ã
å¨ Java ä¸ï¼64 ä½ long æ´åæ¯æå¤§çæ´æ°ç±»åã
```java
long l = Long.MAX_VALUE;
System.out.println(l + 1); // -9223372036854775808
System.out.println(l + 1 == Long.MIN_VALUE); // true
```
`BigInteger` å
é¨ä½¿ç¨ `int[]` æ°ç»æ¥åå¨ä»»æå¤§å°çæ´å½¢æ°æ®ã
ç¸å¯¹äºå¸¸è§æ´æ°ç±»åçè¿ç®æ¥è¯´ï¼`BigInteger` è¿ç®çæçä¼ç¸å¯¹è¾ä½ã
## åé
### âï¸æååéä¸å±é¨åéçåºå«ï¼

- **è¯æ³å½¢å¼**ï¼ä»è¯æ³å½¢å¼ä¸çï¼æåå鿝å±äºç±»çï¼èå±é¨å鿝å¨ä»£ç åææ¹æ³ä¸å®ä¹çåéææ¯æ¹æ³çåæ°ï¼æååéå¯ä»¥è¢« `public`,`private`,`static` ç修饰符æä¿®é¥°ï¼èå±é¨åéä¸è½è¢«è®¿é®æ§å¶ä¿®é¥°ç¬¦å `static` æä¿®é¥°ï¼ä½æ¯ï¼æååéåå±é¨åéé½è½è¢« `final` æä¿®é¥°ã
- **å卿¹å¼**ï¼ä»åéå¨å
åä¸çå卿¹å¼æ¥çï¼å¦ææååéæ¯ä½¿ç¨ `static` 修饰çï¼é£ä¹è¿ä¸ªæåå鿝å±äºç±»çï¼å¦ææ²¡æä½¿ç¨ `static` 修饰ï¼è¿ä¸ªæåå鿝å±äºå®ä¾çãè对象åå¨äºå å
åï¼å±é¨åéååå¨äºæ å
åã
- **çåæ¶é´**ï¼ä»åéå¨å
åä¸ççåæ¶é´ä¸çï¼æååéæ¯å¯¹è±¡çä¸é¨åï¼å®éç对象çå建èåå¨ï¼èå±é¨åééçæ¹æ³çè°ç¨èèªå¨çæï¼éçæ¹æ³çè°ç¨ç»æèæ¶äº¡ã
- **é»è®¤å¼**ï¼ä»å鿝妿é»è®¤å¼æ¥çï¼æååéå¦ææ²¡æè¢«èµåå§å¼ï¼åä¼èªå¨ä»¥ç±»åçé»è®¤å¼èèµå¼ï¼ä¸ç§æ
åµä¾å¤:被 `final` 修饰çæååéä¹å¿
é¡»æ¾å¼å°èµå¼ï¼ï¼èå±é¨åéåä¸ä¼èªå¨èµå¼ã
**为ä»ä¹æååéæé»è®¤å¼ï¼**
æ ¸å¿åå æ¯ä¸ºäºä¿è¯å¯¹è±¡ç¶æçå®å
¨åå¯é¢æµæ§ã
æååéåå±é¨åéå¨è¿ä¸ªè§åä¸ä¸åï¼ä¸»è¦æ¯å 为å®ä»¬ç**çå½å¨æ**ä¸ä¸æ ·ï¼å¯¼è´äºç¼è¯å¨å¯¹å®ä»¬çâæ§å¶åâä¹ä¸åã
- **å±é¨åé**åªæ´»å¨ä¸ä¸ªæ¹æ³éï¼ç¼è¯å¨è½æ¸
æ¥å°çå°å®æ¯å¦å¨ä½¿ç¨å被èµå¼ï¼æä»¥ç¼è¯å¨ä¼å¼ºå¶ä½ å¿
é¡»æå¨èµå¼ï¼å¦åå°±æ¥éã
- **æååé**æ¯è·ç对象走çï¼å®çå¼å¯è½å¨æé 彿°éèµï¼ä¹å¯è½å¨åé¢çæä¸ª `setter` æ¹æ³éèµãç¼è¯å¨å¨ç¼è¯æ¶**æ æ³é¢æµ**å®å°åºä»ä¹æ¶åä¼è¢«èµå¼ã
å¹¶ä¸ï¼å¦æä¸ä¸ªåéæ²¡æè¢«åå§åï¼å®çå
åéåæ¾çå°±æ¯âåå¾å¼âââä¹åé£åå
åéçä¸çä»»ææ°æ®ã妿ç¨åºè¯»å并使ç¨äºè¿ä¸ªåå¾å¼ï¼å°±ä¼äº§çå®å
¨ä¸å¯é¢æµçç»æï¼æ¯å¦ä¸ä¸ªæ°ååæäºéæºæ°ï¼ä¸ä¸ªå¯¹è±¡å¼ç¨åæäºéæ³å°åï¼è¿ä¼ç´æ¥å¯¼è´ç¨åºå´©æºæåºç°è¯¡å¼ç bugã
为äºé¿å
ä½ æ¿å°ä¸ä¸ªå«æâåå¾å¼âçå±é©å¯¹è±¡ï¼Javaå¹²èä¸ºæææååéæä¾äºä¸ä¸ªå®å
¨çé»è®¤å¼ï¼å¦ null æ 0ï¼ï¼ä½ä¸ºä¸ç§**å®å
¨å
åºæºå¶**ã
æååéä¸å±é¨åé代ç 示ä¾ï¼
```java
public class VariableExample {
// æååé
private String name;
private int age;
// æ¹æ³ä¸çå±é¨åé
public void method() {
int num1 = 10; // æ ä¸åé
çå±é¨åé
String str = "Hello, world!"; // æ ä¸åé
çå±é¨åé
System.out.println(num1);
System.out.println(str);
}
// å¸¦åæ°çæ¹æ³ä¸çå±é¨åé
public void method2(int num2) {
int sum = num2 + 10; // æ ä¸åé
çå±é¨åé
System.out.println(sum);
}
// æé æ¹æ³ä¸çå±é¨åé
public VariableExample(String name, int age) {
this.name = name; // 对æååéè¿è¡èµå¼
this.age = age; // 对æååéè¿è¡èµå¼
int num3 = 20; // æ ä¸åé
çå±é¨åé
String str2 = "Hello, " + this.name + "!"; // æ ä¸åé
çå±é¨åé
System.out.println(num3);
System.out.println(str2);
}
}
```
### éæåéæä»ä¹ä½ç¨ï¼
éæåéä¹å°±æ¯è¢« `static` å
³é®å修饰çåéãå®å¯ä»¥è¢«ç±»çææå®ä¾å
±äº«ï¼æ 论ä¸ä¸ªç±»å建äºå¤å°ä¸ªå¯¹è±¡ï¼å®ä»¬é½å
±äº«åä¸ä»½éæåéãä¹å°±æ¯è¯´ï¼éæåéåªä¼è¢«åé
䏿¬¡å
åï¼å³ä½¿å建å¤ä¸ªå¯¹è±¡ï¼è¿æ ·å¯ä»¥èçå
åã

éæå鿝éè¿ç±»åæ¥è®¿é®çï¼ä¾å¦`StaticVariableExample.staticVar`ï¼å¦æè¢« `private`å
³é®åä¿®é¥°å°±æ æ³è¿æ ·è®¿é®äºï¼ã
```java
public class StaticVariableExample {
// éæåé
public static int staticVar = 0;
}
```
é常æ
åµä¸ï¼éæåéä¼è¢« `final` å
³é®å修饰æä¸ºå¸¸éã
```java
public class ConstantVariableExample {
// 常é
public static final int constantVar = 0;
}
```
### å符å常éåå符串常éçåºå«?
- **å½¢å¼** : åç¬¦å¸¸éæ¯åå¼å·å¼èµ·çä¸ä¸ªå符ï¼åç¬¦ä¸²å¸¸éæ¯åå¼å·å¼èµ·ç 0 个æè¥å¹²ä¸ªå符ã
- **å«ä¹** : å符常éç¸å½äºä¸ä¸ªæ´åå¼ï¼ASCII å¼ï¼ï¼å¯ä»¥åå 表达å¼è¿ç®; å符串常é代表ä¸ä¸ªå°åå¼ï¼è¯¥å符串å¨å
åä¸åæ¾ä½ç½®ï¼ã
- **å å
å大å°**ï¼å符常éåªå 2 个åè; å符串常éå è¥å¹²ä¸ªåèã
â ï¸ æ³¨æ `char` å¨ Java ä¸å 两个åèã
å符å常éåå符串常é代ç 示ä¾ï¼
```java
public class StringExample {
// å符å常é
public static final char LETTER_A = 'A';
// å符串常é
public static final String GREETING_MESSAGE = "Hello, world!";
public static void main(String[] args) {
System.out.println("å符å常éå ç¨çåèæ°ä¸ºï¼"+Character.BYTES);
System.out.println("å符串常éå ç¨çåèæ°ä¸ºï¼"+GREETING_MESSAGE.getBytes().length);
}
}
```
è¾åºï¼
```plain
å符å常éå ç¨çåèæ°ä¸ºï¼2
å符串常éå ç¨çåèæ°ä¸ºï¼13
```
## æ¹æ³
### ä»ä¹æ¯æ¹æ³çè¿åå¼?æ¹æ³æåªå ç§ç±»åï¼
**æ¹æ³çè¿åå¼** æ¯ææä»¬è·åå°çæä¸ªæ¹æ³ä½ä¸çä»£ç æ§è¡å产ççç»æï¼ï¼åææ¯è¯¥æ¹æ³å¯è½äº§çç»æï¼ãè¿åå¼çä½ç¨æ¯æ¥æ¶åºç»æï¼ä½¿å¾å®å¯ä»¥ç¨äºå
¶ä»çæä½ï¼
æä»¬å¯ä»¥æç
§æ¹æ³çè¿åå¼ååæ°ç±»åå°æ¹æ³å为ä¸é¢è¿å ç§ï¼
**1ãæ åæ°æ è¿åå¼çæ¹æ³**
```java
public void f1() {
//......
}
// ä¸é¢è¿ä¸ªæ¹æ³ä¹æ²¡æè¿åå¼ï¼è½ç¶ç¨å°äº return
public void f(int a) {
if (...) {
// è¡¨ç¤ºç»ææ¹æ³çæ§è¡ï¼ä¸æ¹çè¾åºè¯å¥ä¸ä¼æ§è¡
return;
}
System.out.println(a);
}
```
**2ãæåæ°æ è¿åå¼çæ¹æ³**
```java
public void f2(Parameter 1, ..., Parameter n) {
//......
}
```
**3ãæè¿å弿 åæ°çæ¹æ³**
```java
public int f3() {
//......
return x;
}
```
**4ãæè¿åå¼æåæ°çæ¹æ³**
```java
public int f4(int a, int b) {
return a * b;
}
```
### éææ¹æ³ä¸ºä»ä¹ä¸è½è°ç¨ééææå?
è¿ä¸ªéè¦ç»å JVM çç¸å
³ç¥è¯ï¼ä¸»è¦åå å¦ä¸ï¼
1. éææ¹æ³æ¯å±äºç±»çï¼å¨ç±»å è½½çæ¶åå°±ä¼åé
å
åï¼å¯ä»¥éè¿ç±»åç´æ¥è®¿é®ãèééææåå±äºå®ä¾å¯¹è±¡ï¼åªæå¨å¯¹è±¡å®ä¾åä¹åæåå¨ï¼éè¦éè¿ç±»çå®ä¾å¯¹è±¡å»è®¿é®ã
2. å¨ç±»çééææåä¸åå¨çæ¶åéææ¹æ³å°±å·²ç»åå¨äºï¼æ¤æ¶è°ç¨å¨å
åä¸è¿ä¸åå¨çééææåï¼å±äºéæ³æä½ã
```java
public class Example {
// å®ä¹ä¸ä¸ªå符å常é
public static final char LETTER_A = 'A';
// å®ä¹ä¸ä¸ªå符串常é
public static final String GREETING_MESSAGE = "Hello, world!";
public static void main(String[] args) {
// è¾åºå符å常éçå¼
System.out.println("å符å常éçå¼ä¸ºï¼" + LETTER_A);
// è¾åºå符串常éçå¼
System.out.println("å符串常éçå¼ä¸ºï¼" + GREETING_MESSAGE);
}
}
```
### âï¸éææ¹æ³åå®ä¾æ¹æ³æä½ä¸åï¼
**1ãè°ç¨æ¹å¼**
å¨å¤é¨è°ç¨éææ¹æ³æ¶ï¼å¯ä»¥ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼ï¼ä¹å¯ä»¥ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼ï¼èå®ä¾æ¹æ³åªæåé¢è¿ç§æ¹å¼ãä¹å°±æ¯è¯´ï¼**è°ç¨éææ¹æ³å¯ä»¥æ éå建对象** ã
ä¸è¿ï¼éè¦æ³¨æçæ¯ä¸è¬ä¸å»ºè®®ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ãè¿ç§æ¹å¼é常容æé ææ··æ·ï¼éææ¹æ³ä¸å±äºç±»çæä¸ªå¯¹è±¡èæ¯å±äºè¿ä¸ªç±»ã
å æ¤ï¼ä¸è¬å»ºè®®ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ã
```java
public class Person {
public void method() {
//......
}
public static void staicMethod(){
//......
}
public static void main(String[] args) {
Person person = new Person();
// è°ç¨å®ä¾æ¹æ³
person.method();
// è°ç¨éææ¹æ³
Person.staicMethod()
}
}
```
**2ã访é®ç±»æåæ¯å¦åå¨éå¶**
éææ¹æ³å¨è®¿é®æ¬ç±»çæåæ¶ï¼åªå
许访é®éææåï¼å³éææååéåéææ¹æ³ï¼ï¼ä¸å
许访é®å®ä¾æåï¼å³å®ä¾æååéåå®ä¾æ¹æ³ï¼ï¼èå®ä¾æ¹æ³ä¸åå¨è¿ä¸ªéå¶ã
### âï¸éè½½åéåæä»ä¹åºå«ï¼
> é载就æ¯åæ ·çä¸ä¸ªæ¹æ³è½å¤æ ¹æ®è¾å
¥æ°æ®çä¸åï¼ååºä¸åçå¤ç
>
> éåå°±æ¯å½å类继æ¿èªç¶ç±»çç¸åæ¹æ³ï¼è¾å
¥æ°æ®ä¸æ ·ï¼ä½è¦ååºæå«äºç¶ç±»çååºæ¶ï¼ä½ å°±è¦è¦çç¶ç±»æ¹æ³
#### éè½½
åçå¨åä¸ä¸ªç±»ä¸ï¼æè
ç¶ç±»ååç±»ä¹é´ï¼ï¼æ¹æ³åå¿
é¡»ç¸åï¼åæ°ç±»åä¸åã个æ°ä¸åã顺åºä¸åï¼æ¹æ³è¿åå¼å访é®ä¿®é¥°ç¬¦å¯ä»¥ä¸åã
ãJava æ ¸å¿ææ¯ãè¿æ¬ä¹¦æ¯è¿æ ·ä»ç»éè½½çï¼
> 妿å¤ä¸ªæ¹æ³(æ¯å¦ `StringBuilder` çæé æ¹æ³)æç¸åçååãä¸åçåæ°ï¼ ä¾¿äº§çäºéè½½ã
>
> ```java
> StringBuilder sb = new StringBuilder();
> StringBuilder sb2 = new StringBuilder("HelloWorld");
> ```
>
> ç¼è¯å¨å¿
é¡»æéåºå
·ä½æ§è¡åªä¸ªæ¹æ³ï¼å®éè¿ç¨åä¸ªæ¹æ³ç»åºçåæ°ç±»åä¸ç¹å®æ¹æ³è°ç¨æä½¿ç¨çå¼ç±»åè¿è¡å¹é
æ¥æéåºç¸åºçæ¹æ³ã 妿ç¼è¯å¨æ¾ä¸å°å¹é
çåæ°ï¼ å°±ä¼äº§çç¼è¯æ¶éè¯¯ï¼ å ä¸ºæ ¹æ¬ä¸åå¨å¹é
ï¼ æè
没æä¸ä¸ªæ¯å
¶ä»çæ´å¥½(è¿ä¸ªè¿ç¨è¢«ç§°ä¸ºé载解æ(overloading resolution))ã
>
> Java å
许éè½½ä»»ä½æ¹æ³ï¼ èä¸åªæ¯æé 卿¹æ³ã
综ä¸ï¼é载就æ¯åä¸ä¸ªç±»ä¸å¤ä¸ªååæ¹æ³æ ¹æ®ä¸åçä¼ åæ¥æ§è¡ä¸åçé»è¾å¤çã
#### éå
éååçå¨è¿è¡æï¼æ¯å类对ç¶ç±»çå
许访é®çæ¹æ³çå®ç°è¿ç¨è¿è¡éæ°ç¼åã
1. æ¹æ³åãåæ°å表å¿
é¡»ç¸åï¼åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼æåºçå¼å¸¸èå´å°äºçäºç¶ç±»ï¼è®¿é®ä¿®é¥°ç¬¦èå´å¤§äºçäºç¶ç±»ã
2. 妿ç¶ç±»æ¹æ³è®¿é®ä¿®é¥°ç¬¦ä¸º `private/final/static` åå类就ä¸è½éåè¯¥æ¹æ³ï¼ä½æ¯è¢« `static` ä¿®é¥°çæ¹æ³è½å¤è¢«å次声æã
3. æé æ¹æ³æ æ³è¢«éå
#### æ»ç»
综ä¸ï¼**éåå°±æ¯å类对ç¶ç±»æ¹æ³çéæ°æ¹é ï¼å¤é¨æ ·åä¸è½æ¹åï¼å
é¨é»è¾å¯ä»¥æ¹åã**
| åºå«ç¹ | éè½½ (Overloading) | éå (Overriding) |
| -------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| **åçèå´** | åä¸ä¸ªç±»ä¸ã | ç¶ç±»ä¸åç±»ä¹é´ï¼åå¨ç»§æ¿å
³ç³»ï¼ã |
| **æ¹æ³ç¾å** | æ¹æ³å**å¿
é¡»ç¸å**ï¼ä½**åæ°å表å¿
é¡»ä¸å**ï¼åæ°çç±»åãä¸ªæ°æé¡ºåºè³å°æä¸é¡¹ä¸åï¼ã | æ¹æ³åãåæ°å表**å¿
é¡»å®å
¨ç¸å**ã |
| **è¿åç±»å** | ä¸è¿åå¼ç±»å**æ å
³**ï¼å¯ä»¥ä»»æä¿®æ¹ã | åç±»æ¹æ³çè¿åç±»åå¿
é¡»ä¸ç¶ç±»æ¹æ³çè¿åç±»å**ç¸å**ï¼æè
æ¯å
¶**åç±»**ã |
| **访é®ä¿®é¥°ç¬¦** | ä¸è®¿é®ä¿®é¥°ç¬¦**æ å
³**ï¼å¯ä»¥ä»»æä¿®æ¹ã | åç±»æ¹æ³çè®¿é®æé**ä¸è½ä½äº**ç¶ç±»æ¹æ³çè®¿é®æéãï¼public > protected > default > privateï¼ |
| **ç»å®æ¶æ** | ç¼è¯æ¶ç»å®æç§°éæç»å® | è¿è¡æ¶ç»å® (Run-time Binding) æç§°å¨æç»å® |
**æ¹æ³çéåè¦éµå¾ªâ两å两å°ä¸å¤§â**ï¼ä»¥ä¸å
容æå½èªãç¯ç Java 讲ä¹ãï¼[issue#892](https://github.com/Snailclimb/JavaGuide/issues/892) ï¼ï¼
- â两åâ峿¹æ³åç¸åãå½¢åå表ç¸åï¼
- â两å°âæçæ¯åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼åç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»åºæ¯ç¶ç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»æ´å°æç¸çï¼
- âä¸å¤§âæçæ¯åç±»æ¹æ³çè®¿é®æéåºæ¯ç¶ç±»æ¹æ³çè®¿é®æéæ´å¤§æç¸çã
âï¸ å
³äº **éåçè¿åå¼ç±»å** è¿ééè¦é¢å¤å¤è¯´æä¸ä¸ï¼ä¸é¢ç表述ä¸å¤ªæ¸
æ°åç¡®ï¼å¦ææ¹æ³çè¿åç±»åæ¯ void ååºæ¬æ°æ®ç±»åï¼åè¿åå¼éåæ¶ä¸å¯ä¿®æ¹ã使¯å¦ææ¹æ³çè¿å弿¯å¼ç¨ç±»åï¼éåæ¶æ¯å¯ä»¥è¿å该å¼ç¨ç±»åçåç±»çã
```java
public class Hero {
public String name() {
return "è¶
级è±é";
}
}
public class SuperMan extends Hero{
@Override
public String name() {
return "è¶
人";
}
public Hero hero() {
return new Hero();
}
}
public class SuperSuperMan extends SuperMan {
@Override
public String name() {
return "è¶
级è¶
级è±é";
}
@Override
public SuperMan hero() {
return new SuperMan();
}
}
```
### ä»ä¹æ¯å¯åé¿åæ°ï¼
ä» Java5 å¼å§ï¼Java æ¯æå®ä¹å¯åé¿åæ°ï¼æè°å¯åé¿åæ°å°±æ¯å
许å¨è°ç¨æ¹æ³æ¶ä¼ å
¥ä¸å®é¿åº¦çåæ°ãå°±æ¯å¦ä¸é¢è¿ä¸ªæ¹æ³å°±å¯ä»¥æ¥å 0 个æè
å¤ä¸ªåæ°ã
```java
public static void method1(String... args) {
//......
}
```
å¦å¤ï¼å¯ååæ°åªè½ä½ä¸ºå½æ°çæåä¸ä¸ªåæ°ï¼ä½å
¶åé¢å¯ä»¥æä¹å¯ä»¥æ²¡æä»»ä½å
¶ä»åæ°ã
```java
public static void method2(String arg1, String... args) {
//......
}
```
**éå°æ¹æ³éè½½çæ
嵿ä¹åå¢ï¼ä¼ä¼å
å¹é
åºå®åæ°è¿æ¯å¯ååæ°çæ¹æ³å¢ï¼**
çæ¡æ¯ä¼ä¼å
å¹é
åºå®åæ°çæ¹æ³ï¼å 为åºå®åæ°çæ¹æ³å¹é
度æ´é«ã
æä»¬éè¿ä¸é¢è¿ä¸ªä¾åæ¥è¯æä¸ä¸ã
```java
/**
* 微信æ JavaGuide åå¤"é¢è¯çªå»"å³å¯å
è´¹é¢å个人ååç Java é¢è¯æå
*
* @author Guideå¥
* @date 2021/12/13 16:52
**/
public class VariableLengthArgument {
public static void printVariable(String... args) {
for (String s : args) {
System.out.println(s);
}
}
public static void printVariable(String arg1, String arg2) {
System.out.println(arg1 + arg2);
}
public static void main(String[] args) {
printVariable("a", "b");
printVariable("a", "b", "c", "d");
}
}
```
è¾åºï¼
```plain
ab
a
b
c
d
```
å¦å¤ï¼Java çå¯ååæ°ç¼è¯åå®é
ä¼è¢«è½¬æ¢æä¸ä¸ªæ°ç»ï¼æä»¬çç¼è¯åçæç `class`æä»¶å°±å¯ä»¥çåºæ¥äºã
```java
public class VariableLengthArgument {
public static void printVariable(String... args) {
String[] var1 = args;
int var2 = args.length;
for(int var3 = 0; var3 < var2; ++var3) {
String s = var1[var3];
System.out.println(s);
}
}
// ......
}
```
## åè
- What is the difference between JDK and JRE?ï¼
- Oracle vs OpenJDKï¼
- Differences between Oracle JDK and OpenJDKï¼
- å½»åºå¼æ Java çç§»ä½æä½ç¬¦ï¼