標籤:匿名內部類 封裝 java 隱藏
部分內容參考http://www.imooc.com/
內部類:
什麼是 Java 中的內部類
問:什麼是內部類呢?
答:內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。
問:那為什麼要將一個類定義在另一個類裡面呢?清清爽爽的獨立的一個類多好啊!!
答:內部類的主要作用如下:
1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接存取外部類的所有資料,包括私人的資料
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便,重寫外部類的方法
問:內部類有幾種呢?
答:內部類可分為以下幾種:
1. 成員內部類
2. 靜態內部類
3. 方法內部類
4. 匿名內部類
下面是一個內部類例子
//外部類HelloWorldpublic 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); } }}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java中的內部類和匿名內部類的使用