1. 程式人生 > >java中的內部類和匿名內部類的使用

java中的內部類和匿名內部類的使用

什麼是 Java 中的內部類
問:什麼是內部類呢?
答:內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。
問:那為什麼要將一個類定義在另一個類裡面呢?清清爽爽的獨立的一個類多好啊!!
答:內部類的主要作用如下:
1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接訪問外部類的所有資料,包括私有的資料
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便,重寫外部類的方法
問:內部類有幾種呢?
答:內部類可分為以下幾種:
1. 成員內部類
2. 靜態內部類
3. 方法內部類
4. 匿名內部類

下面是一個內部類例子

//外部類HelloWorld
public class HelloWorld {

    // 內部類Inner,類Inner在類HelloWorld的內部
    public class Inner {

        // 內部類的方法
        public void show() {
            System.out.println("welcome to imooc!");
        }
    }

    public static void main(String[] args) {

        // 建立外部類物件
        HelloWorld hello = new
HelloWorld(); // 建立內部類物件 Inner i = hello.new Inner(); // 呼叫內部類物件的方法 i.show(); } }

匿名內部類:
是不能有名稱的類,所以沒辦法引用它們。必須在建立時,作為new語句的一部分來宣告它們。這就要採用另一種形式的new語句,如下所示: new <類或介面> <類的主體>
作用是:
1.和內部類一樣,可以對外部類進行擴充套件,重寫或新增加方法。
2.用於實現介面
3.沒有類名

//新建一個介面
public interface
Animal {
void eat(); void sleep(); } //新建一個類,在類裡面使用 內部類和內部匿名類去實現介面 public class Zoo { private class Tiger implements Animal { public void eat() { System.out.println("tiger eat"); } public void sleep() { System.out.println("tiger sleep"); } } /** * 這裡不明白,Animal不是介面麼,怎麼可以定義方法? * ---答案 介面可以作為返回型別,指定返回的型別必須是實現當前介面的類. * @return */ /** * // 由於介面不是不能例項化的,所以必須通過類來實現,這裡使用返回一個(已實現該介面的物件) * 具體寫法有兩種,寫法2容易理解 * @return */ //---------------------------寫法1-----匿名內部類-------------------------------- Animal getAnimal1(){ return new Animal(){ public void eat() { System.out.println("---1---animal eat"); } public void sleep() { System.out.println("---1---animal sleep"); } }; } //---------------------------寫法2------內部類-------------------------- Animal getAnimal2(){ return new TempAnimal(); } class TempAnimal implements Animal{ int a = 0; public void eat() { System.out.println("---2---animal eat"); } public void sleep() { System.out.println("---2---animal sleep"); } } } //新建一個測試類 public class Test { public static void main(String[] args) { Zoo z = new Zoo(); Animal an = z.getAnimal1(); an.eat(); an.sleep(); Animal one = z.getAnimal2(); one.eat(); one.sleep(); } }
匿名內部類是內部類的一種簡化寫法:return new Wrapper{...};等價於:Wrapped extends Wrapper{...}return new Wrapped();難道匿名內部類就只這一點作用嗎?考慮一下這樣的case:

interface ICount {
    int count();
}

class Parent {
    int i = 0;

    int count() {
        return i++;
    }
}
有一個類Child,它既想繼承Parent的count()方法,又想實現ICount介面中的count方法,這個時候怎麼辦呢?內部類就可以大顯身手了:

class Child extends Parent {
    ICount getCount() {
        return new ICount {
            int i = 0;

        int count() {
            return (i *= 2);
        }
    }
}