//內部類分爲:靜態內部類,成員內部類,局部內部類,匿名內部類
內部類的特徵:
可以被定義在方法中,他可以訪問外部類的final變量
可以被定義爲abstract抽象類
可以作爲一個接口,由另一個內部類去實現
非靜態內部類不能聲明任何static成員
//靜態內部類(Static Nested Class)和內部類(Inner Class)有什麼不同?
// Static Nested Class是被聲明爲靜態的內部類,它可以不依賴於外部類實例被實例化
//而通常的內部類需要再外部類實例化後才能被實例化
/*//在類中創建一個內部類,內部類Talk可以直接調用外部類Outer中的name屬性
class Outer{
String name ="在類中創建一個內部類";
void print(){
Talk t = new Talk();
t.talk();
}
//創建內部類
public class Talk{
void talk(){
System.out.println(name);
}
}
}
public class OuterClassTest {
public static void main(String[] args) {
Outer o = new Outer();
o.print();//輸出:在類中創建一個內部類
}
}*/
//在方法中定義的內部類只能訪問方法中final類型的局部變量
class User{
String name="yoyo";
void User(final String name){
final int score = 98;
class Inner{
void print(){
System.out.println(name + " score= "+score);
}
}
Inner in = new Inner();
in.print();
}
}
public class InnerWaysTest{
public static void main(String[] args){
User s = new User();
s.User("hoho");//輸出: hoho score= 98
}
}
匿名內部類
怎樣判斷一個匿名類的存在啊?
看不見名字,感覺只是父類new出一個對象而已,沒有匿名類的名字。。。
不知道你們看懂我的疑問沒。。。。
先看段僞代碼
abstract class Father(){
....
}
public class Test{
Father f1 = new Father(){ .... } //這裏就是有個匿名內部類
}
一般來說,new 一個對象時小括號後應該是分號,也就是new出對象該語句就結束了。
但是出現匿名內部類就不一樣,小括號後跟的是大括號,大括號中是該new 出對象的具體的實現方法。
因爲我們知道,一個抽象類是不能直接new 的,必須先有實現類了我們才能new出它的實現類。
上面的僞代碼就是表示new 的是Father的實現類,這個實現類是個匿名內部類。
其實拆分上面的匿名內部類可爲
class SonOne extends Father{
... //這裏的代碼和上面匿名內部類,大括號中的代碼是一樣的
}
public class Test{
Father f1 = new SonOne() ;
}
我得問題是,Comparator不是一個接口,爲什麼程序中還有這樣的語句:
Comparator OrderIsdn = new Comparator(){
public int compare(Object o1, Object o2){
BookType b1=(BookType)o1;
BookType b2=(BookType)o2;
return (b1.getIdsn().hashCode()-b2.getIdsn().hashCode());
}
};
我覺得樓上說的和樓主想問的不是一個概念,樓主是知道怎麼new一個已經實現了接口的類的,只是不太明白爲什麼能夠直接new一個接口。
我給你個通俗易懂的解釋,其實這一句:
Comparator OrderIsdn = new Comparator(){
相當於(不是標準語法,只是說明原理,幫助理解):
Comparator OrderIsdn = new (MyComp implements Comparator)(){
只是由於是匿名類沒有名字,所以就變成你看到的那樣了。
實際上,你問的這種寫法是java的標準寫法,它的意義是我將要實現這個接口並且由這個實現創建一個對象。注意並不是直接實例化接口(雖然看起來像),而是先實現(後面的一對大括號中的代碼)再實例化。
我知道這是匿名類,但是接口可以通過new實例化嗎?