天天看點

Java内部類一:内部類

内部類的分類

Java内部類一:内部類

内部類的概念

概念:在一個類的内部再定義一個類

public class Test01 {
    class Inner{
        
    }
}
           

特點:

  • 編譯後可直接生成獨立的位元組碼檔案
  • 内部類可以直接通路外部類的私有成員,不破壞封裝
  • 可以為外部類提供必要的内部功能元件
public class Test01 {
    private String name;
    class Inner{
        public void say(){
            System.out.println(name);
        }
    }
}
           

成員内部類

  • 在類的内部定義,與執行個體變量、執行個體方法同級别的類
  • 外部類的一個執行個體部分,建立内部類對象時,必須依賴外部類對象
  • 當外部類、内部類存在重名屬性時,會優先通路内部類屬性
  • 成員内部類不能定義靜态成員(可以包含靜态常量 static final修飾)
public class Test01 {
    private String name = "zheng";//外部屬性
    private int age = 23;
    class Inner{
    	private String name = "ben";
        private char sex = '男';//内部屬性
        private int tele = 12121;
        public void say(){
        	System.out.println(Test01.this.name);//通路外部類屬性(重名)
            System.out.println(name);
            System.out.println(age);
            System.out.println(sex);
            System.out.println(tele);
        }
    }
    public static void main(String[] args) {
    	//1.先建立外部類對象
        Test01 test01 = new Test01();
        //2.再建立内部類對象
        Inner inner = test01.new Inner();
        //或者:Inner inner = new Test01().new Inner();
        inner.say();
    }
}
           

結果:

Java内部類一:内部類

靜态内部類

  • 不依賴外部類對象,可直接建立或通過類名通路,可聲明靜态成員
  • 隻能直接通路外部類的靜态成員(執行個體成員需要執行個體化外部類對象)
public class Test02 {
    private String name = "zheng";
    private int age = 23;
    private static int add = 12;//外部類靜态屬性
    static class Inner{
        private char sex = '男';
        private static int phone = 123456;//靜态屬性
        public void say(){
            Test02 test02 = new Test02();//建立外部類對象再調用屬性
            System.out.println(test02.age);
            System.out.println(test02.name);
            System.out.println(sex);
            System.out.println(Inner.phone);
            System.out.println(add);//可以直接通路外部類靜态屬性
        }
    }
    public static void main(String[] args) {
        Test02.Inner inner= new Test02.Inner();
        inner.say();
    }
}
           

結果·:

Java内部類一:内部類

局部内部類

  • 定義在外部類的方法中,作用範圍和建立對象範圍僅限于目前方法
  • 局部内部類通路外部類目前方法中的局部變量時,因無法保障變量的生命周期與自身相同,變量必須修飾為final
  • 限制類的使用範圍
public class Test03 {
    private String name = "zheng";
    private int age = 23;
    public void say(){
        String address = "beijing";//局部變量
        class Inner{//不能添加任何通路修飾符
            private char sex = '男';
            private int phone = 12346;
            public void speak(){
                System.out.println(Test03.this.name);
                System.out.println(Test03.this.age);
                System.out.println(sex);
                System.out.println(phone);
                //通路局部變量,jdk1.8後自動添加final
                System.out.println(address);
            }
        }
        //建立局部内部類對象
        Inner inner = new Inner();
        inner.speak();
    }

    public static void main(String[] args) {
        Test03 test03 = new Test03();
        test03.say();
    }
}
           

結果:

Java内部類一:内部類

匿名内部類

  • 沒有類名的局部内部類
  • 必須繼承一個父類或實作一個接口
  • 定義類、實作類、建立對象的文法合并,隻能建立一個該類的對象。
  • 優點:減少代碼量。
  • 缺點:可讀性較差。
public class Test05 {
    public static void main(String[] args) {
        Usb usb = new Usb() {
            @Override
            public void service() {
                System.out.println("滑鼠開始工作。。。");
            }
        };
        usb.service();
    }
}