java修飾符詳解
阿新 • • 發佈:2020-09-10
-
訪問修飾符
public:公共的
protected:受保護的(不能修飾類)
default(預設不寫)
private:私有的(不能修飾類)
修飾符 當前類 同一包內 被繼承的類(同包) 被繼承的類(不同包) 其他包 public 能訪問 能訪問 能訪問 能訪問 能訪問 protected 能訪問 能訪問 能訪問 能/不能 不能訪問 default 能訪問 能訪問 能訪問 不能訪問 不能訪問 private 能訪問 不能訪問 不能訪問 不能訪問 不能訪問 注:
protected:
- 基類的 protected 成員是包內可見的,並且對子類可見
- 若子類與基類不在同一包中,那麼在子類中,子類例項可以訪問其從基類繼承而來的protected方法,而不能訪問基類例項的protected方法
-
特徵修飾符
abstract:抽象的
-
修飾方法
用abstract修飾符修飾的方法 只有方法的結構 沒有方法執行體叫做抽象方法
注:native修飾的方法雖然也沒有方法體 但不是抽方法,過程是其他語言寫的
public class Person(){ //被abstract修飾的方法沒有方法體 public abstract void medth(); }
-
修飾類
用abstract修飾符修飾的類 叫做抽象類
public abstract class Person(){ //抽象類裡面可以有抽象方法 也可以有普通方法 //抽象方法 public abstract void medth(); //普通方法 public void medth1(){ System.out.println("這是一個普通方法"); } }
-
特點
-
抽象類中不是必須要有抽象方法
-
抽象方法必須放在抽象類中或者介面中,普通類中不允許有抽象方法
-
-
如何使用
- 抽象類中含有構造方法,但是我們不能通過呼叫構造方法直接建立物件
- 抽象類只能通過子類繼承來做事
//定義一個抽象類 public abstract class Person(){ public abstract void run(); } //定義一個類 並繼承Person public class Son extends Person(){ //重寫Person中的run方法 @Override public void run() { System.out.println("這是我繼承我的父類重寫的方法"); } } public static void main(String[] args) { son son=new son(); son.run(); }
以上程式執行結果為:
這是我繼承我的父類重寫的方法
5.類和類之間的關係:
- 抽象類---單繼承---抽象類
- 抽象類---單繼承---具體類 (一般不會出現)
- 具體類---單繼承---抽象類 不可以(將父類的抽象方法具體化或子類也變成抽象類)
final:最終的 不可改變的
-
修飾變數
如果儲存的是值型別:變數內的值不讓更改---常量
如果儲存的是引用型別:變數裡面的地址引用不讓更改---物件唯一
-
修飾屬性
屬性如果沒有賦值 有預設值存在的
屬性用final修飾後必須給屬性賦初始值,否則會編譯錯誤
-
修飾方法
方法是最終的方法 不可以更改(覆蓋)
final修飾的方法,要求不可以被子類重寫(覆蓋)
-
修飾類本身
類是最終的 不可以更改、
(太監類)此類不可以被其它子類繼承
static:靜態的
-
修飾變數:
- static修飾的成員變數也叫做靜態變數,也叫作類變數,說明這個變數屬於類的,而不是屬於物件的
- 被所有的物件共享,在記憶體中只有一個副本,static成員變數的初始化順序按照定義的順序進行初始化
- 靜態變數必須要靜態成員才能呼叫或者訪問
public class Test(){ //定義一個靜態變數 static String name; //這裡定義一個靜態方法 注意:要想使用靜態變數 方法也必須定義成靜態方法 //如果不定義成靜態方法 呼叫靜態變數就會報錯 public static void medth(){ name="定義的靜態變數"; System.out.println(name); } public static void main(String[] args){ medth(); } }
以上程式執行的結果為:
定義的靜態變數
-
修飾方法:
被static修飾的方法也叫做靜態方法,因為對於靜態方法來說是不屬於任何例項物件的
public class Test(){ //定義一個靜態變數 static String name; //定義一個普通的變數 int age; //定義一個靜態方法 public static void medth(){ //列印輸出靜態name System.out.println(name); //列印輸出普通變數age System.out.println(age); } public static void main(String[] args) { medth(); } }
以上程式執行的結果:
- age是訪問不到的,會報錯誤:無法從靜態上下文中引用非靜態變數age
注:
靜態變數和普通變數的區別:
- 靜態變數屬於類變數 成員變數屬於物件變數
- 靜態變數儲存在方法區的靜態區 成員變數儲存在記憶體中的堆
- 靜態變數隨著類的載入而載入,隨著類的消失而消失
- 成員變數隨著物件的載入而載入,隨著物件的消失而消失
- 靜態通過類名呼叫 成員變數通過物件呼叫
特點:
- 靜態元素在類載入時就初始化了
- 靜態元素儲存在靜態元素區中,每一個類有一個自己的區域,與別的類不衝突
- 靜態元素只加載一次(只有一份)全部的類物件及類本身共享
- 由於靜態元素區載入的時候,有可能沒有建立物件,可以通過類名字直接訪問
- GC機制時無法管理靜態元素的,可以認為是常駐記憶體
- 非靜態成員中可以訪問靜態成員
- 靜態成員中可以訪問靜態成員
- 靜態成員中不可以訪問非靜態成員
- 在靜態元素中不能出現this或super
native:本地的
java原始碼中看到native就已經看不到後續的程式碼了
後續會呼叫其他語言C++ C執行的記憶體操作 幫我們操作記憶體
-