# final,static,this,super å ³é®åæ»ç» ## final å ³é®å **final å ³é®åï¼æææ¯æç»çãä¸å¯ä¿®æ¹çï¼æè§ä¸å¾åå ï¼ç¨æ¥ä¿®é¥°ç±»ãæ¹æ³ååéï¼å ·æä»¥ä¸ç¹ç¹ï¼** 1. final 修饰çç±»ä¸è½è¢«ç»§æ¿ï¼final ç±»ä¸çæææåæ¹æ³é½ä¼è¢«éå¼çæå®ä¸º final æ¹æ³ï¼ 2. final ä¿®é¥°çæ¹æ³ä¸è½è¢«éåï¼ 3. final 修饰çå鿝叏éï¼å¦ææ¯åºæ¬æ°æ®ç±»åçåéï¼åå ¶æ°å¼ä¸æ¦å¨åå§åä¹å便ä¸è½æ´æ¹ï¼å¦ææ¯å¼ç¨ç±»åçåéï¼åå¨å¯¹å ¶åå§åä¹å便ä¸è½è®©å ¶æåå¦ä¸ä¸ªå¯¹è±¡ã 说æï¼ä½¿ç¨ final æ¹æ³çåå æä¸¤ä¸ªã第ä¸ä¸ªåå æ¯ææ¹æ³éå®ï¼ä»¥é²ä»»ä½ç»§æ¿ç±»ä¿®æ¹å®çå«ä¹ï¼ç¬¬äºä¸ªåå æ¯æçã卿©æç Java å®ç°çæ¬ä¸ï¼ä¼å° final æ¹æ³è½¬ä¸ºå åµè°ç¨ã使¯å¦ææ¹æ³è¿äºåºå¤§ï¼å¯è½çä¸å°å åµè°ç¨å¸¦æ¥ç任使§è½æåï¼ç°å¨ç Java çæ¬å·²ç»ä¸éè¦ä½¿ç¨ final æ¹æ³è¿è¡è¿äºä¼åäºï¼ãç±»ä¸ææç private æ¹æ³é½éå¼å°æå®ä¸º finalã ## static å ³é®å **static å ³é®åä¸»è¦æä»¥ä¸åç§ä½¿ç¨åºæ¯ï¼** 1. **修饰æååéåæåæ¹æ³:** 被 static 修饰çæåå±äºç±»ï¼ä¸å±äºå个è¿ä¸ªç±»çæä¸ªå¯¹è±¡ï¼è¢«ç±»ä¸ææå¯¹è±¡å ±äº«ï¼å¯ä»¥å¹¶ä¸å»ºè®®éè¿ç±»åè°ç¨ã被 static 声æçæååéå±äºéææååéï¼éæåé åæ¾å¨ Java å ååºåçæ¹æ³åºãè°ç¨æ ¼å¼ï¼`ç±»å.éæåéå` `ç±»å.éææ¹æ³å()` 2. **éæä»£ç å:** éæä»£ç åå®ä¹å¨ç±»ä¸æ¹æ³å¤, éæä»£ç åå¨ééæä»£ç åä¹åæ§è¡(éæä»£ç åâ>ééæä»£ç åâ>æé æ¹æ³)ã 该类ä¸ç®¡å建å¤å°å¯¹è±¡ï¼éæä»£ç ååªæ§è¡ä¸æ¬¡. 3. **éæå é¨ç±»ï¼static 修饰类çè¯åªè½ä¿®é¥°å é¨ç±»ï¼ï¼** éæå é¨ç±»ä¸ééæå é¨ç±»ä¹é´åå¨ä¸ä¸ªæå¤§çåºå«: ééæå é¨ç±»å¨ç¼è¯å®æä¹åä¼éå«å°ä¿åçä¸ä¸ªå¼ç¨ï¼è¯¥å¼ç¨æ¯æåå建å®çå¤å´ç±»ï¼ä½æ¯éæå é¨ç±»å´æ²¡æã没æè¿ä¸ªå¼ç¨å°±æå³çï¼1. å®çå建æ¯ä¸éè¦ä¾èµå¤å´ç±»çå建ã2. å®ä¸è½ä½¿ç¨ä»»ä½å¤å´ç±»çé static æååéåæ¹æ³ã 4. **éæå¯¼å (ç¨æ¥å¯¼å ¥ç±»ä¸çéæèµæºï¼1.5 ä¹åçæ°ç¹æ§):** æ ¼å¼ä¸ºï¼`import static` è¿ä¸¤ä¸ªå ³é®åè¿ç¨å¯ä»¥æå®å¯¼å ¥æä¸ªç±»ä¸çæå®éæèµæºï¼å¹¶ä¸ä¸éè¦ä½¿ç¨ç±»åè°ç¨ç±»ä¸éææåï¼å¯ä»¥ç´æ¥ä½¿ç¨ç±»ä¸éææååéåæåæ¹æ³ã ## this å ³é®å this å ³é®åç¨äºå¼ç¨ç±»çå½åå®ä¾ã ä¾å¦ï¼ ```java class Manager { Employees[] employees; void manageEmployees() { int totalEmp = this.employees.length; System.out.println("Total employees: " + totalEmp); this.report(); } void report() { } } ``` å¨ä¸é¢ç示ä¾ä¸ï¼this å ³é®åç¨äºä¸¤ä¸ªå°æ¹ï¼ - this.employees.lengthï¼è®¿é®ç±» Manager çå½åå®ä¾çåéã - this.reportï¼ï¼ï¼è°ç¨ç±» Manager çå½åå®ä¾çæ¹æ³ã æ¤å ³é®åæ¯å¯éçï¼è¿æå³ç妿ä¸é¢ç示ä¾å¨ä¸ä½¿ç¨æ¤å ³é®åçæ åµä¸è¡¨ç°ç¸åã 使¯ï¼ä½¿ç¨æ¤å ³é®åå¯è½ä¼ä½¿ä»£ç æ´æè¯»æææã ## super å ³é®å super å ³é®åç¨äºä»å类访é®ç¶ç±»çåéåæ¹æ³ã ä¾å¦ï¼ ```java public class Super { protected int number; protected showNumber() { System.out.println("number = " + number); } } public class Sub extends Super { void bar() { super.number = 10; super.showNumber(); } } ``` å¨ä¸é¢çä¾åä¸ï¼Sub 类访é®ç¶ç±»æååé number å¹¶è°ç¨å ¶ç¶ç±» Super ç `showNumberï¼ï¼` æ¹æ³ã **ä½¿ç¨ this å super è¦æ³¨æçé®é¢ï¼** - 卿é å¨ä¸ä½¿ç¨ `super()` è°ç¨ç¶ç±»ä¸çå ¶ä»æé æ¹æ³æ¶ï¼è¯¥è¯å¥å¿ é¡»å¤äºæé å¨çé¦è¡ï¼å¦åç¼è¯å¨ä¼æ¥éãå¦å¤ï¼this è°ç¨æ¬ç±»ä¸çå ¶ä»æé æ¹æ³æ¶ï¼ä¹è¦æ¾å¨é¦è¡ã - thisãsuper ä¸è½ç¨å¨ static æ¹æ³ä¸ã **ç®åè§£éä¸ä¸ï¼** 被 static 修饰çæåå±äºç±»ï¼ä¸å±äºå个è¿ä¸ªç±»çæä¸ªå¯¹è±¡ï¼è¢«ç±»ä¸ææå¯¹è±¡å ±äº«ãè this 代表对æ¬ç±»å¯¹è±¡çå¼ç¨ï¼æåæ¬ç±»å¯¹è±¡ï¼è super 代表对ç¶ç±»å¯¹è±¡çå¼ç¨ï¼æåç¶ç±»å¯¹è±¡ï¼æä»¥ï¼ **this å super æ¯å±äºå¯¹è±¡èç´çä¸è¥¿ï¼èéææ¹æ³æ¯å±äºç±»èç´çä¸è¥¿**ã ## åè - https://www.codejava.net/java-core/the-java-language/java-keywords - https://blog.csdn.net/u013393958/article/details/79881037 # static å ³é®å详解 ## static å ³é®åä¸»è¦æä»¥ä¸åç§ä½¿ç¨åºæ¯ 1. 修饰æååéåæåæ¹æ³ 2. éæä»£ç å 3. 修饰类(åªè½ä¿®é¥°å é¨ç±») 4. éæå¯¼å (ç¨æ¥å¯¼å ¥ç±»ä¸çéæèµæºï¼1.5 ä¹åçæ°ç¹æ§) ### 修饰æååéåæåæ¹æ³(常ç¨) 被 static 修饰çæåå±äºç±»ï¼ä¸å±äºå个è¿ä¸ªç±»çæä¸ªå¯¹è±¡ï¼è¢«ç±»ä¸ææå¯¹è±¡å ±äº«ï¼å¯ä»¥å¹¶ä¸å»ºè®®éè¿ç±»åè°ç¨ã被 static 声æçæååéå±äºéææååéï¼éæåé åæ¾å¨ Java å ååºåçæ¹æ³åºã æ¹æ³åºä¸ Java å 䏿 ·ï¼æ¯å个线ç¨å ±äº«çå ååºåï¼å®ç¨äºåå¨å·²è¢«èææºå è½½ç类信æ¯ã常éãéæåéã峿¶ç¼è¯å¨ç¼è¯åç代ç çæ°æ®ãè½ç¶ Java èææºè§èææ¹æ³åºæè¿°ä¸ºå çä¸ä¸ªé»è¾é¨åï¼ä½æ¯å®å´æä¸ä¸ªå«åå«å Non-Heapï¼éå ï¼ï¼ç®çåºè¯¥æ¯ä¸ Java å åºå弿¥ã HotSpot èææºä¸æ¹æ³åºä¹å¸¸è¢«ç§°ä¸º âæ°¸ä¹ 代âï¼æ¬è´¨ä¸ä¸¤è å¹¶ä¸çä»·ãä» ä» æ¯å 为 HotSpot èææºè®¾è®¡å¢éç¨æ°¸ä¹ 代æ¥å®ç°æ¹æ³åºèå·²ï¼è¿æ · HotSpot èææºçå徿¶éå¨å°±å¯ä»¥å管ç Java å 䏿 ·ç®¡çè¿é¨åå åäºã使¯è¿å¹¶ä¸æ¯ä¸ä¸ªå¥½ä¸»æï¼å ä¸ºè¿æ ·æ´å®¹æéå°å åæº¢åºé®é¢ã è°ç¨æ ¼å¼ï¼ - `ç±»å.éæåéå` - `ç±»å.éææ¹æ³å()` 妿åéæè æ¹æ³è¢« private åä»£è¡¨è¯¥å±æ§æè è¯¥æ¹æ³åªè½å¨ç±»çå é¨è¢«è®¿é®èä¸è½å¨ç±»çå¤é¨è¢«è®¿é®ã æµè¯æ¹æ³ï¼ ```java public class StaticBean { String name; //éæåé static int age; public StaticBean(String name) { this.name = name; } //éææ¹æ³ static void sayHello() { System.out.println("Hello i am java"); } @Override public String toString() { return "StaticBean{"+ "name=" + name + ",age=" + age + "}"; } } ``` ```java public class StaticDemo { public static void main(String[] args) { StaticBean staticBean = new StaticBean("1"); StaticBean staticBean2 = new StaticBean("2"); StaticBean staticBean3 = new StaticBean("3"); StaticBean staticBean4 = new StaticBean("4"); StaticBean.age = 33; System.out.println(staticBean + " " + staticBean2 + " " + staticBean3 + " " + staticBean4); //StaticBean{name=1,age=33} StaticBean{name=2,age=33} StaticBean{name=3,age=33} StaticBean{name=4,age=33} StaticBean.sayHello();//Hello i am java } } ``` ### éæä»£ç å éæä»£ç åå®ä¹å¨ç±»ä¸æ¹æ³å¤, éæä»£ç åå¨ééæä»£ç åä¹åæ§è¡(éæä»£ç å â> ééæä»£ç å â> æé æ¹æ³)ã 该类ä¸ç®¡å建å¤å°å¯¹è±¡ï¼éæä»£ç ååªæ§è¡ä¸æ¬¡. éæä»£ç åçæ ¼å¼æ¯ ``` static { è¯å¥ä½; } ``` ä¸ä¸ªç±»ä¸çéæä»£ç åå¯ä»¥æå¤ä¸ªï¼ä½ç½®å¯ä»¥é便æ¾ï¼å®ä¸å¨ä»»ä½çæ¹æ³ä½å ï¼JVM å 载类æ¶ä¼æ§è¡è¿äºéæç代ç åï¼å¦æéæä»£ç åæå¤ä¸ªï¼JVM å°æç §å®ä»¬å¨ç±»ä¸åºç°çå å顺åºä¾æ¬¡æ§è¡å®ä»¬ï¼æ¯ä¸ªä»£ç ååªä¼è¢«æ§è¡ä¸æ¬¡ã  éæä»£ç å对äºå®ä¹å¨å®ä¹åçéæåéï¼å¯ä»¥èµå¼ï¼ä½æ¯ä¸è½è®¿é®. ### éæå é¨ç±» éæå é¨ç±»ä¸ééæå é¨ç±»ä¹é´åå¨ä¸ä¸ªæå¤§çåºå«ï¼æä»¬ç¥éééæå é¨ç±»å¨ç¼è¯å®æä¹åä¼éå«å°ä¿åçä¸ä¸ªå¼ç¨ï¼è¯¥å¼ç¨æ¯æåå建å®çå¤å´ç±»ï¼ä½æ¯éæå é¨ç±»å´æ²¡æã没æè¿ä¸ªå¼ç¨å°±æå³çï¼ 1. å®çå建æ¯ä¸éè¦ä¾èµå¤å´ç±»çå建ã 2. å®ä¸è½ä½¿ç¨ä»»ä½å¤å´ç±»çé static æååéåæ¹æ³ã Exampleï¼éæå é¨ç±»å®ç°å便¨¡å¼ï¼ ```java public class Singleton { //声æä¸º private é¿å è°ç¨é»è®¤æé æ¹æ³å建对象 private Singleton() { } // 声æä¸º private 表æéæå é¨è¯¥ç±»åªè½å¨è¯¥ Singleton ç±»ä¸è¢«è®¿é® private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getUniqueInstance() { return SingletonHolder.INSTANCE; } } ``` å½ Singleton ç±»å è½½æ¶ï¼éæå é¨ç±» SingletonHolder 没æè¢«å è½½è¿å åãåªæå½è°ç¨ `getUniqueInstance()`æ¹æ³ä»è触å `SingletonHolder.INSTANCE` æ¶ SingletonHolder æä¼è¢«å è½½ï¼æ¤æ¶åå§å INSTANCE å®ä¾ï¼å¹¶ä¸ JVM è½ç¡®ä¿ INSTANCE åªè¢«å®ä¾å䏿¬¡ã è¿ç§æ¹å¼ä¸ä» å ·æå»¶è¿åå§åç好å¤ï¼èä¸ç± JVM æä¾äºå¯¹çº¿ç¨å®å ¨çæ¯æã ### éæå¯¼å æ ¼å¼ä¸ºï¼import static è¿ä¸¤ä¸ªå ³é®åè¿ç¨å¯ä»¥æå®å¯¼å ¥æä¸ªç±»ä¸çæå®éæèµæºï¼å¹¶ä¸ä¸éè¦ä½¿ç¨ç±»åè°ç¨ç±»ä¸éææåï¼å¯ä»¥ç´æ¥ä½¿ç¨ç±»ä¸éææååéåæåæ¹æ³ ```java //å°Mathä¸çææéæèµæºå¯¼å ¥ï¼è¿æ¶åå¯ä»¥ç´æ¥ä½¿ç¨éé¢çéææ¹æ³ï¼èä¸ç¨éè¿ç±»åè¿è¡è°ç¨ //å¦æåªæ³å¯¼å ¥åä¸æä¸ªéææ¹æ³ï¼åªéè¦å°*æ¢æå¯¹åºçæ¹æ³åå³å¯ import static java.lang.Math.*;//æ¢æimport static java.lang.Math.max;å ·æä¸æ ·çææ public class Demo { public static void main(String[] args) { int max = max(1,2); System.out.println(max); } } ``` ## è¡¥å å 容 ### éææ¹æ³ä¸ééææ¹æ³ éææ¹æ³å±äºç±»æ¬èº«ï¼ééææ¹æ³å±äºä»è¯¥ç±»çæçæ¯ä¸ªå¯¹è±¡ã 妿æ¨çæ¹æ³æ§è¡çæä½ä¸ä¾èµäºå ¶ç±»çå个åéåæ¹æ³ï¼è¯·å°å ¶è®¾ç½®ä¸ºéæï¼è¿å°ä½¿ç¨åºçå ç¨ç©ºé´æ´å°ï¼ã å¦åï¼å®åºè¯¥æ¯ééæçã Example ```java class Foo { int i; public Foo(int i) { this.i = i; } public static String method1() { return "An example string that doesn't depend on i (an instance variable)"; } public int method2() { return this.i + 1; //Depends on i } } ``` ä½ å¯ä»¥åè¿æ ·è°ç¨éææ¹æ³ï¼`Foo.method1()`ã 妿æ¨å°è¯ä½¿ç¨è¿ç§æ¹æ³è°ç¨ method2 å°å¤±è´¥ã ä½è¿æ ·å¯è¡ ```java Foo bar = new Foo(1); bar.method2(); ``` æ»ç»ï¼ - å¨å¤é¨è°ç¨éææ¹æ³æ¶ï¼å¯ä»¥ä½¿ç¨âç±»å.æ¹æ³åâçæ¹å¼ï¼ä¹å¯ä»¥ä½¿ç¨â对象å.æ¹æ³åâçæ¹å¼ãèå®ä¾æ¹æ³åªæåé¢è¿ç§æ¹å¼ãä¹å°±æ¯è¯´ï¼è°ç¨éææ¹æ³å¯ä»¥æ éå建对象ã - éææ¹æ³å¨è®¿é®æ¬ç±»çæåæ¶ï¼åªå 许访é®éææåï¼å³éææååéåéææ¹æ³ï¼ï¼èä¸å 许访é®å®ä¾æååéåå®ä¾æ¹æ³ï¼å®ä¾æ¹æ³åæ æ¤éå¶ ### `static{}`éæä»£ç åä¸`{}`ééæä»£ç å(æé 代ç å) ç¸åç¹ï¼ 齿¯å¨ JVM å 载类æ¶ä¸å¨æé æ¹æ³æ§è¡ä¹åæ§è¡ï¼å¨ç±»ä¸é½å¯ä»¥å®ä¹å¤ä¸ªï¼å®ä¹å¤ä¸ªæ¶æå®ä¹çé¡ºåºæ§è¡ï¼ä¸è¬å¨ä»£ç åä¸å¯¹ä¸äº static åéè¿è¡èµå¼ã ä¸åç¹ï¼ éæä»£ç åå¨ééæä»£ç åä¹åæ§è¡(éæä»£ç å -> ééæä»£ç å -> æé æ¹æ³)ãéæä»£ç ååªå¨ç¬¬ä¸æ¬¡ new æ§è¡ä¸æ¬¡ï¼ä¹åä¸åæ§è¡ï¼èééæä»£ç å卿¯ new 䏿¬¡å°±æ§è¡ä¸æ¬¡ã ééæä»£ç åå¯å¨æ®éæ¹æ³ä¸å®ä¹(ä¸è¿ä½ç¨ä¸å¤§)ï¼èéæä»£ç åä¸è¡ã > **ð ä¿®æ£ï¼åè§ï¼ [issue #677](https://github.com/Snailclimb/JavaGuide/issues/677)ï¼** ï¼éæä»£ç åå¯è½å¨ç¬¬ä¸æ¬¡ new å¯¹è±¡çæ¶åæ§è¡ï¼ä½ä¸ä¸å®åªå¨ç¬¬ä¸æ¬¡ new çæ¶åæ§è¡ãæ¯å¦éè¿ `Class.forName("ClassDemo")`å建 Class å¯¹è±¡çæ¶åä¹ä¼æ§è¡ï¼å³ new æè `Class.forName("ClassDemo")` é½ä¼æ§è¡éæä»£ç åã ä¸è¬æ åµä¸,妿æäºä»£ç æ¯å¦ä¸äºé¡¹ç®æå¸¸ç¨çåéæå¯¹è±¡å¿ é¡»å¨é¡¹ç®å¯å¨çæ¶åå°±æ§è¡çæ¶å,éè¦ä½¿ç¨éæä»£ç å,è¿ç§ä»£ç æ¯ä¸»å¨æ§è¡çã妿æä»¬æ³è¦è®¾è®¡ä¸éè¦å建对象就å¯ä»¥è°ç¨ç±»ä¸çæ¹æ³ï¼ä¾å¦ï¼`Arrays` ç±»ï¼`Character` ç±»ï¼`String` ç±»çï¼å°±éè¦ä½¿ç¨éææ¹æ³, 两è çåºå«æ¯ éæä»£ç 忝èªå¨æ§è¡çèéææ¹æ³æ¯è¢«è°ç¨çæ¶åææ§è¡ç. Exampleï¼ ```java public class Test { public Test() { System.out.print("é»è®¤æé æ¹æ³ï¼--"); } //ééæä»£ç å { System.out.print("ééæä»£ç åï¼--"); } //éæä»£ç å static { System.out.print("éæä»£ç åï¼--"); } private static void test() { System.out.print("éææ¹æ³ä¸çå 容! --"); { System.out.print("éææ¹æ³ä¸ç代ç åï¼--"); } } public static void main(String[] args) { Test test = new Test(); Test.test();//éæä»£ç åï¼--éææ¹æ³ä¸çå 容! --éææ¹æ³ä¸ç代ç åï¼-- } } ``` ä¸è¿°ä»£ç è¾åºï¼ ``` éæä»£ç åï¼--ééæä»£ç åï¼--é»è®¤æé æ¹æ³ï¼--éææ¹æ³ä¸çå 容! --éææ¹æ³ä¸ç代ç åï¼-- ``` å½åªæ§è¡ `Test.test();` æ¶è¾åºï¼ ``` éæä»£ç åï¼--éææ¹æ³ä¸çå 容! --éææ¹æ³ä¸ç代ç åï¼-- ``` å½åªæ§è¡ `Test test = new Test();` æ¶è¾åºï¼ ``` éæä»£ç åï¼--ééæä»£ç åï¼--é»è®¤æé æ¹æ³ï¼-- ``` ééæä»£ç å䏿é 彿°çåºå«æ¯ï¼ ééæä»£ç åæ¯ç»ææå¯¹è±¡è¿è¡ç»ä¸åå§åï¼èæé 彿°æ¯ç»å¯¹åºç对象åå§åï¼å 为æé 彿°æ¯å¯ä»¥å¤ä¸ªçï¼è¿è¡åªä¸ªæé 彿°å°±ä¼å»ºç«ä»ä¹æ ·ç对象ï¼ä½æ 论建ç«åªä¸ªå¯¹è±¡ï¼é½ä¼å æ§è¡ç¸åçæé 代ç åãä¹å°±æ¯è¯´ï¼æé 代ç åä¸å®ä¹çæ¯ä¸åå¯¹è±¡å ±æ§çåå§åå 容ã ### åè - https://blog.csdn.net/chen13579867831/article/details/78995480 - https://www.cnblogs.com/chenssy/p/3388487.html - https://www.cnblogs.com/Qian123/p/5713440.html