java 內(nèi)部類

內(nèi)部類

內(nèi)部類:一個(gè)類定義在另外一個(gè)類的內(nèi)部,那么該類就稱作為內(nèi)部類。

內(nèi)部類的class文件名: 外部類$內(nèi)部類. 好處:便于區(qū)分該class文件是屬于哪個(gè)外部類的。

內(nèi)部類的類別:

一 :成員內(nèi)部類

成員內(nèi)部類的訪問方式

  • 在外部類提供一個(gè)方法創(chuàng)建內(nèi)部類的對(duì)象進(jìn)行訪問。
  • 在其他類直接創(chuàng)建內(nèi)部類的對(duì)象。 格式:
    外部類.內(nèi)部類 變量名 = new 外部類().new 內(nèi)部類();
    注意: 如果是一個(gè)靜態(tài)內(nèi)部類,那么在其他類創(chuàng)建 的格式:
    外部類.內(nèi)部類 變量名 = new 外部類.內(nèi)部類();

內(nèi)部類的應(yīng)用場(chǎng)景
我們?cè)诿枋鯝事物的時(shí)候,發(fā)現(xiàn)描述的A事物內(nèi)部還存在另外一個(gè)比較復(fù)雜的事物B時(shí)候,而且這個(gè)比較復(fù)雜事物B還需要訪問A事物的屬性等數(shù)據(jù),那么這時(shí)候我們就可以使用內(nèi)部類描述B事物。

比如: 人--->心臟

class 人{(lán)        
    血
    氧氣
    等....
    class 心臟{
            
    }       
}

內(nèi)部類的好處:內(nèi)部類可以直接訪問外部類的所有成員。

內(nèi)部類要注意的細(xì)節(jié)

  1. 如果外部類與內(nèi)部類存在同名的成員變量時(shí),在內(nèi)部類中默認(rèn)情況下是訪問內(nèi)部類的成員變量。
    可以通過"外部類.this.成員變量名" 指定訪問外部類的 成員。
  2. 私有的成員內(nèi)部類只能在外部類提供一個(gè)方法創(chuàng)建內(nèi)部類的對(duì)象進(jìn)行訪問,不能在其他類創(chuàng)建對(duì)象了。
  3. 成員內(nèi)部類一旦出現(xiàn)了靜態(tài)的成員,那么該類也必須 使用static修飾。
//外部類
class Outer{
    
    //成員變量
    int x = 100; 

    //成員內(nèi)部類
    static class Inner{      
        
        static int i = 10;

        public void print(){
            System.out.println("這個(gè)是成員內(nèi)部類的print方法!"+i);
        }
    }

    
    //在外部的方法中創(chuàng)建了內(nèi)部類的對(duì)象,然后調(diào)用內(nèi)部 方法。
    public void instance(){
        Inner inner = new Inner();
        inner.print();
    }

}



//其他類
class Demo4 
{
    public static void main(String[] args) 
    {
        /*
        System.out.println(Outer.Inner.i); //訪問靜態(tài)內(nèi)部類的靜態(tài)變量
        
        //內(nèi)部類的兩種創(chuàng)建方式
        Outer outer = new Outer();
        outer.instance();
        
        Outer.Inner inner = new Outer().new Inner();
        inner.print();
        */

        //靜態(tài)內(nèi)部類的創(chuàng)建方式
        Outer.Inner inner = new Outer.Inner();
        inner.print();
    }
}

二:局部?jī)?nèi)部類
/*
局部?jī)?nèi)部類: 在一個(gè)類 的方法內(nèi)部定義另外一個(gè)類,那么另外一個(gè)類就稱作為局部?jī)?nèi)部類。

局部?jī)?nèi)部類要注意的細(xì)節(jié):
    1. 如果局部 內(nèi)部類訪問了一個(gè)局部變量,那么該局部變量必須使用final修飾、

*/
class  Outer{

    String name= "外部類的name";

    public void test(){
        //局部變量
        final   int y =100;  // y 什么時(shí)候從內(nèi)存中消失? 方法執(zhí)行完畢之后y消失。

        //局部?jī)?nèi)部類
        class Inner{     /*
                            當(dāng)test方法執(zhí)行完畢之后,那么y馬上從內(nèi)存中消失,而Inner對(duì)象在方法
                            執(zhí)行完畢的時(shí)候還沒有從內(nèi)存中消失,而inner對(duì)象的print方法還在訪問著
                            y變量,這時(shí)候的y變量已經(jīng)消失了,那么就給人感覺y的生命變量已經(jīng)被延長(zhǎng)了
                            .

                            解決方案: 如果一個(gè)局部?jī)?nèi)部類訪問一個(gè)局部變量的時(shí)候,那么就讓該局部?jī)?nèi)部類
                            訪問這個(gè)局部 變量 的復(fù)制品。             
                        */
            int x = 10;

            public void print(){
                System.out.println("這個(gè)是局部?jī)?nèi)部類的print方法.."+y);
            }   
        }
        
        Inner inner = new Inner();  //這個(gè)inner對(duì)象什么時(shí)候消失?  Inner對(duì)象的生命周期比局部變量y的生命周期要長(zhǎng)。
        inner.print();
    }


}


class Demo5 
{
    public static void main(String[] args) 
    {
        Outer outer = new Outer();
        outer.test();
    }
}
三:匿名內(nèi)部類
/*

匿名內(nèi)部類:沒有類名的類就稱作為匿名內(nèi)部類。

匿名內(nèi)部類的好處:簡(jiǎn)化書寫。

匿名內(nèi)部類的使用前提:必須存在繼承或者實(shí)現(xiàn)關(guān)系才能使用。


匿名內(nèi)部類一般是用于實(shí)參。


*/

abstract class Animal{
    
    public abstract Animal run();

    public abstract void sleep();
}


class Outer{

    public void print(){
        //需求: 在方法內(nèi)部定義一個(gè)類繼承Animal類,然后調(diào)用run方法與sleep()。
        
        /*
        //局部?jī)?nèi)部類
        class Dog extends Animal{
            
            public void run(){
                System.out.println("狗在跑..");
            }

            public void sleep(){
                System.out.println("狗趴在睜開眼睛睡..");
            }
        }
        
        //創(chuàng)建對(duì)象
        Dog d = new Dog();
        d.run();    
        d.sleep();
        */  
        //匿名內(nèi)部類 :匿名內(nèi)部類只是沒有類名,其他的一概成員都是具備的。
        // 匿名內(nèi)部類與Animal是繼承 的關(guān)系。  目前是創(chuàng)建Animal子類的對(duì)象. 
    Animal  a = new Animal(){  //多態(tài)
        
            //匿名內(nèi)部的成員 
            public Animal run(){
                System.out.println("狗在跑..");
                return this;
            }
            
            public void sleep(){
                System.out.println("狗趴在睜開眼睛睡..");
            }

            //特有的方法
            public void bite(){
                System.out.println("狗在咬人..");
            }
    
        };//.run()/.sleep()/.bite()  可以通過這種方式調(diào)用成員方法和自已特有方法
    
        //a.bite(); 不能這樣調(diào)用子類的特有方法
        a.run();
        a.sleep();
        
    }
}



class Demo6 
{
    public static void main(String[] args) 
    {
    
        Outer outer = new Outer();
        outer.print();
    
    }
}

匿名內(nèi)部類應(yīng)用場(chǎng)景
/*
匿名內(nèi)部類的應(yīng)用場(chǎng)景:
在主方法中需要使用Dao這個(gè)接口的一個(gè)方法,那么沒有必要為了一個(gè)方法去實(shí)現(xiàn)一個(gè)接口
所以可以使用匿名的內(nèi)部類
*/
//實(shí)現(xiàn)關(guān)系下匿名內(nèi)部類
interface Dao{

    public void add();
}

class Outer{

    public void print(){
        //創(chuàng)建一個(gè)匿名內(nèi)部類的對(duì)象
        new Dao(){   
             
             public void add(){
                System.out.println("添加成功");
             }
        }.add();
    }
}

class Demo7 
{
    public static void main(String[] args) 
    {
        test(new Dao(){
            
            public void add(){
                System.out.println("添加員工成功");
            }
        });


    }

    //調(diào)用這個(gè)方法...
    public static void  test(Dao d){  //形參類型是一個(gè)接口引用..
        d.add();
    }
}



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Java 內(nèi)部類 分四種:成員內(nèi)部類、局部?jī)?nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類。 1、成員內(nèi)部類: 即作為外部類的一個(gè)成...
    ikaroskun閱讀 1,253評(píng)論 0 13
  • 如果文章對(duì)你有所幫助,請(qǐng)點(diǎn)喜歡并關(guān)注,這將是我最大的動(dòng)力,謝謝 為什么要有內(nèi)部類 1.內(nèi)部類是為了更好的封裝,把內(nèi)...
    光哥很霸氣閱讀 9,783評(píng)論 -1 31
  • [toc] 內(nèi)部類 內(nèi)部類作為外部類的成員,可以使用人已訪問控制符修飾。 外部類的上一級(jí)程序單元是包,所以只有兩個(gè)...
    卡路fly閱讀 323評(píng)論 0 2
  • 連續(xù)一個(gè)星期以來天氣總是陰沉沉,去查天氣預(yù)報(bào)則一直報(bào)告說將幾天有大雨,四天過去了,甚至連一點(diǎn)點(diǎn)的水都欠奉。 期待的...
    說書客閱讀 75評(píng)論 0 0
  • 早在自己少女時(shí)期,看蘇青的《結(jié)婚十年》,小說的開頭便描述女主結(jié)婚當(dāng)天的種種狀況。 其中寫到,在男方的花轎未進(jìn)女方家...
    summer_景閱讀 2,099評(píng)論 5 12