Java四種內部類


成員
成員內部類
靜態內部類
局部
方法內部類
匿名內部類

依賴外部類對象的:成員內部類,方法內部類,匿名內部類
靜態內部類不依賴外部類的對象,所以,我們在項目中優先考慮選擇靜態內部類
package QianFeng02;
//內部類
public class InnerTest {
    public static void main(String[] args){
        //在外部創建成員內部類實例,
        Outer outer=new Outer();
//         因為成員內部類需要依賴外部類的對象,不建議這樣創建
//        Outer.Inner2 inner2=outer.new Inner2();
//        inner2.print();
        outer.innerPrint();//通過innerPrint訪問內部類
        outer.show();//方法內部類

        Outer.Inner3 inner3=new Outer.Inner3();    //靜態類直接:類名.內部靜態類名
        inner3.print();

        outer.print11();//(1.繼承式)
        outer.print2();//(2.匿名類的 接口式)
        outer.print3(new Eat(){//(匿名內部類 3.參數式)
            public void eat() {
                System.out.println("匿名內部類 3.參數式");
            }
        });//(3.參數式匿名類)
    }
}
class Outer{
    private String name="除了靜態內部類,內部類成可以很方便使用成員變量";
//----------------1.成員內部類----------------
    public void innerPrint(){//建議在外部類中定義一個方法,對外提供訪問內部類接口
        Inner2 inner2=new Inner2();
        inner2.print();
    }
    //內部類(封裝性)

    class Inner2{//1.成員內部類
        private void print(){
            System.out.println("{成員內部類}"+name);
        }
    }
//    ----------------2.方法內部類---- ----------
    public void show(){
        final int x=10;  //方法內部類的引用的變量 必須是常量(final),不寫聲明默認final
        class Inner2{
            public void print(){
                System.out.println("{方法內部類}"+x+name);//為什么用final呢?
            }
        }
        Inner2 inner2=new Inner2();//調用方法內部類(在方法里面調用實例化)不能在方法外實例化
        inner2.print();
    }
    //----------------3.靜態內部類----------------
/*
在一個類內部定義一個靜態內部類:
靜態的含義是該內部類可以像其它靜態成員一樣,沒有外部類對象時,可以直接訪問
靜態嵌套僅能訪問外部類的靜態成員和方法
*/
static class Inner3{
    public void print(){
        System.out.println("靜態內部類");
        }
    }
//----------------4.匿名內部類----------------
    /*1.不能有構造方法
      2.不能定義任何靜態成員,方法
      3.不能是public.protected,private,static
      4.一定是在new的后面,用其隱含一個接口或者實現一個類
      5.匿名內部類為局部的,所以局部內部類的所有限制都對其生效
    * */
    //(1.繼承式)
    public void print11(){
        CatGame cat=new CatGame(){
            public  void game(){
                System.out.println("貓玩");
            }
        };
        cat.game();
    }
    //*(2.接口式)
    public void print2(){
    Eat e=new Eat(){
        @Override
        public void eat() {
            System.out.println("匿名類的 接口式");
        }
    };
    e.eat();
    }
    //(3.參數式)
    public void print3(Eat eat){//傳入接口
        eat.eat();
    }

}
interface Eat{
    public void eat();
}

abstract class CatGame{
    public abstract void game();
}
/*
方法內部類的引用的變量 必須是常量(final)
為什么用final呢?
final 修飾變量是 常量,會把變量進入到常量池,延長生命周期,以免被銷毀
jdk1.8 可以不寫final ,系統會默認 final.
*/

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM