內部類大概有四種:
1.方法裏面定義的局部內部類
2.成員變量級別的內部類
3.靜態內部類
4.匿名內部類
應用:
1.方法內部的局部內部類
public void test(String str){ //已經不需要final修飾符了
int i = 10; //Java 8更加智能:如果局部變量被匿名內部類訪問,那麼該局部變量相當於自動使用了final修飾。
class testClass{
//static int ss = 2; 非靜態類不能有靜態變量
private int name = 10;
void test(String s){
System.out.println(name);
System.out.println(s);
System.out.println(i);
}
}
new testClass().test(str);
}
從上面的例程我們可以看出定義在方法內部的內部類的可見性更小,它只在方法內部
可見,在外部類(及外部類的其它方法中)中都不可見了。同時,它有一個特點,就是方法
內的內部類連本方法的成員變量都不可訪問,它只能訪問本方法的final型成員。同時另一個
需引起注意的是方法內部定義成員,只允許final修飾或不加修飾符,其它像static等均不可用。
用法還沒找到經典的,猜測如下調用:
public interface FunClassInteface {
String getRet();
String getRetMsg();
}
public class FunClass {
public FunClassInteface test2(){
String str = "001";
String str2 = "002";
class FunCImpl implements FunClassInteface{
@Override
public String getRet() {
return str;
}
@Override
public String getRetMsg() {
return str2;
}
}
return new FunCImpl();
}
public static void main(String[] args) {
FunClass funClass = new FunClass();
funClass.test("123");
FunClassInteface test2 = funClass.test2();
System.out.println(test2.getRet());
System.out.println(test2.getRetMsg());
}
}
2.成員變量級別的內部類
java中的Iterate都是這種應用,寫個Demo理解下:
//定義一個簡單的迭代器接口
public interface MyIterate {
Object next();
boolean hasNext();
}
//簡單的保存數據
public class MyList {
int max = 0;
private Object[] objects;
public MyList(Object... objects) {
this.objects = objects;
max = objects.length;
}
public MyIterate getIterate(){
return new MyIterateImpl();
}
//內部類實現迭代器
private class MyIterateImpl implements MyIterate{
private int i = 0;
@Override
public Object next() {
return objects[i++];
}
@Override
public boolean hasNext() {
return i < max;
}
}
}
//使用Demo
public static void main(String[] args) {
MyList myList = new MyList("你好","我好","大家好!");
MyIterate myIterate = myList.getIterate();
while(myIterate.hasNext()){
System.out.println(myIterate.next());
}
}
3.靜態內部類
感覺和正常的類差不多,除了不能有非靜態變量 ,還沒搞清楚
有可能爲了更高的內部聚合,訪問最嚴格性,HashEntry既然是一個工具類不需要訪問
//ConcurrentHashMap的一些信息,使它的訪問域最小就可以用上靜態內部類
如果內部類不會引用到外部類東西的話,強烈建議使用靜態內部類,因爲這樣更節省資源,
減少內部類其中的一個指向外部類的引用,詳見 effective java
4.匿名內部類
衆所周知,匿名內部類的作用一般在java8之前進行回調,比如說:
File file = new File("xxx");
file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return ".xml".equals(name);
}
});
3.