最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java內(nèi)部類(lèi)與對(duì)象的打印概念和流程

 更新時(shí)間:2021年10月20日 11:10:30   作者:Luka.lh  
在 Java 中,可以將一個(gè)類(lèi)定義在另一個(gè)類(lèi)里面或者一個(gè)方法里面,這樣的類(lèi)稱(chēng)為內(nèi)部類(lèi)。廣泛意義上的內(nèi)部類(lèi)一般來(lái)說(shuō)包括這四種:成員內(nèi)部類(lèi)、局部?jī)?nèi)部類(lèi)、匿名內(nèi)部類(lèi)和靜態(tài)內(nèi)部類(lèi)

一、內(nèi)部類(lèi)的概念

在 Java 中,可以將一個(gè)類(lèi)定義在另一個(gè)類(lèi)或者一個(gè)方法的內(nèi)部,前者稱(chēng)為內(nèi)部類(lèi),后者稱(chēng)為外部類(lèi)。內(nèi)部類(lèi)也是封裝的一種體現(xiàn)。

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

注意事項(xiàng):

1、內(nèi)部類(lèi)一定是定義在class 類(lèi)名{}之中的類(lèi),定義在class 類(lèi)名{}之外的,哪怕是在一份文件中,也并不能稱(chēng)為內(nèi)部類(lèi)。例如:

public class A{
}
class B{
}
//A和B兩個(gè)類(lèi)是獨(dú)立的,無(wú)內(nèi)外部類(lèi)一說(shuō)

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

二、內(nèi)部類(lèi)的分類(lèi)

public class OutClass {
    //普通內(nèi)部類(lèi)
    class InnerClass1{
 
    }
    //靜態(tài)內(nèi)部類(lèi)
    static class InnerClass2{
 
    }
    {
        //定義在實(shí)例代碼塊中的 局部?jī)?nèi)部類(lèi)
        class InnerClass3{
 
        }
    }
    static{
        //定義在靜態(tài)代碼塊中的 局部?jī)?nèi)部類(lèi)
        class InnerClass4{
 
        }
    }
    public void method(){
        //定義在方法中的 局部?jī)?nèi)部類(lèi)
        class InnerClass5{
 
        }
 
        {
            //方法中的普通代碼塊中也可以定義局部?jī)?nèi)部類(lèi)
            class InnerClass6{
 
            }
        }
    }
}

根據(jù)內(nèi)部類(lèi)定義的位置不同,可以分為:

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

局部?jī)?nèi)部類(lèi)和匿名內(nèi)部類(lèi)。

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

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

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

public class OutClass {//外部類(lèi)
    private int a;
    private int b;
    private int c;
 
    public void method1(){
        a=100;
        System.out.println(a);
    }
 
    public void method2(){
        System.out.println(b);
    }
 
    class InnerClass{      //普通內(nèi)部類(lèi)
        private int c;     //與外部類(lèi)成員變量名稱(chēng)相同的內(nèi)部成員變量
        public void methodInner() {
            //在內(nèi)部類(lèi)中可以直接訪問(wèn)外部類(lèi)任意限定符的成員變量和方法
            b = 150;
            method1();
            method2();
 
            //在訪問(wèn)與外部類(lèi)成員名稱(chēng)相同的成員時(shí),優(yōu)先訪問(wèn)內(nèi)部類(lèi)自己的成員
            c = 300;
            System.out.println(c);
            //要訪問(wèn)外部類(lèi)中的同名成員必須使用——— 外部類(lèi)名.this.成員名  來(lái)訪問(wèn)
            OutClass.this.c = 400;
            System.out.println(OutClass.this.c);
        }
    }
    public static void main(String[] args) {
        //創(chuàng)建內(nèi)部類(lèi)對(duì)象
        OutClass.InnerClass innerclass1=new OutClass().new InnerClass();
        //也可以先創(chuàng)建外部類(lèi)對(duì)象,再創(chuàng)建內(nèi)部類(lèi)對(duì)象
        OutClass outclass=new OutClass();
        //注意當(dāng)在不同文件中創(chuàng)建其內(nèi)部類(lèi)對(duì)象一定需要加上該內(nèi)部類(lèi)的外部類(lèi)名,同一文件下可加可不加
        OutClass.InnerClass innerclass2=outclass.new InnerClass();
        innerclass2.methodInner();
    }
}

/*
100
150
300
400
*/

注意事項(xiàng):

1、普通內(nèi)部類(lèi)中可以直接訪問(wèn)外部類(lèi)中的所有方法。

2、普通內(nèi)部類(lèi)成員的位置與外部類(lèi)成員位置相同,都受public,private等限定符的限制。

3、在普通內(nèi)部類(lèi)方法中訪問(wèn)同名的成員時(shí),優(yōu)先訪問(wèn)自己的,如果要訪問(wèn)外部類(lèi)同名的成員,必須:外部類(lèi)名稱(chēng).this.同名成員 來(lái)訪問(wèn)。

4、要?jiǎng)?chuàng)建普通內(nèi)部類(lèi)對(duì)象,要先創(chuàng)建外部類(lèi)的對(duì)象。在創(chuàng)建內(nèi)部類(lèi)對(duì)象時(shí),如果該內(nèi)部類(lèi)在當(dāng)前文件,則在創(chuàng)建對(duì)象語(yǔ)句最前面不需要外部類(lèi)名,如果在不同文件,那么一定要指明該內(nèi)部類(lèi)的外部類(lèi)名。

5、 普通內(nèi)部類(lèi)中包含了一個(gè)指向外部類(lèi)對(duì)象的引用。

6、外部類(lèi)中,不能直接訪問(wèn)內(nèi)部類(lèi)中的成員,如果要訪問(wèn)必須先要?jiǎng)?chuàng)建內(nèi)部類(lèi)的對(duì)象。

public class OutClass1 {
    private int a;
 
    public void method(){
        System.out.println(c); //在外部類(lèi)中直接訪問(wèn)內(nèi)部類(lèi)成員,編譯報(bào)錯(cuò)
    }
 
    class InnerClass{
        private int c;
    }
}
public class OutClass1 {
    private int a;
    public void methodOut(){
        InnerClass I2=new InnerClass();//在外部類(lèi)方法中創(chuàng)建內(nèi)部類(lèi)對(duì)象可以直接創(chuàng)建
        System.out.println(I2.c);
    }
    class InnerClass{
         private int c;
    }
}

從堆和棧的角度來(lái)看內(nèi)部類(lèi)和外部類(lèi):

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

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

public class OutClass {//外部類(lèi)
    private int a;
    static int b;      //靜態(tài)變量
 
    public void method1(){
 
    }
    public static void method2(){  //靜態(tài)方法
 
    }
 
    static class InnerClass{       //靜態(tài)內(nèi)部類(lèi)
        public void methodInner() {
            //在靜態(tài)內(nèi)部類(lèi)中只能訪問(wèn)外部類(lèi)的靜態(tài)成員和方法
            //  a=100;編譯失敗,a不是外部類(lèi)的成員變量
            b = 150;
            //  method1();編譯失敗,method1不是外部類(lèi)的成員方法
            method2();
        }
    }
    public static void main(String[] args) {
        //靜態(tài)內(nèi)部類(lèi)的創(chuàng)建
        InnerClass innerclass=new InnerClass();
        //成員訪問(wèn)
        innerclass.methodInner();
    }
}

注意事項(xiàng):

1、在內(nèi)部類(lèi)中只能訪問(wèn)外部類(lèi)中的靜態(tài)成員。

2、創(chuàng)建靜態(tài)內(nèi)部類(lèi)對(duì)象時(shí),不需要先創(chuàng)建外部類(lèi)對(duì)象。

3、成員內(nèi)部類(lèi),經(jīng)過(guò)編譯之后會(huì)生成自己獨(dú)立的字節(jié)碼文件,例如下:

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

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

public class OutClass {//外部類(lèi)
     int a=10;
 
    public void method(){              //外部類(lèi)方法
        int b=10;
        class InnerClass{              //局部?jī)?nèi)部類(lèi),只能在該方法體內(nèi)部使用
            public void methodInnerClass(){
                System.out.println(a);
                System.out.println(b);
            }
        }
        InnerClass innerclass=new InnerClass();
        innerclass.methodInnerClass();
    }
    public static void main(String[] args) {
        //InnerClass innerclass=null; 編譯失敗
    }
}

注意事項(xiàng):

1、局部?jī)?nèi)部類(lèi)只能在所定義的方法體內(nèi)部使用。

2、局部?jī)?nèi)部類(lèi)不能被public、static等限定符修飾。

3、同樣編譯之后局部?jī)?nèi)部類(lèi)會(huì)生成自己的字節(jié)碼文件。

命名格式:外部類(lèi)名$x內(nèi)部類(lèi)名.class, 其中x是一個(gè)整數(shù)。

五、對(duì)象的打印

public class Person {
    String name;
    String gender;
    int age;
    
    public Person(String name,String gender,int age){
        this.name=name;
        this.gender=gender;
        this.age=age;
    }
 
    public static void main(String[] args) {
        Person person=new Person("luka","man",21);
        System.out.println(person);
    }
}

打印結(jié)果: 并不是對(duì)象本身。

如果想要打印對(duì)象本身,那么需要重寫(xiě)toString方法。

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
 public String toString() {           //重寫(xiě)了toString方法
        return "[" + name + "," + gender + "," + age + "]";
    }
public class Person {
    String name;
    String gender;
    int age;
 
    public Person(String name,String gender,int age){
        this.name=name;
        this.gender=gender;
        this.age=age;
    }
 
    public String toString() {           //重寫(xiě)了toString方法
        return "[" + name + "," + gender + "," + age + "]";
    }
 
    public static void main(String[] args) {
        Person person=new Person("luka","man",21);
        System.out.println(person);
    }
}

/*
執(zhí)行結(jié)果:
[luka,man,21]
*/

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

相關(guān)文章

  • java實(shí)現(xiàn)一個(gè)簡(jiǎn)單TCPSocket聊天室功能分享

    java實(shí)現(xiàn)一個(gè)簡(jiǎn)單TCPSocket聊天室功能分享

    這篇文章主要為大家分享了java實(shí)現(xiàn)的一個(gè)簡(jiǎn)單TCPSocket聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • java多線程詳細(xì)總結(jié)

    java多線程詳細(xì)總結(jié)

    以下小編就對(duì)java中的多線程進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • Java實(shí)現(xiàn)簡(jiǎn)單棋盤(pán)存檔和讀取功能

    Java實(shí)現(xiàn)簡(jiǎn)單棋盤(pán)存檔和讀取功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單棋盤(pán)存檔和讀取功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 解決get請(qǐng)求入?yún)NotNull驗(yàn)證不生效問(wèn)題

    解決get請(qǐng)求入?yún)NotNull驗(yàn)證不生效問(wèn)題

    這篇文章主要介紹了解決get請(qǐng)求入?yún)NotNull驗(yàn)證不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解析SpringBoot中@Autowire注解的實(shí)現(xiàn)原理

    解析SpringBoot中@Autowire注解的實(shí)現(xiàn)原理

    在開(kāi)發(fā)Java項(xiàng)目時(shí),依賴(lài)注入是一種常見(jiàn)的實(shí)現(xiàn)方式,SpringBoot框架通過(guò)@Autowired注解來(lái)實(shí)現(xiàn)依賴(lài)注入的功能,本文將介紹SpringBoot中 Autowired注解實(shí)現(xiàn)的原理
    2023-06-06
  • Java經(jīng)典面試題匯總:多線程

    Java經(jīng)典面試題匯總:多線程

    本篇總結(jié)的是Java多線程相關(guān)的面試題,后續(xù)會(huì)持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實(shí)習(xí)生或者已經(jīng)工作的同行,如果發(fā)現(xiàn)錯(cuò)誤還望大家多多包涵,不吝賜教,謝謝
    2021-07-07
  • spring緩存代碼詳解

    spring緩存代碼詳解

    這篇文章主要介紹了spring緩存代碼詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 關(guān)于Controller 層返回值的公共包裝類(lèi)的問(wèn)題

    關(guān)于Controller 層返回值的公共包裝類(lèi)的問(wèn)題

    本文給大家介紹Controller 層返回值的公共包裝類(lèi)-避免每次都包裝一次返回-InitializingBean增強(qiáng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-09-09
  • Java泛型的繼承和實(shí)現(xiàn)操作示例

    Java泛型的繼承和實(shí)現(xiàn)操作示例

    這篇文章主要介紹了Java泛型的繼承和實(shí)現(xiàn)操作,結(jié)合實(shí)例形式分析了java泛型類(lèi)的繼承以及泛型接口的實(shí)現(xiàn)相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • MyBatis中的接口代理機(jī)制及其使用方式

    MyBatis中的接口代理機(jī)制及其使用方式

    這篇文章主要介紹了MyBatis中的接口代理機(jī)制及其使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論

久治县| 兰坪| 绥芬河市| 克拉玛依市| 延吉市| 苏州市| 泗阳县| 白城市| 顺昌县| 定南县| 海宁市| 百色市| 鱼台县| 灵川县| 常州市| 澜沧| 建德市| 岢岚县| 弥勒县| 象州县| 如东县| 马边| 英吉沙县| 包头市| 永宁县| 隆昌县| 建平县| 大英县| 大同市| 略阳县| 辽宁省| 克拉玛依市| 屯留县| 贡嘎县| 邯郸县| 彭泽县| 峨眉山市| 乐清市| 东安县| 陇南市| 富裕县|