# final,static,this,super å
³é®åæ»ç»
## final å
³é®å
**final å
³é®åï¼æææ¯æç»çãä¸å¯ä¿®æ¹çï¼æè§ä¸å¾åå ï¼ç¨æ¥ä¿®é¥°ç±»ãæ¹æ³ååéï¼å
·æä»¥ä¸ç¹ç¹ï¼**
1. final 修饰çç±»ä¸è½è¢«ç»§æ¿ï¼final ç±»ä¸çæææåæ¹æ³é½ä¼è¢«éå¼çæå®ä¸º final æ¹æ³ï¼
2. final ä¿®é¥°çæ¹æ³ä¸è½è¢«éåï¼
3. final 修饰çå鿝叏éï¼å¦ææ¯åºæ¬æ°æ®ç±»åçåéï¼åå
¶æ°å¼ä¸æ¦å¨åå§åä¹å便ä¸è½æ´æ¹ï¼å¦ææ¯å¼ç¨ç±»åçåéï¼åå¨å¯¹å
¶åå§åä¹å便ä¸è½è®©å
¶æåå¦ä¸ä¸ªå¯¹è±¡ã
说æï¼ä½¿ç¨ final æ¹æ³çåå æä¸¤ä¸ªï¼
1. ææ¹æ³éå®ï¼ä»¥é²ä»»ä½ç»§æ¿ç±»ä¿®æ¹å®çå«ä¹ï¼
2. æçã卿©æç Java å®ç°çæ¬ä¸ï¼ä¼å° final æ¹æ³è½¬ä¸ºå
åµè°ç¨ã使¯å¦ææ¹æ³è¿äºåºå¤§ï¼å¯è½çä¸å°å
åµè°ç¨å¸¦æ¥ç任使§è½æåï¼ç°å¨ç Java çæ¬å·²ç»ä¸éè¦ä½¿ç¨ 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 æ¯å±äºå¯¹è±¡èç´çä¸è¥¿ï¼èéææ¹æ³æ¯å±äºç±»èç´çä¸è¥¿**ã
## åè
-
-
# 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
}
}
```
### éæä»£ç å
éæä»£ç åå®ä¹å¨ç±»ä¸æ¹æ³å¤, éæä»£ç åå¨ééæä»£ç åä¹åæ§è¡(éæä»£ç å â> ééæä»£ç å â> æé æ¹æ³)ã 该类ä¸ç®¡å建å¤å°å¯¹è±¡ï¼éæä»£ç ååªæ§è¡ä¸æ¬¡.
éæä»£ç åçæ ¼å¼æ¯
```plain
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();//éæä»£ç åï¼--éææ¹æ³ä¸çå
容! --éææ¹æ³ä¸ç代ç åï¼--
}
}
```
ä¸è¿°ä»£ç è¾åºï¼
```plain
éæä»£ç åï¼--ééæä»£ç åï¼--é»è®¤æé æ¹æ³ï¼--éææ¹æ³ä¸çå
容! --éææ¹æ³ä¸ç代ç åï¼--
```
å½åªæ§è¡ `Test.test();` æ¶è¾åºï¼
```plain
éæä»£ç åï¼--éææ¹æ³ä¸çå
容! --éææ¹æ³ä¸ç代ç åï¼--
```
å½åªæ§è¡ `Test test = new Test();` æ¶è¾åºï¼
```plain
éæä»£ç åï¼--ééæä»£ç åï¼--é»è®¤æé æ¹æ³ï¼--
```
ééæä»£ç å䏿é 彿°çåºå«æ¯ï¼ééæä»£ç åæ¯ç»ææå¯¹è±¡è¿è¡ç»ä¸åå§åï¼èæé 彿°æ¯ç»å¯¹åºç对象åå§åï¼å 为æé 彿°æ¯å¯ä»¥å¤ä¸ªçï¼è¿è¡åªä¸ªæé 彿°å°±ä¼å»ºç«ä»ä¹æ ·ç对象ï¼ä½æ 论建ç«åªä¸ªå¯¹è±¡ï¼é½ä¼å
æ§è¡ç¸åçæé 代ç åãä¹å°±æ¯è¯´ï¼æé 代ç åä¸å®ä¹çæ¯ä¸å对象å
±æ§çåå§åå
容ã
### åè
-
-
-