java原始碼常用關鍵字
native
我們先來看看native關鍵字
jdk1.8 中的Class類中有這麼一個方法:
public native boolean isInstance(Object obj);
我們不管這個方法是做什麼的,但是一看這個方法我們會覺得很奇怪,因為Class是一個類,而不是一個介面,居然還存在沒有方法體的方法,帶著疑問繼續瞭解;
那麼native這個單詞有本地的意思,被native修飾的方法稱作本地方法,是一個原生態的方法,它的實現不在當前檔案中。
那麼為什麼不在當前檔案中實現呢?要搞得這麼麻煩!!
首先我們瞭解了虛擬機器,知道java跨平臺是因為虛擬機器,而虛擬機器通過介面來和不同的平臺對接,因此java語言有了跨平臺的特性,但也是因為如此,java語言不能去對作業系統的底層進行訪問和操作,需要來藉助其他語言來實現(比如C/C++);
volatile
這個關鍵字說起來,估計要連帶出一系列的問題(balabala.....)
簡單的說Volatile關鍵字實際下有兩層含義:
A)保證了記憶體的可見性;
B)禁止了指令的重排序;
何為記憶體的可見性,就是在我從主存中讀取資料放到快取區中的時候,我們修改資料,就會造成快取中的資料和主記憶體中的資料不一致,而用volatile修飾的變數,一旦修改,就會寫入記憶體中,而普通變數寫入主記憶體的時機我們是不確定的;
指令的重排序:在我們寫的程式碼中,jvm執行的時候並非都是按照程式碼的順序來執行的,可以通過重排序來優化程式碼;
重排序:
int a=1; int b=20; int c=a+b;
我們先給a賦值,然後給b賦值,但是在執行時,jvm很有可能會先給b賦值,在給a賦值;
final 表示常量
- 修飾基礎變數時,表示不可改變變數的值
2. 修飾引用變數的時候,表示不可改變引用的地址,但是引用物件中的資料可以改變
3.修飾類表示類不可被繼承
4.修飾方法且方法使用public修飾,表示方法不可被重寫,但方法可以被繼承
重寫報錯
繼承
public class Userfinal { public final void show(){ System.out.println("i am show"); } public static void main(String[] args) { Sonfinal sonfinal=new Sonfinal(); sonfinal.show(); } } class Sonfinal extends Userfinal{ }
結果
i am show
如果使用private修飾方法:則表示次方法不可被繼承,但是在son中可以有方法show
public class Userfinal {
private final void show(){
System.out.println("i am show");
}
public static void main(String[] args) {
Sonfinal sonfinal=new Sonfinal();
sonfinal.show();
}
}
class Sonfinal extends Userfinal{
public void show(){
System.out.println("i am son show");
}
}
i am son show