final,static,this,super 關鍵字總結
正文開始@Assassin
目錄:
- final,static,this,super 關鍵字總結
- 1. final 關鍵字:
- 2. static 關鍵字:
- 3. this 關鍵字:
- 4. super 關鍵字:
1. final 關鍵字:
final 關鍵字,意思是最終的、不可改變的,初始化之后就不能再次修改 ,用來修飾類、方法和變數,具有以下特點:
final修飾的類不能被繼承,final類中的所有成員方法都會被隱式的指定為 final 方法;final修飾的方法不能被重寫;final修飾的變數是常量,如果是基本資料型別的變數,則其數值一旦在初始化之后便不能更改;如果是參考型別的變數,則在對其初始化之后便不能讓其指向另一個物件;
final的使用場景:使用 final 方法的原因有兩個,第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率,在早期的 Java 實作版本中,會將 final 方法轉為內嵌呼叫,但是如果方法過于龐大,可能看不到內嵌呼叫帶來的任何性能提升(現在的 Java 版本已經不需要使用 final 方法進行這些優化了),類中所有的 private 方法都隱式地指定為 final,
2. static 關鍵字:
static 關鍵字主要有以下四種使用場景:
- 修飾成員變數和成員方法: 被
static修飾的成員屬于類,不屬于單個這個類的某個物件,也就是說被類中所有物件共享,可以并且建議通過類名呼叫(創建物件來呼叫也不報錯,不建議 ),被static宣告的成員變數屬于靜態成員變數,靜態變數 存放在Java記憶體區域的方法區,呼叫格式:類名.靜態變數名,類名.靜態方法名() - 靜態代碼塊: 靜態代碼塊定義在類中方法外, 靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法), 該類不管創建多少物件,靜態代碼塊只執行一次;
- 靜態內部類(static 修飾類的話只能修飾內部類): 靜態內部類與非靜態內部類之間存在一個最大的區別: 非靜態內部類在編譯完成之后會隱含地保存著一個參考,該參考是指向創建它的外圍類,但是靜態內部類卻沒有,沒有這個參考就意味著:1. 它的創建是不需要依賴外圍類的創建,2. 它不能使用任何外圍類的非 static 成員變數和方法,
- 靜態導包(用來匯入類中的靜態資源,1.5 之后的新特性): 格式為:
import,static這兩個關鍵字連用可以指定匯入某個類中的指定靜態資源,并且不需要使用類名呼叫類中靜態成員,可以直接使用類中靜態成員變數和成員方法,
3. this 關鍵字:
this 是自身的一個物件的參考,可以簡單地理解為代表物件本身,(本質上this是一個變數,存盤的是當前物件的地址),站在記憶體的角度,也就是說:this是指向物件本身的一個指標,
this 的用法在 Java 中大體可以分為3種:
-
普通的直接參考
this是當前物件的一個參考,相當于是指向當前物件本身,
-
形參與成員名字重名,用 this 來區分:
class Person {
private int age = 10;
public Person(){
System.out.println("初始化年齡:"+age);
}
public int getAge(int age){
this.age = age;
return this.age;
}
}
public class TestDemo {
public static void main(String[] args) {
Person assassin = new Person();
System.out.println("assassin's age is " + assassin .getAge(12));
}
}
運行結果:


可以看到,這里 age 是 getAge 成員方法的形參,this.age 是 Person 類的成員變數,
- 參考建構式
下面與super一起講,this跟super很像,都是物件的參考;
4. super 關鍵字:
super可以理解為是指向自己父(超/基)類物件的一個指標,指向的是離自己最近的一個父類,
super 也有三種用法:
-
普通的直接參考
與
this類似,super相當于是指向當前物件的父類,這樣就可以用super.xxx來參考父類的成員, -
子類中的成員變數或方法與父類中的成員變數或方法同名
實體:
package com.test;
class Country {
String name;
void value() {
name = "China";
}
}
class City extends Country {
String name;
void value() {
name = "Shanghai";
super.value(); //呼叫父類的方法
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}
運行結果:


可以看到,這里既呼叫了父類的方法,也呼叫了父類的變數,若不呼叫父類方法 value(),只呼叫父類變數 name 的話,則父類 name 值為默認值 null,
-
參考建構式
super(引數):呼叫父類中的某一個建構式(應該為建構式中的第一條陳述句),
this(引數):呼叫本類中另一種形式的建構式(應該為建構式中的第一條陳述句),
使用 this 和 super 要注意的問題:
- 在構造器中使用
super()呼叫父類中的其他構造方法時,該陳述句必須處于構造器的首行,否則編譯器會報錯,另外,this呼叫本類中的其他構造方法時,也要放在首行,
-this、super不能用在static方法中,
簡單解釋一下:
被 static 修飾的成員屬于類,不屬于單個這個類的某個物件,被類中所有物件共享,而 this 代表對本類物件的參考,指向本類物件;而 super 代表對父類物件的參考,指向父類物件;所以, this 和 super 是屬于物件范疇的東西,而靜態方法是屬于類范疇的東西,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/305187.html
標籤:java
