国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

9)Java內部類(Inner Class)

2019-11-14 21:59:10
字體:
來源:轉載
供稿:網友
9)java內部類(Inner Class)

內部類:不可以有靜態數據,靜態方法或者又一個靜態內部類 內部類的優點:隱藏類的細節,內部類可以聲明為私有。內部類可以訪問外部類的對象(包括PRivate)靜態內部類:可以有靜態數據,靜態方法或者又一個靜態內部類局部內部類:定義在一個方法或者一個代碼塊中的類,作用域為相應代碼塊匿名內部類:該類沒有名字,一般直接寫為(new 接口(..))并返回一個實現了某接口的對象。為什么需要內部類? 典型的情況是,內部類繼承自某個類或實現某個接口,內部類的代碼操作創建其的外圍類的對象。所以你可以認為內部類提供了某種進入其外圍類的窗口。使用內部類最吸引人的原因是: 每個內部類都能獨立地繼承自一個(接口的)實現,所以無論外圍類是否已經繼承了某個(接口的)實現,對于內部類都沒有影響。如果沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內部類有效地實現了“多重繼承”。[java]view plaincopy
  1. publicinterfaceContents{
  2. intvalue();
  3. }
  4. publicinterfaceDestination{
  5. StringreadLabel();
  6. }
  7. publicclassGoods{
  8. privateclassContentimplementsContents{
  9. privateinti=11;
  10. publicintvalue(){
  11. returni;
  12. }
  13. }
  14. protectedclassGDestinationimplementsDestination{
  15. privateStringlabel;
  16. privateGDestination(StringwhereTo){
  17. label=whereTo;
  18. }
  19. publicStringreadLabel(){
  20. returnlabel;
  21. }
  22. }
  23. publicDestinationdest(Strings){
  24. returnnewGDestination(s);
  25. }
  26. publicContentscont(){
  27. returnnewContent();
  28. }
  29. }
  30. classTestGoods{
  31. publicstaticvoidmain(String[]args){
  32. Goodsp=newGoods();
  33. Contentsc=p.cont();
  34. Destinationd=p.dest("Beijing");
  35. }
  36. }
在這個例子里類Content和GDestination被定義在了類Goods內部,并且分別有著protected和private修飾符來控制訪問級別。Content代表著Goods的內容,而GDestination代表著Goods的目的地。它們分別實現了兩個接口Content和Destination。在后面的main方法里,直接用 Contents c和Destination d進行操作,你甚至連這兩個內部類的名字都沒有看見!這樣,內部類的第一個好處就體現出來了 隱藏你不想讓別人知道的操作,也即封裝性。同時,我們也發現了在外部類作用范圍之外得到內部類對象的第一個方法,那就是利用其外部類的方法創建并返回。上例中的cont()和dest()方法就是這么做的。那么還有沒有別的方法呢?當然有,其語法格式如下:outerObject=new outerClass(Constructor Parameters);outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);注意在創建非靜態內部類對象時,一定要先創建起相應的外部類對象。至于原因,也就引出了我們下一個話題 非靜態內部類對象有著指向其外部類對象的引用,對剛才的例子稍作修改:[java]view plaincopy
  1. publicclassGoods{
  2. privateintvalueRate=2;
  3. privateclassContentimplementsContents{
  4. privateinti=11*valueRate;
  5. publicintvalue(){
  6. returni;
  7. }
  8. }
  9. protectedclassGDestinationimplementsDestination{
  10. privateStringlabel;
  11. privateGDestination(StringwhereTo){
  12. label=whereTo;
  13. }
  14. publicStringreadLabel(){
  15. returnlabel;
  16. }
  17. }
  18. publicDestinationdest(Strings){
  19. returnnewGDestination(s);
  20. }
  21. publicContentscont(){
  22. returnnewContent();
  23. }
  24. }
在這里我們給Goods類增加了一個private成員變量valueRate,意義是貨物的價值系數,在內部類Content的方法value()計算價值時把它乘上。我們發現,value()可以訪問valueRate,這也是內部類的第二個好處一個內部類對象可以訪問創建它的外部類對象的內容,甚至包括私有變量!這是一個非常有用的特性,為我們在設計時提供了更多的思路和捷徑。要想實現這個功能,內部類對象就必須有指向外部類對象的引用。Java編譯器在創建內部類對象時,隱式的把其外部類對象的引用也傳了進去并一直保存著。這樣就使得內部類對象始終可以訪問其外部類對象,同時這也是為什么在外部類作用范圍之外向要創建內部類對象必須先創建其外部類對象的原因。 有人會問,如果內部類里的一個成員變量與外部類的一個成員變量同名,也即外部類的同名成員變量被屏蔽了,怎么辦?沒事,Java里用如下格式表達外部類的引用:outerClass.this 有了它,我們就不怕這種屏蔽的情況了。靜態內部類 和普通的類一樣,內部類也可以有靜態的。不過和非靜態內部類相比,區別就在于靜態內部類沒有了指向外部的引用。這實際上和C++中的嵌套類很相像了,Java內部類與C++嵌套類最大的不同就在于是否有指向外部的引用這一點上,當然從設計的角度以及以它一些細節來講還有區別。除此之外,在任何非靜態內部類中,都不能有靜態數據,靜態方法或者又一個靜態內部類(內部類的嵌套可以不止一層)。不過靜態內部類中卻可以擁有這一切。這也算是兩者的第二個區別吧。局部內部類 是的,Java內部類也可以是局部的,它可以定義在一個方法甚至一個代碼塊之內。[java]view plaincopy
  1. publicclassGoods1{
  2. publicDestinationdest(Strings){
  3. classGDestinationimplementsDestination{
  4. privateStringlabel;
  5. privateGDestination(StringwhereTo){
  6. label=whereTo;
  7. }
  8. publicStringreadLabel(){
  9. returnlabel;
  10. }
  11. }
  12. returnnewGDestination(s);
  13. }
  14. publicstaticvoidmain(String[]args){
  15. Goods1g=newGoods1();
  16. Destinationd=g.dest("Beijing");
  17. }
  18. }
上面就是這樣一個例子。在方法dest中我們定義了一個內部類,最后由這個方法返回這個內部類的對象。如果我們在用一個內部類的時候僅需要創建它的一個對象并創給外部,就可以這樣做。當然,定義在方法中的內部類可以使設計多樣化,用途絕不僅僅在這一點。 下面有一個更怪的例子:[java]view plaincopy
  1. publicclassGoods2{
  2. privatevoidinternalTracking(booleanb){
  3. if(b){
  4. classTrackingSlip{
  5. privateStringid;
  6. TrackingSlip(Strings){
  7. id=s;
  8. }
  9. StringgetSlip(){
  10. returnid;
  11. }
  12. }
  13. TrackingSlipts=newTrackingSlip("slip");
  14. Strings=ts.getSlip();
  15. }
  16. }
  17. publicvoidtrack(){
  18. internalTracking(true);
  19. }
  20. publicstaticvoidmain(String[]args){
  21. Goods2g=newGoods2();
  22. g.track();
  23. }
  24. }
你不能在if之外創建這個內部類的對象,因為這已經超出了它的作用域。不過在編譯的時候,內部類TrackingSlip和其他類一樣同時被編譯,只不過它由它自己的作用域,超出了這個范圍就無效,除此之外它和其他內部類并沒有區別。匿名內部類 匿名類是不能有名稱的類,所以沒辦法引用它們。必須在創建時,作為new語句的一部分來聲明它們。這就要采用另一種形式的new語句,如下所示: new <類或接口> <類的主體> 這種形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴展,或者實現一個給定的接口。它還創建那個類的一個新實例,并把它作為語句的結果而返回。 java的匿名內部類的語法規則看上去有些古怪,不過如同匿名數組一樣,當你只需要創建一個類的對象而且用不上它的名字時,使用內部類可以使代碼看上去簡潔清楚。它的語法規則是這樣的:new interfacename(){......}; 或 new superclassname(){......}; 下面接著前面繼續舉例子:[java]view plaincopy
  1. publicclassGoods3{
  2. publicContentscont(){
  3. returnnewContents(){ //Contents是接口
  4. privateinti=11;
  5. publicintvalue(){
  6. returni;
  7. }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 峨眉山市| 台江县| 米脂县| 乌兰浩特市| 清远市| 临城县| 自治县| 洛扎县| 尉犁县| 北安市| 新邵县| 宁强县| 湟中县| 兴仁县| 涟源市| 顺昌县| 盐池县| 宣汉县| 新民市| 台山市| 石林| 桐城市| 稻城县| 翼城县| 砀山县| 五华县| 莲花县| 济源市| 敦化市| 柘荣县| 郓城县| 崇左市| 建始县| 淳安县| 张掖市| 曲阜市| 鹤庆县| 宁蒗| 扎赉特旗| 长宁县| 竹溪县|