<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
class
+子類名+extends
+父類別名+{}class Animal{}//父類別 class cat extends Animal{}//子類用extends實現繼承
注意:一個類只能用extends
關鍵字宣告繼承一個父類別
interface
+介面名+extends
+介面名+{}interface Clippers {} interface Warriors {} interface Lakers extends Clippers,Warriors {}//介面類用extends關鍵字繼承其他介面(可多個)
注意:
extends
宣告繼承別的類extends
宣告繼承別的介面,且可以繼承多個介面implements
實現了一個介面時,不僅要實現該介面的方法,也要實現該介面繼承的介面的方法class
+類名+implements
+介面名+{}class Nets implements Clippers,Warriors{}//用implements關鍵字宣告實現了兩個介面類
注意:
implements
關鍵字宣告實現多個介面,但必須實現所有介面中的所有方法implements
關鍵字宣告實現多個介面來實現類似多繼承使用方法:
使用細節:
final
修飾的屬性在定義時必須賦初值,且不能修改,可以在以下位置賦初值
static final
:全域性常數
final
修飾的屬性是靜態(static
)的,則不能在構造器中賦初值,原因:靜態屬性要求在類載入時就有初值,而構造器在建立物件時才被呼叫,所以可能導致呼叫靜態屬性時沒有建立物件而沒有給靜態屬性賦值final
不能修飾構造方法,沒有意義final
和static
同時修飾的屬性在呼叫時不會導致類的載入,效率更高基本介紹:
native
用來修飾方法,被修飾的方法即成為了一個Java呼叫但非Java程式碼實現的介面(本地方法) ,該方法在外部可以用任何語言去實現
"A native method is a java method whose implementation is provided by non-java code."
使用方法:
native
修飾方法的位置必須在方法返回型別之前,和方法存取修飾符位置沒有要求,如:public native int hashCode();
native
細節:
native
方法沒有方法體,也沒有{}
native
修飾後的方法不能用abstract
修飾,因為abstract
指明該方法無實現體,而native
方法是有實現體的,只是用非Java
程式碼實現的native
方法的返回型別可以是任意型別native
方法的類被繼承,子類會繼承這個native
方法,並且可以用java
語言重寫使用JNI(Java Native Interface)
與其他語言互動
JNI
是Java
平臺的一部分,它允許Java
程式碼和其他語言寫的程式碼進行互動。
使用步驟:
native
方法的java
類,生成.java
檔案javac
命令編譯生成.class
檔案javah -jni 類名
生成.h
檔案C/C++(或者其他程式語言)
實現native
方法,建立.cpp(或其他)
檔案C/C++
編寫的檔案建立動態連結庫(生成DLL檔案)native
方法中使用System.loadLibrary()
方法載入動態庫,將DLL檔名作為引數傳入,這時候再執行.java
程式即可實現對本地方法的呼叫native意義:
Java
無法直接存取到作業系統底層(如系統硬體),但通過使用native
關鍵字修飾方法可以借用其他的語言來擴充套件Java
程式的功能,提高程式的效率
修飾變數,成為靜態變數或者類變數
存取修飾符+``static``+資料型別+變數名
注意事項:
類名.靜態變數名
或者 物件名.靜態變數名
修飾方法,成為靜態方法或者類方法
存取修飾符+``static``+返回資料型別+方法名+{}
注意事項:
類名.靜態方法名
或者 物件名.靜態方法名
this
和super
關鍵字靜態程式碼塊會在類載入時被載入,優先順序和靜態屬性一樣,有多個靜態程式碼塊和靜態屬性時,初始化順序按定義順序執行
好處:static
關鍵字的使用,將類中的一些成員修飾成靜態的,這樣我們不需要建立該類的物件就可以呼叫該成員,大大提高了程式設計效率
基本介紹:
transient
用於修飾實現了Serilizable
介面的類中的成員變數,在該類的範例物件進行序列化處理時,被transient
修飾的成員變數不會進行序列化。
使用例子:
import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; public class outStream { public static void main(String[] args) throws IOException { String filePath = "d:Cat.txt"; ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath)); oos.writeObject(new Cat("小花貓", 3)); oos.close(); } } class Cat implements Serializable { private String name; private int age; //沒有用transient修飾 public Cat(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Car{" + "name='" + name + ''' + ", age=" + age + '}'; } } public class inStream { public static void main(String[] args) throws IOException, ClassNotFoundException { String filePath = "d:Cat.txt"; ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath)); System.out.println(ois.readObject()); ois.close(); } }
可以在Cat.txt
檔案內看到兩個成員變數都能被序列化,並且能被反序列化讀出資訊。
當小花貓覺得自己的年齡是隱私不想被讀出時,用transient
修飾成員變數age
:
...... private String name; private transient int age; //使用transient修飾 ......
這時在Cat.txt
檔案中可以看到只有name
一個成員變數被序列化,反序列化後的成員變數age
讀出的是int型別的預設值,說明對於transient
修飾的成員變數,在類的範例物件序列化的過程中會被忽略
transient
細節
transient
修飾的成員變數可以理解為:不會參與進行物件的序列化和反序列化過程,生存週期僅存於呼叫者的記憶體而不會寫進磁碟裡進行持久化static
修飾的成員變數(靜態變數)也是不可序列化的,不論被transient
修飾與否因為序列化是儲存的範例物件的狀態,而靜態變數儲存的是類的狀態
transient
關鍵字只能修飾變數,不能修飾方法和類transient
關鍵字不能修飾區域性變數transient
關鍵字修飾的是自定義類的變數,則該類需要實現Serilizable
介面注意:
實現Serilizable
介面的類的範例物件是自動進行序列化的,如果序列化物件的類實現的是Externalizable
介面,則序列化不會自動進行,需要實現介面內的方法指定要序列化的變數,這時與有無Transient
修飾無關
基本介紹:
關鍵字synchronized
可以保證在同一時刻,只有一個執行緒可以執行被synchronized
修飾的方法或程式碼塊
執行緒同步:
程式中多個執行緒都要使用同一個方法,而這個方法用synchronized
進行了修飾,在多個執行緒呼叫這個方法時必須遵循同步機制
執行緒同步機制:
當一個執行緒使用synchronized
修飾的方法時,其他執行緒想使用這個方法時就必須等待,直到這個執行緒使用完synchronized
方法
synchronized使用方法:
public synchronized void m () {}
public class syn implements Runnable { static int i = 0; public static void main(String[] args) throws InterruptedException { syn test = new syn(); Thread t1 = new Thread(test); Thread t2 = new Thread(test); t1.start(); t2.start(); } public synchronized void increase() {//被synchronized修飾的同步方法 System.out.println(Thread.currentThread().getName() + "呼叫:" + i++); } @Override public void run() { for (int j = 0; j < 100; j++) { increase(); } } }
兩個執行緒同時呼叫一個物件的一個同步方法,由於一個物件只有一把鎖,所以只有一個執行緒能夠獲得該物件的鎖,另一個執行緒無法獲得,就不能呼叫該物件的synchronized
方法,需要等物件被釋放後才能呼叫。
從執行結果中可以證明執行緒1搶到了鎖,執行緒0必須等待執行緒1執行完畢,否則不能存取該同步方法。
public static synchronized void m () {}
public class syn implements Runnable { static int i = 0; public static void main(String[] args) throws InterruptedException { syn test = new syn(); syn test1 = new syn(); Thread t1 = new Thread(test);//傳入範例物件test Thread t2 = new Thread(test1);//傳入範例物件test1 t1.start(); t2.start(); } public static synchronized void increase() {//同步靜態方法 System.out.println(Thread.currentThread().getName() + "呼叫:" + i++); } @Override public void run() { for (int j = 0; j < 100; j++) { increase(); } } }
雖然兩個執行緒範例化了兩個不同的物件,但是synchronized
修飾的是靜態方法,兩個執行緒仍然發生了互斥,因為靜態方法是依附與類的而不是物件,執行緒1先搶到了類的鎖,而執行緒0必須等待執行緒1執行完畢釋放才能呼叫同步方法
synchronized(object) {}
public class syn implements Runnable { static Object object = new Object();//共用物件 public static void main(String[] args) throws InterruptedException { syn test = new syn(); syn test1 = new syn(); Thread t1 = new Thread(test); Thread t2 = new Thread(test1); t1.start(); t2.start(); } @Override public void run() { synchronized (object) {//程式碼塊用靜態成員變數上鎖 for (int j = 0; j < 100; j++) { System.out.println(Thread.currentThread().getName() + "呼叫第" + j + "次"); } } } }
同步程式碼塊用兩個範例變數共用的靜態成員object
物件來上鎖,雖然是兩個執行緒範例化兩個不同的物件,但是對整個syn
類來說只有一個共用的object
物件,所以只有一把鎖,每當有執行緒來存取程式碼塊時需持有鎖,物件鎖被其他執行緒持有時需等待。執行緒1需要等執行緒0執行完畢才能存取同步程式碼塊
同步的侷限性:
由於同步的方法或程式碼塊只能同一時間讓一個執行緒存取,所以會導致程式的執行效率降低
儘可能讓synchronized
修飾的範圍最小化,來減少互斥對程式執行帶來的影響
8.volatile
基本介紹:
volatile
用於修飾變數,用volatile
修飾的變數的值被某個執行緒修改時,會強制將修改的值立即寫入主記憶體中,主記憶體中的值更新會使得快取中的該變數的值失效,對比與非volatile
變數,可能會被其他執行緒讀取到更新前的值。
使用方法:
//現在有執行緒1和執行緒2同時執行下列程式碼 int i = 0; i = i + 1;
執行完畢後預想的結果是 i = 2
;但是可能存在這樣一種情況:兩個執行緒先同時把i的值讀取到自己的工作記憶體中,然後再分別執行 i = i + 1
的操作,再將結果寫入主記憶體,這樣兩個執行緒寫入的都是 i = 1
,最終 i
的結果是 1
,而不是 2
但如果 i
是 volatile
修飾的變數就會不一樣了,在一個執行緒修改 i
的值後,會立即強制在主記憶體中更新 i
的值,這樣會導致另一個執行緒的工作記憶體中 i
的快取值無效,所以另一個執行緒再次從主記憶體中讀取新的 i
的值,這樣保證了i
的值是最新並正確的
並行程式設計的三大概念:
x = 100;//是原子性操作 y = x;//不是原子性操作,可分解為:1.先讀取x的值 2.將x的值寫入主記憶體 x ++;//不是原子性操作,可分解為:1.讀取x的值 2.進行加一操作 3.寫入主記憶體
volatile
的意義
volatile
變數來說,被修改後新值對其他執行緒來說是立即可見的volatile
禁止了指令重排,它能保證在對volatile
修飾的變數進行操作時,之前的程式碼語句已經全部被執行,並且後面的語句都未執行,但是對其他語句的順序是不做保證的注意: volatile
不能保證原子性,因為不能保證對變數的操作是原子性操作
當前物件
,用來區別成員方法和形參,通常省略this(形參列表)
顯式呼叫指定的其他構造器super可以理解為:父類別的
super(形參列表)
指定呼叫父類別構造器super(形參列表)
必須放在構造器的首行super(形參列表)
和this(形參列表)
只能二選一super(形參列表)
或this(形參列表)
則預設呼叫父類別的空參構造器super()
(如果此時父類別中沒有空參構造器就會報錯)當一個方法和屬性被static屬性修飾時,這些方法和屬性是優先於物件載入進入記憶體的,是隨著類的載入而載入的;this是當前物件的參照,super是指父類別的參照,當靜態方法載入進記憶體進棧時,如果在靜態方法中有this和super關鍵字時,this和super也被載入到了記憶體,但是這個時候並沒有物件的參照,this和super沒有初始化,所有編譯會報錯。
public修飾類:
到此這篇關於Java幾個重要的關鍵字詳析的文章就介紹到這了,更多相關Java關鍵字內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45