匿名內部類是在抽象類及接口的概念之上發展起來的。主要目的就是減少類的定義,如下代碼所示:
現在不使用匿名內部類完成:
interface A{
public void print() ;
}
class B implements A{
public void print(){
System.out.println("Hello World!!!") ;
}
};
class C{
public void fun(A a){
a.print() ;
}
public void fun(){
this.fun(new B()) ;
}
};
public class Demo15{
public static void main(String args[]){
new C().fun() ;
}
}; |
但是現在假設說B類只使用一次,那問是否還有必要進行單獨的聲明呢?則會發現如果聲明瞭B類,對於代碼沒有太多的必要,所以此時就可以使用匿名內部類了:
interface A{
public void print() ;
}
class C{
public void fun(A a){
a.print() ;
}
public void fun(){
this.fun(new A(){
public void print(){
System.out.println("Hello World!!!") ;
}
}) ;
}
};
public class Demo15{
public static void main(String args[]){
new C().fun() ;
}
}; |
如果現在方法中,有參數了,問匿名內部類是否可以訪問呢?
interface A{
public void print() ;
}
class C{
public void fun(A a){
a.print() ;
}
public void fun(int i){
this.fun(new A(){
public void print(){
System.out.println("Hello World!!! i = " + i) ;
}
}) ;
}
};
public class Demo17{
public static void main(String args[]){
new C().fun(10) ;
}
}; |
編譯時會出現以下的錯誤:
Demo17.java:11: 從內部類中訪問局部變量 i;需要被聲明爲最終類型
System.out.println("Hello World!!! i = " + i) ;
^
1 錯誤 |
如果要想從方法中定義的內部類,訪問方法中的參數,則方法參數的聲明處必須加“final”。
public void fun(final int i) ;
注意:
此final表示的不是常量,只是一個標記而已。