欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中內(nèi)部類(lèi)的概念與分類(lèi)詳解

 更新時(shí)間:2021年09月20日 10:34:10   作者:一朵花花  
一個(gè)類(lèi)的定義放在另一個(gè)類(lèi)的內(nèi)部,這個(gè)類(lèi)就叫做內(nèi)部類(lèi),下面這篇文章主要給大家介紹了關(guān)于Java中內(nèi)部類(lèi)的概念與分類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

只能使用修飾限定符:public 和 默認(rèn) 來(lái)修飾類(lèi)

內(nèi)部類(lèi)概念

在 Java 中,將一個(gè)類(lèi)定義在另一個(gè)類(lèi)的內(nèi)部,稱(chēng)為內(nèi)部類(lèi)

就是在一個(gè)類(lèi)內(nèi)部進(jìn)行其他類(lèi)結(jié)構(gòu)的嵌套操作

內(nèi)部類(lèi)也是封裝的一種體現(xiàn)

舉例:

//外部類(lèi)
public class OutClass {

    //內(nèi)部類(lèi)
    class InnerClass{
        
    }
}

注意:內(nèi)部類(lèi)和外部類(lèi)共享一個(gè) java源文件,但是經(jīng)過(guò)編譯之后,會(huì)形成各自單獨(dú)的字節(jié)碼文件

在這里插入圖片描述

內(nèi)部類(lèi)的分類(lèi):

成員內(nèi)部類(lèi)

在外部類(lèi)中,內(nèi)部類(lèi)定義位置與外部類(lèi)成員所處的位置相同,因此稱(chēng)為成員內(nèi)部類(lèi)

成員內(nèi)部類(lèi)有:普通內(nèi)部類(lèi)和靜態(tài)內(nèi)部類(lèi)

普通內(nèi)部類(lèi)

未被 static 修飾的成員內(nèi)部類(lèi)

//外部類(lèi)
public class OutClass {
    public void method(){

    }
    //普通內(nèi)部類(lèi)
    class InnerClass1{

    }
}

如何使用普通內(nèi)部類(lèi)??

先看普通類(lèi)的使用:

package Date20210917;

public class Test1 {
    int a;
    public void method1(){

    }
    //普通內(nèi)部類(lèi)
    class InnerClass{
        int b;
        void method2() {

        }
    }
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        test1.method1();
}

普通類(lèi):先構(gòu)造對(duì)象—通過(guò)對(duì)象訪問(wèn)類(lèi)內(nèi)部的成員

那么,我們可以試著 new 一個(gè) InnerClass 的對(duì)象:

在這里插入圖片描述

我們發(fā)現(xiàn)并不可行,因?yàn)?InnerClass 也是 外部類(lèi)的成員,所以我們在使用內(nèi)部類(lèi)時(shí),需借助外部類(lèi)的對(duì)象來(lái)創(chuàng)建內(nèi)部類(lèi)的對(duì)象

則正確操作:

public static void main(String[] args) {
    //普通類(lèi):先構(gòu)造對(duì)象—通過(guò)對(duì)象訪問(wèn)類(lèi) 內(nèi)部的成員
    Test1 test1 = new Test1();
    test1.method1();

    //普通內(nèi)部類(lèi)
    InnerClass innerClass = test1.new InnerClass();
    innerClass.method2();
}

不同文件下 普通內(nèi)部類(lèi)的使用:

package Date20210917;

//外部類(lèi)
public class OutClass {
    //測(cè)試Test1 中的內(nèi)部類(lèi)的使用:
    void test(){
        Test1 test1 = new Test1();
        //要實(shí)例化 Test1 中內(nèi)部類(lèi)的對(duì)象
        //InnerClass;   編譯器不能識(shí)別,因?yàn)樵擃?lèi)沒(méi)在此文件中
        Test1.InnerClass t = test1.new InnerClass();
    }
    public static void main(String[] args) {

    }
}

當(dāng)內(nèi)外部類(lèi)出現(xiàn)同名變量時(shí),使用就近原則~ 即:優(yōu)先訪問(wèn)內(nèi)部類(lèi)的

public class Test1 {
    int a;
    int b;
    public void method1(){

    }
    //普通內(nèi)部類(lèi)
    class InnerClass{
        int b;
        void method2() {
            a = 10;
            method1();
            b = 66; //給內(nèi)部類(lèi)自己的 成員變量 b 賦值
        }
    }
}

內(nèi)部類(lèi)中給同名外部類(lèi)成員變量賦值:

Test1.this.b = 88;

調(diào)試驗(yàn)證:

在這里插入圖片描述

即:編譯后,對(duì) method2 進(jìn)行以下修改

修改前:

void method2() {
    a = 10;
    method1();
    b = 66; //給內(nèi)部類(lèi)自己的 成員變量 b 賦值
    Test1.this.b = 88;
}

修改后:

void method2(InnerClass this){
	this$0.a = 10;
	method1(this$0);
	this.b = 66;
	Test1.this.b = 88;
}

總結(jié):

  1. 普通內(nèi)部類(lèi)對(duì)象必須在先有外部類(lèi)對(duì)象前提下才能創(chuàng)建
  2. 外部類(lèi)中,不能直接訪問(wèn)內(nèi)部類(lèi)中的成員,如果要訪問(wèn)必須先要?jiǎng)?chuàng)建內(nèi)部類(lèi)的對(duì)象
  3. 外部類(lèi)中的任何成員都可以被在普通內(nèi)部類(lèi)方法中直接訪問(wèn)
  4. 在內(nèi)部類(lèi)方法中訪問(wèn)同名的成員時(shí),優(yōu)先訪問(wèn)自己的(就近原則),如果要訪問(wèn)外部類(lèi)同名的成員,必須:外部類(lèi)名稱(chēng).this.同名成員 來(lái)訪問(wèn)

靜態(tài)內(nèi)部類(lèi)

被 static 修飾的內(nèi)部成員類(lèi)稱(chēng)為靜態(tài)內(nèi)部類(lèi)

public class Test2 {
    int a;
    int b;
    static int c;
    static void method1(){
        System.out.println("我是method()");
    }
    static class InnerClass{
        int d;
        static int e;
        void method2(){

        }
    }
}

靜態(tài)內(nèi)部類(lèi)對(duì)象的創(chuàng)建

1.同文件中創(chuàng)建:

//靜態(tài)成員變量的訪問(wèn)
System.out.println(Test2.c);

//不需要借助外部類(lèi)對(duì)象來(lái)創(chuàng)建
InnerClass innerClass = new InnerClass();

2.不同文件里 創(chuàng)建:

void test2(){
    //靜態(tài)成員變量的訪問(wèn):
    System.out.println(Test2.c);

    //靜態(tài)內(nèi)部類(lèi)對(duì)象 (類(lèi)比靜態(tài)成員變量的訪問(wèn))
    Test2.InnerClass t = new Test2.InnerClass();
    //靜態(tài)內(nèi)部類(lèi)對(duì)象可以直接創(chuàng)建,不需要依賴(lài)外部類(lèi)對(duì)象

}

靜態(tài)內(nèi)部類(lèi)方法里能否訪問(wèn)外部類(lèi)的對(duì)象?

在這里插入圖片描述

由上圖可得到:在靜態(tài)內(nèi)部類(lèi)中,只能訪問(wèn)外部類(lèi)中的靜態(tài)成員變量和靜態(tài)成員方法

注意事項(xiàng):

  • 在內(nèi)部類(lèi)中只能訪問(wèn)外部類(lèi)中的靜態(tài)成員
  • 在同一文件中創(chuàng)建內(nèi)部類(lèi)對(duì)象時(shí),可以直接創(chuàng)建,不需要借助外部類(lèi)對(duì)象
  • 在不同文件中創(chuàng)建內(nèi)部類(lèi)對(duì)象時(shí),也可直接創(chuàng)建:所在文件名稱(chēng).內(nèi)部類(lèi)名稱(chēng).對(duì)象名
  • 成員內(nèi)部類(lèi),經(jīng)過(guò)編譯之后會(huì)生成獨(dú)立的字節(jié)碼文件,命名格式為:外部類(lèi)名稱(chēng)$內(nèi)部類(lèi)名稱(chēng)

在這里插入圖片描述

局部?jī)?nèi)部類(lèi)

定義在外部類(lèi)的方法體或者 { } 中,該種內(nèi)部類(lèi)只能在其定義的位置使用,一般很少使用

//外部類(lèi)
public class OutClass {

    public void method(){
        //局部?jī)?nèi)部類(lèi)
        class InnerClass3{

        }
    }
	{   //局部?jī)?nèi)部類(lèi)
		class InnerClass4{

		}
    }
}

不能被訪問(wèn)修飾限定符修飾:

在這里插入圖片描述

不能再局部?jī)?nèi)部類(lèi)中定義靜態(tài)成員

在這里插入圖片描述

不能再局部?jī)?nèi)部類(lèi)中定義靜態(tài)方法

在這里插入圖片描述

注意事項(xiàng):

局部?jī)?nèi)部類(lèi)只能在所定義的方法體內(nèi)部使用不能被public、static等修飾符修飾編譯器也有自己獨(dú)立的字節(jié)碼文件,命名格式:外部類(lèi)名字$x內(nèi)部類(lèi)名字.class,x是一個(gè)整數(shù) 匿名內(nèi)部類(lèi)(這里不做講解)

總結(jié)

到此這篇關(guān)于Java中內(nèi)部類(lèi)的概念與分類(lèi)的文章就介紹到這了,更多相關(guān)Java內(nèi)部類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在SpringBoot項(xiàng)目中解決依賴(lài)沖突問(wèn)題的方法

    在SpringBoot項(xiàng)目中解決依賴(lài)沖突問(wèn)題的方法

    在SpringBoot項(xiàng)目中,依賴(lài)沖突是一個(gè)常見(jiàn)的問(wèn)題,特別是當(dāng)項(xiàng)目引入多個(gè)第三方庫(kù)或框架時(shí),依賴(lài)沖突可能導(dǎo)致編譯錯(cuò)誤、運(yùn)行時(shí)異?;虿豢深A(yù)測(cè)的行為,本文給大家介紹了如何在SpringBoot項(xiàng)目中解決以來(lái)沖突問(wèn)題的方法,需要的朋友可以參考下
    2024-01-01
  • SpringMVC之@requestBody的作用及說(shuō)明

    SpringMVC之@requestBody的作用及說(shuō)明

    這篇文章主要介紹了SpringMVC之@requestBody的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Java中List<T>和List<?>的區(qū)別詳解

    Java中List<T>和List<?>的區(qū)別詳解

    這篇文章主要介紹了Java中List<T>和List<?>的區(qū)別詳解。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • springboot實(shí)現(xiàn)FastJson解析json數(shù)據(jù)的方法

    springboot實(shí)現(xiàn)FastJson解析json數(shù)據(jù)的方法

    本篇文章主要介紹了springboot實(shí)現(xiàn)FastJson解析json數(shù)據(jù)的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 超實(shí)用的Java快捷鍵(總結(jié))

    超實(shí)用的Java快捷鍵(總結(jié))

    下面小編就為大家?guī)?lái)一篇超實(shí)用的Java快捷鍵(總結(jié))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • IDEA?隱藏DEBUG日志的解決方法

    IDEA?隱藏DEBUG日志的解決方法

    IDEA?打印太多的DEBUG日志,看起來(lái)很煩,有沒(méi)有辦法隱藏日志,網(wǎng)上找了一圈,沒(méi)有誰(shuí)寫(xiě)的靠譜的,下面小編給大家分享下IDEA?如何隱藏DEBUG日志,需要的朋友可以參考下
    2022-09-09
  • Springboot自動(dòng)配置原理及DataSource的應(yīng)用方式

    Springboot自動(dòng)配置原理及DataSource的應(yīng)用方式

    這篇文章主要介紹了Springboot自動(dòng)配置原理及DataSource的應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Myeclipse工程發(fā)布時(shí)端口占用問(wèn)題的解決方法

    Myeclipse工程發(fā)布時(shí)端口占用問(wèn)題的解決方法

    這篇文章主要介紹了Myeclipse工程發(fā)布時(shí)端口占用問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • logback高效狀態(tài)管理器StatusManager源碼解析

    logback高效狀態(tài)管理器StatusManager源碼解析

    這篇文章主要為大家介紹了logback高效狀態(tài)管理器StatusManager源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論