java內部類

//內部類分爲:靜態內部類,成員內部類,局部內部類,匿名內部類

內部類的特徵:

可以被定義在方法中,他可以訪問外部類的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
 }
}

 

 

匿名內部類

怎樣判斷java匿名類
懸賞分:20 - 解決時間:2009-11-19 02:54
怎樣判斷一個匿名類的存在啊?

看不見名字,感覺只是父類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實例化嗎?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章