1. 程式人生 > >java核心技術-內部類

java核心技術-內部類

高階類特性-(類的成員之一:內部類)

內的成員之一:內部類(屬性、方法、構造器、程式碼塊) 可以有四種許可權訪問修飾符

注意:外部類 只有兩種 public 和 default

定義 : 可以將一個類的定義放在另一個類定義的內部,這就是內部類 -thinking in Java

用法:如果一個類 僅跟本類關係密切的話 對於其他類希望隱藏 就可以使用內部類 例ArrayList中的 Itr

一.成員內部類

成員內部類也是最普通的內部類,它是外圍類的一個成員。

在成員內部類中要注意兩點,第一:成員內部類中不能存在任何static的變數和方法;第二:成員內部類是依附於外圍類的,所以只有先建立了外圍類才能夠建立內部類。

public class TestInnerClass {
    public static void main(String[] args) {
        //建立非靜態內部類的物件
        Person p = new Person();
        Person.Computer pc = p.new Computer();
        pc.setName("IBM");
        //System.out.println(pc.getName());
    }
}
 class Person {
    private String name = "張三";
    private int age;
    
    public Person() {
        super();
    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    public class Computer{
        private String name = "lenovo";

        public String getName() {
            return name;
        }

        public void setName(String name) {
            System.out.println("setName 方法區域性變數name: " + name);
            System.out.println("Computer 的屬性name:" + this.name);
            System.out.println("外部內Person 屬性的name:" + Person.this.name);
            this.name = name;
        }
        
    }
    
}

二.區域性內部類

有這樣一種內部類,它是巢狀在方法和作用於內的,對於這個類的使用主要是應用與解決比較複雜的問題,想建立一個類來輔助我們的解決方案,到那時又不希望這個類是公共可用的,所以就產生了區域性內部類,區域性內部類和成員內部類一樣被編譯,只是它的作用域發生了改變,它只能在該方法和屬性中被使用,出了該方法和屬性就會失效。(做Java後端 用法極少見 本人三年開發 從沒見過有人用過)

public class TestInnerClass2 {
    
    //區域性內部類:如下方式使用非常的少
    private void show(){
        
        class Inner{
            
        }
    }

    //如果一個類僅適用於當前方法時,可以宣告如下方式
    public static Comparator getComparator(){
        
        class MyComparator implements Comparator{

            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
            
        }
        return new MyComparator();
    }

    
    public static void main(String[] args) {
        Comparator comparator = TestInnerClass2.getComparator();
    }
}

三.匿名內部類

注意:

  • 1.匿名內部類是沒有訪問修飾符的
  • 2.想使用外部的一個變數 該變數要用final修飾 -java8開始不需要
public class TestInnerClass2 {
    
    public static Comparator getComparator1(){
        
        Comparator com = new Comparator(){ //匿名內部類實現的Comparator介面,new的是匿名內部類的構造器

            @Override
            public int compare(Object o1, Object o2) {
                // TODO Auto-generated method stub
                return 0;
            }
            
        };
        
        return com;
    }
    
    public static void main(String[] args) {
        Comparator comparator = TestInnerClass2.getComparator1();
        /*  comparator.compare(o1, o2);*/
    }
}

四.靜態內部類

在java提高篇-----關鍵字static中提到Static可以修飾成員變數、方法、程式碼塊,其他它還可以修飾內部類,使用static修飾的內部類我們稱之為靜態內部類,不過我們更喜歡稱之為巢狀內部類。靜態內部類與非靜態內部類之間存在一個最大的區別,它是屬於類本身,而不是某個物件。

public class TestInnerClass {
    public static void main(String[] args) {
        //建立靜態內部類的例項
        Person.Mobile pm = new Person.Mobile();
        pm.show();
    
    }
}

class Person {
    
    //靜態內部類
    static class Mobile{
        public void show(){
            System.out.println("這是靜態內部類的方法");
        }
    }
    
}

五.內部類識別符號

由於每個類都會產生一個.class檔案,其中包含了如何建立該型別的物件的全部資訊。您可能猜到了,內部類也必須生成一個.class檔案以包含它們的Class物件資訊。這些類檔案的命名有嚴格的規則:外圍類的名字,加上$,再加上內部類的名字。
如果內部類是匿名的,編譯器會簡單地產生一個數字作為其識別符號。