# Java å建对象çäºç§æ¹å¼
* [Java å建对象çäºç§æ¹å¼](#java-å建对象çäºç§æ¹å¼)
* [ä½¿ç¨ new æ¥å建对象](#使ç¨-new-æ¥å建对象)
* [ä½¿ç¨ newInstance æ¹æ³æ¥å建](#使ç¨-newinstance-æ¹æ³æ¥å建)
* [使ç¨åå°æ¥å建对象](#使ç¨åå°æ¥å建对象)
* [使ç¨å¯¹è±¡å
鿥å建对象](#使ç¨å¯¹è±¡å
鿥å建对象)
* [使ç¨ååºååå建对象](#使ç¨ååºååå建对象)
* [æå](#æå)
æä»¬æ¥å¸¸çæ´»ä¸ä¼å建å¾å¤å¯¹è±¡ï¼ä½æ¯è¿ä¸ªå¯¹è±¡åä½ çè§£çé£ä¹å¯¹è±¡ä¸ä¸æ ·ï¼å 为ä½è
䏿¯å¥³å¨²ï¼ä¸è½é 人ãä½è
åªæ¯ç¨åºåï¼ä»åªè½å¨ Java ä¸å建对象ã
> é£ä¹æé®ä½ ä¸ä¸ªé®é¢ï¼ä½ ç¥é Java ä¸å¦ä½å建对象åï¼
è¿ä¸ªé®é¢ä»¿ä½æ¯ç» Java æ°ææ¥åçï¼å¥½åæç¹ç§ä¸èµ·å¨åº§åä½çæ ·åï¼å¯ãããé£ä¹ææ¢ç§é®æ³å¥½äºï¼æ¯ç«çæå
¬ä¼å·çäººé½æ¯å°æ¥æå
¥ 10w ç大佬ã
>ä½ ç¥é Java 䏿åªå ç§åå»ºå¯¹è±¡çæ¹å¼åï¼
诶ï¼è¿ä¸ªé®é¢æç¹ææï¼å¹³å¸¸æä»¬ç¨çæå¤çå°±æ¯ä½¿ç¨ `new` æ¥å建对象äºï¼è¿æ¯ç¬¬ä¸ç§æ¹å¼ï¼å¦ææä»¬ä½¿ç¨æ¡æ¶çè¯å°±ç´æ¥äº¤ç» `Spring` å»ç®¡ç就好äºï¼Spring åºå±æ¯ä½¿ç¨åå°æ¥å建对象çï¼è¿æ¯ç¬¬äºç§æ¹å¼ï¼ç¶åãããããããæç¹æ³ä¸èµ·æ¥äºï¼ä¸è¦æ¥ï¼è¿ç¯æç« å°±å¸®ä½ å顾ä¸ã
## ä½¿ç¨ new æ¥å建对象
ä½¿ç¨ new æ¥åå»ºå¯¹è±¡æ¯æç®åçä¸ç§æ¹å¼äºï¼`new` æ¯ Java ä¸çå
³é®åï¼new éè¿ä¸ºæ°å¯¹è±¡åé
å
åå¹¶è¿å对该å
åçå¼ç¨æ¥å®ä¾åä¸ä¸ªç±»ï¼è¿ä¸ªå®ä¾åä¸ä¸ªç±»å
¶å®å°±ç¸å½äºå建äºä¸ä¸ªå¯¹è±¡ï¼å ä¸ºç±»ä¹æ¯ä¸ç§å¯¹è±¡ï¼new ä¹è´è´£è°ç¨å¯¹è±¡çæé 彿°ï¼ä¸é¢æ¯ä½¿ç¨ new æ¥å建对象ç代ç
```java
Object obj = new Object();
```
è¿æ®µä»£ç ä¸ï¼æä»¬å¨å åºåä¸åé
äºä¸åå
åï¼ç¶åæ obj 对象æåäºè¿åå
ååºåã
ä¸ç¥éä½ ææ²¡æçè¿ new çåèç å¢ï¼ä¸é¢æ¯è¿æ®µä»£ç çåèç

å¨ Java ä¸ï¼æä»¬è®¤ä¸ºå建ä¸ä¸ªå¯¹è±¡å°±æ¯è°ç¨å
¶æé æ¹æ³ï¼æä»¥æä»¬ä½¿ç¨ new Object() æé ç对象ï¼å
¶å®æ¯è°ç¨äº Object ç±»ç`æ åæ°` çæé æ¹æ³ã使¯éè¿åèç æä»¬åç°ï¼å¯¹è±¡çå建åè°ç¨å
¶æé æ¹æ³æ¯åå¼çã
åèç ç `new` 表示å¨å ä¸å建ä¸ä¸ªå¯¹è±¡ï¼å¹¶æå¯¹è±¡çå¼ç¨æ¨å
¥æ ä¸ã`invokespecial` 表示è°ç¨å¯¹è±¡æ åæ°çæé æ¹æ³ãå
¶å®ï¼JVM æä¾äºäºç§æ¹æ³è°ç¨æä»¤ï¼å嫿¯
* `invokestatic`ï¼è¯¥æä»¤ç¨äºè°ç¨éææ¹æ³ï¼å³ä½¿ç¨ static å
³é®åä¿®é¥°çæ¹æ³ï¼
* `invokespecial`ï¼è¯¥æä»¤ç¨äºä¸ç§åºæ¯ï¼è°ç¨å®ä¾æé æ¹æ³ï¼è°ç¨ç§ææ¹æ³ï¼å³ private å
³é®åä¿®é¥°çæ¹æ³ï¼åç¶ç±»æ¹æ³ï¼å³ super å
³é®åè°ç¨çæ¹æ³ï¼ï¼
* `invokeinterface`ï¼è¯¥æä»¤ç¨äºè°ç¨æ¥å£æ¹æ³ï¼å¨è¿è¡æ¶åç¡®å®ä¸ä¸ªå®ç°æ¤æ¥å£ç对象ï¼
* `invokevirtual`ï¼è¯¥æä»¤ç¨äºè°ç¨èæ¹æ³ï¼å°±æ¯é¤äºä¸è¿°ä¸ç§æ
åµä¹å¤çæ¹æ³ï¼ï¼
* `invokedynamic`ï¼å¨è¿è¡æ¶å¨æè§£æåºè°ç¨ç¹éå®ç¬¦æå¼ç¨çæ¹æ³ä¹åï¼è°ç¨è¯¥æ¹æ³ï¼å¨ JDK 1.7 䏿åºï¼ä¸»è¦ç¨äºæ¯æ JVM ä¸çå¨æèæ¬è¯è¨ï¼å¦ Groovyï¼Jython çï¼
好äºï¼ç°å¨ä½ ç¥éäº new å invokespecial æ¯å¹²å¥ç¨çï¼é£ä¹ `dup` æä»¤å¢ï¼
dup ä¼å¤å¶æ ä¸çæåä¸ä¸ªå
ç´ ï¼ç¶å忬¡å°å
¶æ¨å
¥æ ï¼å æ¤ï¼å¦æå¨æ 䏿ä¸ä¸ªå¯¹è±¡å¼ç¨ï¼å¹¶ä¸è°ç¨äº dupï¼åç°å¨å¨æ ä¸æå¯¹è¯¥å¯¹è±¡ç两个å¼ç¨ãçèµ·æ¥æç¹ä¸ç¥å
¶æä»¥ç¶ï¼æä»¥å¨æ±å©ç½ä¸çæ¶åï¼ååç°äº R 大çè§£é

æ¥æºï¼https://www.zhihu.com/question/52749416
åé¢ç astore 就伿æä½æ°æ é¡¶çé£ä¸ªå¼ç¨æ¶èæï¼ä¿åå°æå®çå±é¨åéå»ã
å¦æç´æ¥ä½¿ç¨ `new Object()` 没æå建å±é¨åéçè¯ï¼è¯·æ³¨æä¸ä¸å®çåèç ã

çåºæ¥ç»å¾®çå·®å«äºåï¼ä¸å¾ä¸ç `astore_1` ç«ç¶åæäº `pop`ï¼è¿ä¹å°±æ¯è¯´ï¼new Object() 没æä¿å对象çå±é¨åéï¼èæ¯ç´æ¥æå®ç»æ¶èæäºãå¯ï¼ç¬¦å颿ã
æä»¥è¿æ¯ç¬¬ä¸ç§åå»ºçæ¹å¼ï¼ä¹å°±æ¯ä½¿ç¨ new æ¥å建ã
## ä½¿ç¨ newInstance æ¹æ³æ¥å建
è¿ä¸ª`newInstance` æ¹æ³æçæ¯ `class` ç±»ä¸çæ¹æ³ï¼newInstance æ¹æ³ä¼è°ç¨æ åçæé æ¹æ³å建对象ã
æä»¬å¯ä»¥ä½¿ç¨ newInstance æ¹æ³å建对象ï¼ä¸é¢æ¯ä½¿ç¨ç¤ºä¾ä»£ç
```java
User user = (User)Class.forName("com.cxuan.test.User").newInstance();
// æè
使ç¨
User user = User.class.newInstance();
```
ä¸é¢æä»¬åæä¸ä¸è¿ä¸ªåèç ï¼å
¶å®ä½¿ç¨ç¬¬ä¸ç§æ¹å¼å第äºç§æ¹å¼å°±å·®äºä¸ä¸ª Class.forName çåèç ï¼è¿æ¯ä¸ä¸ªéææ¹æ³ï¼åºè¯¥ç¨çæ¯ `invokestatic`ï¼ä¸é¢æä»¬éªè¯ä¸ä¸ã
第ä¸ç§æ¹å¼çåèç

第äºç§æ¹å¼çåèç

å¯ä»¥çå°ï¼æä»¬éªè¯çæ¯æ£ç¡®çã
>é£ä¹è¿æ®µåèç æ¯ä»ä¹ææå¢ï¼
`ldc` çæææ¯æå¸¸éæ± ä¸çå¼ç¨æ¨å
¥å°å½åå æ ä¸ï¼invokestatic å invokevirtual æä»¬ä¸é¢è§£éè¿äºï¼ç¶åå°±æ¯ `checkcast`ï¼ è¿ä¸ªåèç çå«ä¹å°±æ¯è¿è¡ç±»å转æ¢ï¼å 为 newInstance çæçæ¯ä¸ä¸ª Object çå¯¹è±¡ï¼æä»¥æä»¬éè¦æå®è½¬æ¢ä¸ºæä»¬éè¦ç User ç±»åï¼è¿ä¸ªåèç å°±æ¯å¹²è¿ä¸ªæ´»çã
## 使ç¨åå°æ¥å建对象
使ç¨åå°æ¥å建对象å
¶å®ä¹æ¯ä½¿ç¨äº newInstance æ¹æ³ï¼åªä¸è¿è¿ä¸ªæ¹æ³æ¯ `Constructor` ï¼Java åå°ä¸æé å¨çæ¹æ³ï¼æä»¬å¯ä»¥éè¿è¿ç§æ¹å¼æ¥å建ä¸ä¸ªæ°ç对象ãå¦ä¸ä»£ç æç¤º
```java
Constructor