溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java重要的關(guān)鍵字有哪些

發(fā)布時(shí)間:2022-07-28 10:31:42 來(lái)源:億速云 閱讀:116 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“Java重要的關(guān)鍵字有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java重要的關(guān)鍵字有哪些”吧!

    1.extends

    • 用于類繼承類,用法: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)該接口繼承的接口的方法

    2.implements

    • 用于聲明一個(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)類似多繼承

    3.final

    使用方法:

    • 修飾,使該類不能被繼承

    • 修飾方法,使該方法不能被子類重寫(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)有意義

    • finalstatic同時(shí)修飾的屬性在調(diào)用時(shí)不會(huì)導(dǎo)致類的加載,效率更高

    4.native

    基本介紹:

    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ǔ)言交互

    JNIJava平臺(tái)的一部分,它允許Java代碼和其他語(yǔ)言寫(xiě)的代碼進(jìn)行交互。

    Java重要的關(guā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程序的功能,提高程序的效率

    5.static

    修飾變量,成為靜態(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)方法中不允許使用thissuper關(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)用該成員,大大提高了編程效率

    6.transient

    基本介紹:

    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();
        }
    }

    Java重要的關(guān)鍵字有哪些

    Java重要的關(guān)鍵字有哪些

    可以在Cat.txt文件內(nèi)看到兩個(gè)成員變量都能被序列化,并且能被反序列化讀出信息。

    當(dāng)小花貓覺(jué)得自己的年齡是隱私不想被讀出時(shí),transient修飾成員變量age:

    ......
    private String name;
    private transient int age; //使用transient修飾
    ......

    Java重要的關(guān)鍵字有哪些

    Java重要的關(guān)鍵字有哪些

    這時(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)

    7.synchronized

    基本介紹:

    關(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();
            }
        }
    }

    Java重要的關(guān)鍵字有哪些

    兩個(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();
            }
        }
    }

    Java重要的關(guān)鍵字有哪些

    雖然兩個(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 + "次");
                }
            }
        }
    }

    Java重要的關(guān)鍵字有哪些

    同步代碼塊用兩個(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ì)變量的操作是原子性操作

    9.this

    • 在方法中修飾屬性,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)用

    10.super

    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ò)。

    10.1.子類對(duì)象實(shí)例化的過(guò)程

    Java重要的關(guān)鍵字有哪些

    11.訪問(wèn)修飾符

    Java重要的關(guān)鍵字有哪些

    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)注!

    向AI問(wèn)一下細(xì)節(jié)

    免責(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)容。

    AI