內部類常見的幾中形式:
- 外部類中聲明內部類,實現暴露給客戶端的接口,這樣可以達到影藏接口內部實現. 同時可以關閉對接口的實現的擴展.
public interface Selector<T> {
/**
* <P>返回<tt>true</tt>表示還有下一個.</P>
* @return
*/
boolean hasNext() ;
/**
* <P>返回下一個.</P>
* @return
*/
T next() ;
}
//SelectService
public class SelectService<E> {// as list
private Object[] items ;
private int next =0 ;
private int count ; //實際字符串個數
public SelectService() {
//
this.items = new Object[10] ;
this.count = 0 ;
}
public SelectService(Collection<? extends E>[] items) {
this.items = items ;
this.count = items.length ;
this.next = this.count;
}
public boolean add(E value) {
if (this.next > this.count) {
return false ;
}
this.items[next++] = value ;
this.count ++ ;
return true ;
}
public Selector<E> selector() {
return new Selectes<E>() ;
}
private class Selectes<E> implements Selector<E> {
private int index = 0 ;
@Override
public boolean hasNext() {
return count !=0 && index < count;
}
@Override
public E next() {
if (index >= count) {
return null ;
}
return (E)items[index++] ;
}
}
}
//test
SelectService selectService = new SelectService() ;
selectService.add("hello") ;
selectService.add("word") ;
selectService.add("palm") ;
selectService.add("123") ;
selectService.add("345") ;
Selector<String> stringSelector = selectService.selector() ;
//
while (stringSelector.hasNext()) {
String str = stringSelector.next() ;
System.out.println("str -- " + str);
}
沒有解決 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
;
以上代碼類似與JDK
類集迭代器實現(Iterator
). ArrayList
,Set
等. 不過各個子類實現有部分區別.比如 ArrayList
的抽象父類 是在方法中實現接口Iterator
.
2.方法內部聲明內部類.例如:
public class InnerService {
public Inter desc(String s) {
class InnerTest implements Inter {
@Override
public String say() {
return this.label ;
}
@Override
public int value(int num) {
return 0;
}
private String label ;
public InnerTest(String str) {
this.label = str ;
}
public String getLabel() {
return this.label ;
}
}
return new InnerTest(s) ;
}
public static void main(String[] args) {
InnerService innerService = new InnerService() ;
Inter inter = innerService.desc("hello") ;
System.out.println(inter.say());
}
在方法desc
結束后仍然存在InnerTest
對象引用. 由于我經驗太少,目前還不明白方法內實現內部類有那些特別的作用. 我只知道內部類的作用范圍減小了.
3.匿名內部類.
在工作中,匿名內部類是我見到的第二多的情況的, 第一多的內部類是上面第一種, 外部類中直接聲明內部類.
例如: 我們常常需要自己臨時實現一下某一個接口,來應對一些特殊的場景. 這種臨時使用,其實沒有太大必要專門創建一個類來實現接口, 因為我們一旦創建了一個類,那么這個類我們有責任考慮別人訪問后給他們和我們會帶來什么樣的后果.
下面我們來看一個簡單的匿名內部類.
public class InName {
public String say(final String s) {
return new Inter() {
@Override
public String say() {
return "hello," + s;
}
@Override
public int value(int num) {
return 0;
}
}.say() ;
}
public static void main(String[] args) {
InName inName = new InName() ;
System.out.println(inName.say("palm."));
}
}
以上例子,有一點很重要,如果在內部類中訪問外部類方法中的參數,則外部內方法中該參數必須聲明為 final
. 這點常常需要處理下.
匿名內部類,只能繼承或者實現接口,二者不可兼得,因為他沒有名字,所以也只能是某一種類型的子類, 要么是正規的繼承,要么就是某一個接口的實現.