您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java重要的關(guān)鍵字有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java重要的關(guān)鍵字有哪些”吧!
用于類繼承類,用法:class
+子類名+extends
+父類名+{}
class Animal{}//父類 class cat extends Animal{}//子類用extends實(shí)現(xiàn)繼承
注意:一個(gè)類只能用extends
關(guān)鍵字聲明繼承一個(gè)父類
用于接口繼承接口,用法:interface
+接口名+extends
+接口名+{}
interface Clippers {} interface Warriors {} interface Lakers extends Clippers,Warriors {}//接口類用extends關(guān)鍵字繼承其他接口(可多個(gè))
注意:
接口不能用extends
聲明繼承別的類
接口只能用extends
聲明繼承別的接口,且可以繼承多個(gè)接口
當(dāng)一個(gè)類用implements
實(shí)現(xiàn)了一個(gè)接口時(shí),不僅要實(shí)現(xiàn)該接口的方法,也要實(shí)現(xiàn)該接口繼承的接口的方法
用于聲明一個(gè)類實(shí)現(xiàn)了一個(gè)接口類,用法:class
+類名+implements
+接口名+{}
class Nets implements Clippers,Warriors{}//用implements關(guān)鍵字聲明實(shí)現(xiàn)了兩個(gè)接口類
注意:
一個(gè)普通類可以implements
關(guān)鍵字聲明實(shí)現(xiàn)多個(gè)接口,但必須實(shí)現(xiàn)所有接口中的所有方法
抽象類實(shí)現(xiàn)接口,可以不用實(shí)現(xiàn)接口的方法(因?yàn)槌橄箢愔锌梢杂谐橄蠓椒ǎ?/p>
意義:可以用implements
關(guān)鍵字聲明實(shí)現(xiàn)多個(gè)接口來(lái)實(shí)現(xiàn)類似多繼承
使用方法:
修飾類,使該類不能被繼承
修飾方法,使該方法不能被子類重寫(xiě) (仍可以被繼承和調(diào)用)
修飾屬性,使該屬性的值不能被修改(使為常量)
修飾局部變量,使該變量不能被修改(局部常量)
使用細(xì)節(jié):
final
修飾的屬性在定義時(shí)必須賦初值,且不能修改,可以在以下位置賦初值
定義時(shí)(顯示初始化)
在構(gòu)造器中
在代碼塊中
static final
:全局常量
如果final
修飾的屬性是靜態(tài)(static
)的,則不能在構(gòu)造器中賦初值,原因:靜態(tài)屬性要求在類加載時(shí)就有初值,而構(gòu)造器在創(chuàng)建對(duì)象時(shí)才被調(diào)用,所以可能導(dǎo)致調(diào)用靜態(tài)屬性時(shí)沒(méi)有創(chuàng)建對(duì)象而沒(méi)有給靜態(tài)屬性賦值
final
不能修飾構(gòu)造方法,沒(méi)有意義
被final
和static
同時(shí)修飾的屬性在調(diào)用時(shí)不會(huì)導(dǎo)致類的加載,效率更高
基本介紹:
native
用來(lái)修飾方法,被修飾的方法即成為了一個(gè)Java調(diào)用但非Java代碼實(shí)現(xiàn)的接口(本地方法) ,該方法在外部可以用任何語(yǔ)言去實(shí)現(xiàn)
"A native method is a java method whose implementation is provided by non-java code."
使用方法:
native
修飾方法的位置必須在方法返回類型之前,和方法訪問(wèn)修飾符位置沒(méi)有要求,如:public native int hashCode();
native
細(xì)節(jié):
native
方法沒(méi)有方法體,也沒(méi)有{}
用native
修飾后的方法不能用abstract
修飾,因?yàn)?code>abstract指明該方法無(wú)實(shí)現(xiàn)體,而native
方法是有實(shí)現(xiàn)體的,只是用非Java
代碼實(shí)現(xiàn)的
native
方法的返回類型可以是任意類型
如果一個(gè)有native
方法的類被繼承,子類會(huì)繼承這個(gè)native
方法,并且可以用java
語(yǔ)言重寫(xiě)
使用JNI(Java Native Interface)
與其他語(yǔ)言交互
JNI
是Java
平臺(tái)的一部分,它允許Java
代碼和其他語(yǔ)言寫(xiě)的代碼進(jìn)行交互。
使用步驟:
編寫(xiě)帶有native
方法的java
類,生成.java
文件
使用javac
命令編譯生成.class
文件
使用javah -jni 類名
生成.h
文件
使用C/C++(或者其他編程語(yǔ)言)
實(shí)現(xiàn)native
方法,創(chuàng)建.cpp(或其他)
文件
將C/C++
編寫(xiě)的文件創(chuàng)建動(dòng)態(tài)鏈接庫(kù)(生成DLL文件)
native
方法中使用System.loadLibrary()
方法加載動(dòng)態(tài)庫(kù),將DLL文件名作為參數(shù)傳入,這時(shí)候再運(yùn)行.java
程序即可實(shí)現(xiàn)對(duì)本地方法的調(diào)用
詳細(xì)步驟參考
native意義:
Java
無(wú)法直接訪問(wèn)到操作系統(tǒng)底層(如系統(tǒng)硬件),但通過(guò)使用native
關(guān)鍵字修飾方法可以借用其他的語(yǔ)言來(lái)擴(kuò)展Java
程序的功能,提高程序的效率
修飾變量,成為靜態(tài)變量或者類變量
使用方法:訪問(wèn)修飾符+``static``+數(shù)據(jù)類型+變量名
注意事項(xiàng):
靜態(tài)變量會(huì)被類的所有對(duì)象實(shí)例所共享,并且在類加載的時(shí)候就會(huì)初始化。
靜態(tài)變量的訪問(wèn)方法(遵守相關(guān)訪問(wèn)權(quán)限):類名.靜態(tài)變量名
或者 對(duì)象名.靜態(tài)變量名
修飾方法,成為靜態(tài)方法或者類方法
使用方法:訪問(wèn)修飾符+``static``+返回?cái)?shù)據(jù)類型+方法名+{}
注意事項(xiàng):
調(diào)用方法(遵守相關(guān)訪問(wèn)權(quán)限):類名.靜態(tài)方法名
或者 對(duì)象名.靜態(tài)方法名
靜態(tài)方法和普通方法都是隨著類加載而加載,將結(jié)構(gòu)信息存儲(chǔ)在方法區(qū)
靜態(tài)方法中不允許使用this
和super
關(guān)鍵字
靜態(tài)方法中只能訪問(wèn)靜態(tài)變量和靜態(tài)方法
普通方法可以訪問(wèn)靜態(tài)成員和普通成員
修飾代碼塊,成為靜態(tài)代碼塊:
靜態(tài)代碼塊會(huì)在類加載時(shí)被加載,優(yōu)先級(jí)和靜態(tài)屬性一樣,有多個(gè)靜態(tài)代碼塊和靜態(tài)屬性時(shí),初始化順序按定義順序執(zhí)行
好處:static
關(guān)鍵字的使用,將類中的一些成員修飾成靜態(tài)的,這樣我們不需要?jiǎng)?chuàng)建該類的對(duì)象就可以調(diào)用該成員,大大提高了編程效率
基本介紹:
transient
用于修飾實(shí)現(xiàn)了Serilizable
接口的類中的成員變量,在該類的實(shí)例對(duì)象進(jìn)行序列化處理時(shí),被transient
修飾的成員變量不會(huì)進(jìn)行序列化。
使用例子:
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; //沒(méi)有用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
文件內(nèi)看到兩個(gè)成員變量都能被序列化,并且能被反序列化讀出信息。
當(dāng)小花貓覺(jué)得自己的年齡是隱私不想被讀出時(shí),用transient
修飾成員變量age
:
...... private String name; private transient int age; //使用transient修飾 ......
這時(shí)在Cat.txt
文件中可以看到只有name
一個(gè)成員變量被序列化,反序列化后的成員變量age
讀出的是int類型的默認(rèn)值,說(shuō)明對(duì)于transient
修飾的成員變量,在類的實(shí)例對(duì)象序列化的過(guò)程中會(huì)被忽略
transient
細(xì)節(jié)
對(duì)transient
修飾的成員變量可以理解為:不會(huì)參與進(jìn)行對(duì)象的序列化和反序列化過(guò)程,生存周期僅存于調(diào)用者的內(nèi)存而不會(huì)寫(xiě)進(jìn)磁盤(pán)里進(jìn)行持久化
static
修飾的成員變量(靜態(tài)變量)也是不可序列化的,不論被transient
修飾與否
因?yàn)樾蛄谢潜4娴膶?shí)例對(duì)象的狀態(tài),而靜態(tài)變量保存的是類的狀態(tài)
transient
關(guān)鍵字只能修飾變量,不能修飾方法和類
transient
關(guān)鍵字不能修飾局部變量
如transient
關(guān)鍵字修飾的是自定義類的變量,則該類需要實(shí)現(xiàn)Serilizable
接口
注意:
實(shí)現(xiàn)Serilizable
接口的類的實(shí)例對(duì)象是自動(dòng)進(jìn)行序列化的,如果序列化對(duì)象的類實(shí)現(xiàn)的是Externalizable
接口,則序列化不會(huì)自動(dòng)進(jìn)行,需要實(shí)現(xiàn)接口內(nèi)的方法指定要序列化的變量,這時(shí)與有無(wú)Transient
修飾無(wú)關(guān)
基本介紹:
關(guān)鍵字synchronized
可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行被synchronized
修飾的方法或代碼塊
線程同步:
程序中多個(gè)線程都要使用同一個(gè)方法,而這個(gè)方法用synchronized
進(jìn)行了修飾,在多個(gè)線程調(diào)用這個(gè)方法時(shí)必須遵循同步機(jī)制
線程同步機(jī)制:
當(dāng)一個(gè)線程使用synchronized
修飾的方法時(shí),其他線程想使用這個(gè)方法時(shí)就必須等待,直到這個(gè)線程使用完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() + "調(diào)用:" + i++); } @Override public void run() { for (int j = 0; j < 100; j++) { increase(); } } }
兩個(gè)線程同時(shí)調(diào)用一個(gè)對(duì)象的一個(gè)同步方法,由于一個(gè)對(duì)象只有一把鎖,所以只有一個(gè)線程能夠獲得該對(duì)象的鎖,另一個(gè)線程無(wú)法獲得,就不能調(diào)用該對(duì)象的synchronized
方法,需要等對(duì)象被釋放后才能調(diào)用。
從運(yùn)行結(jié)果中可以證明線程1搶到了鎖,線程0必須等待線程1執(zhí)行完畢,否則不能訪問(wèn)該同步方法。
靜態(tài)同步方法: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);//傳入實(shí)例對(duì)象test Thread t2 = new Thread(test1);//傳入實(shí)例對(duì)象test1 t1.start(); t2.start(); } public static synchronized void increase() {//同步靜態(tài)方法 System.out.println(Thread.currentThread().getName() + "調(diào)用:" + i++); } @Override public void run() { for (int j = 0; j < 100; j++) { increase(); } } }
雖然兩個(gè)線程實(shí)例化了兩個(gè)不同的對(duì)象,但是synchronized
修飾的是靜態(tài)方法,兩個(gè)線程仍然發(fā)生了互斥,因?yàn)?strong>靜態(tài)方法是依附與類的而不是對(duì)象,線程1先搶到了類的鎖,而線程0必須等待線程1執(zhí)行完畢釋放才能調(diào)用同步方法
同步代碼塊:synchronized(object) {}
public class syn implements Runnable { static Object object = new Object();//共享對(duì)象 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) {//代碼塊用靜態(tài)成員變量上鎖 for (int j = 0; j < 100; j++) { System.out.println(Thread.currentThread().getName() + "調(diào)用第" + j + "次"); } } } }
同步代碼塊用兩個(gè)實(shí)例變量共享的靜態(tài)成員object
對(duì)象來(lái)上鎖,雖然是兩個(gè)線程實(shí)例化兩個(gè)不同的對(duì)象,但是對(duì)整個(gè)syn
類來(lái)說(shuō)只有一個(gè)共享的object
對(duì)象,所以只有一把鎖,每當(dāng)有線程來(lái)訪問(wèn)代碼塊時(shí)需持有鎖,對(duì)象鎖被其他線程持有時(shí)需等待。線程1需要等線程0執(zhí)行完畢才能訪問(wèn)同步代碼塊
同步的局限性:
由于同步的方法或代碼塊只能同一時(shí)間讓一個(gè)線程訪問(wèn),所以會(huì)導(dǎo)致程序的執(zhí)行效率降低
盡可能讓synchronized
修飾的范圍最小化,來(lái)減少互斥對(duì)程序執(zhí)行帶來(lái)的影響
8.volatile
基本介紹:
volatile
用于修飾變量,用volatile
修飾的變量的值被某個(gè)線程修改時(shí),會(huì)強(qiáng)制將修改的值立即寫(xiě)入主存中,主存中的值更新會(huì)使得緩存中的該變量的值失效,對(duì)比與非volatile
變量,可能會(huì)被其他線程讀取到更新前的值。
使用方法:
//現(xiàn)在有線程1和線程2同時(shí)執(zhí)行下列代碼 int i = 0; i = i + 1;
執(zhí)行完畢后預(yù)想的結(jié)果是 i = 2
;但是可能存在這樣一種情況:兩個(gè)線程先同時(shí)把i的值讀取到自己的工作內(nèi)存中,然后再分別執(zhí)行 i = i + 1
的操作,再將結(jié)果寫(xiě)入主存,這樣兩個(gè)線程寫(xiě)入的都是 i = 1
,最終 i
的結(jié)果是 1
,而不是 2
但如果 i
是 volatile
修飾的變量就會(huì)不一樣了,在一個(gè)線程修改 i
的值后,會(huì)立即強(qiáng)制在主存中更新 i
的值,這樣會(huì)導(dǎo)致另一個(gè)線程的工作內(nèi)存中 i
的緩存值無(wú)效,所以另一個(gè)線程再次從主存中讀取新的 i
的值,這樣保證了i
的值是最新并正確的
并發(fā)編程的三大概念:
原子性:執(zhí)行一個(gè)操作時(shí),要么全部步驟執(zhí)行完畢且不被中斷,要么就不執(zhí)行
x = 100;//是原子性操作 y = x;//不是原子性操作,可分解為:1.先讀取x的值 2.將x的值寫(xiě)入主存 x ++;//不是原子性操作,可分解為:1.讀取x的值 2.進(jìn)行加一操作 3.寫(xiě)入主存
可見(jiàn)性:多個(gè)線程對(duì)同一個(gè)變量進(jìn)行操作時(shí),一個(gè)線程修改了變量的值,其他線程能立即看到修改的值
有序性:程序執(zhí)行的順序按照代碼的先后順序執(zhí)行
volatile
的意義
保證了不同線程對(duì)變量進(jìn)行修改時(shí)的可見(jiàn)性:因?yàn)閷?duì)于volatile
變量來(lái)說(shuō),被修改后新值對(duì)其他線程來(lái)說(shuō)是立即可見(jiàn)的
保證了有序性:volatile
禁止了指令重排,它能保證在對(duì)volatile
修飾的變量進(jìn)行操作時(shí),之前的代碼語(yǔ)句已經(jīng)全部被執(zhí)行,并且后面的語(yǔ)句都未執(zhí)行,但是對(duì)其他語(yǔ)句的順序是不做保證的
注意: volatile
不能保證原子性,因?yàn)椴荒鼙WC對(duì)變量的操作是原子性操作
在方法中修飾屬性,this理解為當(dāng)前對(duì)象
,用來(lái)區(qū)別成員方法和形參,通常省略
修飾方法,this理解為當(dāng)前對(duì)象,通常省略;不能在靜態(tài)方法中使用
調(diào)用構(gòu)造器,在構(gòu)造器中使用this(形參列表)
顯式調(diào)用指定的其他構(gòu)造器
必須在首行調(diào)用其他構(gòu)造器
一個(gè)構(gòu)造器中不能調(diào)用多個(gè)其他構(gòu)造器
不能在構(gòu)造器中調(diào)用遞歸調(diào)用,不能成環(huán)調(diào)用
super可以理解為:父類的
修飾屬性:去父類中找對(duì)應(yīng)屬性,用來(lái)區(qū)分子父類重名的屬性
修飾方法:調(diào)用重寫(xiě)之前的方法
調(diào)用構(gòu)造器:使用super(形參列表)
指定調(diào)用父類構(gòu)造器
super(形參列表)
必須放在構(gòu)造器的首行
super(形參列表)
和this(形參列表)
只能二選一
在構(gòu)造器首行如果沒(méi)有顯式聲明super(形參列表)
或this(形參列表)
則默認(rèn)調(diào)用父類的空參構(gòu)造器super()
(如果此時(shí)父類中沒(méi)有空參構(gòu)造器就會(huì)報(bào)錯(cuò))
不能在靜態(tài)方法中使用
當(dāng)一個(gè)方法和屬性被static屬性修飾時(shí),這些方法和屬性是優(yōu)先于對(duì)象加載進(jìn)入內(nèi)存的,是隨著類的加載而加載的;this是當(dāng)前對(duì)象的引用,super是指父類的引用,當(dāng)靜態(tài)方法加載進(jìn)內(nèi)存進(jìn)棧時(shí),如果在靜態(tài)方法中有this和super關(guān)鍵字時(shí),this和super也被加載到了內(nèi)存,但是這個(gè)時(shí)候并沒(méi)有對(duì)象的引用,this和super沒(méi)有初始化,所有編譯會(huì)報(bào)錯(cuò)。
public修飾類:
一個(gè)類中最多只能有一個(gè)public類,且文件名要和public類一致
如果沒(méi)有public類,文件名可以任意
感謝各位的閱讀,以上就是“Java重要的關(guān)鍵字有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java重要的關(guān)鍵字有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。