自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java核心類庫:內(nèi)部類那點事兒

開發(fā) 后端
每個內(nèi)部類都能獨立地繼承自一個(接口的)實現(xiàn),所以無論外圍類是否已經(jīng)繼承了某個(接口的)實現(xiàn),對于內(nèi)部類都沒有影響。如果沒有內(nèi)部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內(nèi)部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內(nèi)部類有效地實現(xiàn)了“多重繼承”。

內(nèi)部類:定義在類的內(nèi)部的類

為什么需要內(nèi)部類?

  • 典型的情況是,內(nèi)部類繼承自某個類或實現(xiàn)某個接口,內(nèi)部類的代碼操作創(chuàng)建其的外圍類的對象。所以你可以認為內(nèi)部類提供了某種進入其外圍類的窗口。
  • java中的內(nèi)部類和接口加在一起,可以實現(xiàn)多繼承。
  • 可以使某些編碼根簡潔。
  • 隱藏你不想讓別人知道的操作。

使用內(nèi)部類最吸引人的原因是:

每個內(nèi)部類都能獨立地繼承自一個(接口的)實現(xiàn),所以無論外圍類是否已經(jīng)繼承了某個(接口的)實現(xiàn),對于內(nèi)部類都沒有影響。如果沒有內(nèi)部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內(nèi)部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內(nèi)部類有效地實現(xiàn)了“多重繼承”。

內(nèi)部類分為: 成員內(nèi)部類、靜態(tài)嵌套類、方法內(nèi)部類、匿名內(nèi)部類。

特點:

一、內(nèi)部類仍然是一個獨立的類,在編譯之后內(nèi)部類會被編譯成獨立的.class文件,但是前面冠以外部類的類命和$符號。

二、內(nèi)部類可以直接或利用引用訪問外部類的屬性和方法,包括私有屬性和方法(但靜態(tài)內(nèi)部類不能訪問外部類的非靜態(tài)成員變量和方法)。內(nèi)部類所訪問的外部屬性的值由構造時的外部類對象決定。

三、而外部類要訪問內(nèi)部類的成員,則只能通過引用的方式進行,可問內(nèi)部類所有成員

四、訪問機制:

  1.   System.out.println(this.x);或System.out.println(x);//內(nèi)部類訪問內(nèi)部類的成員變量或成員方法可用此方法。  
  2.  
  3.   System.out.println(OuterClass.this.x);//內(nèi)部類訪問外部類的同名變量時可用此方法,如果沒有同名可用System.out.println(x); 

五、內(nèi)部類可以使用任意的范圍限定:public/private/protected class InnerClass,且嚴格按照這幾種訪問權限來控制內(nèi)部類能使用的范圍。普通類的范圍限定只可以是public或者不加。

六、內(nèi)部類的命名不允許與外部類 重名,內(nèi)部類可以繼承同級的內(nèi)部類,也可繼承其它類(除內(nèi)部類和外部類)。

七、內(nèi)部類可以定義為接口,并且可以定義另外一個類來實現(xiàn)它

八、內(nèi)部類可以定義為抽象類,可以定義另外一個內(nèi)部類繼承它

九、內(nèi)部類使用static修飾,自動升級為***類,外部類不可以用static修飾,用OuterClass.InnerClass inner=new OuterClass.InnerClass();創(chuàng)建實例。內(nèi)部類還可定義為final.

十、內(nèi)部類可以再定義內(nèi)部類(基本不用)

十一、方法內(nèi)的內(nèi)部類:

  • 方法內(nèi)的內(nèi)部類不能加范圍限定(protected public private)
  • 方法內(nèi)的內(nèi)部類不能加static修飾符
  • 方法內(nèi)的內(nèi)部類只能在方法內(nèi)構建其實例
  • 方法內(nèi)的內(nèi)部類如果訪問方法局部變量,則此局部變量必須使用final修飾

1)靜態(tài)內(nèi)部類(靜態(tài)嵌套類)

從技術上講,靜態(tài)嵌套類不屬于內(nèi)部類。因為內(nèi)部類與外部類共享一種特殊關系,更確切地說是對實例的共享關系。而靜態(tài)嵌套類則沒有上述關系。它只是位置在另一個類的內(nèi)部,因此也被稱為***嵌套類。

靜態(tài)的含義是該內(nèi)部類可以像其他靜態(tài)成員一樣,沒有外部類對象時,也能夠訪問它。靜態(tài)嵌套類不能訪問外部類的成員和方法。

語法

  1. package com.tarena.day13;  
  2.  
  3. import com.tarena.day13.Foo.Koo;  
  4. /**  
  5.  * 靜態(tài)類內(nèi)部語法演示  
  6.  */ 
  7. public class StaticInner {  
  8.  public static void main(String[] args) {  
  9.   Koo koo = new Koo();  
  10.   System.out.println(koo.add());//4  
  11.  }  
  12.  
  13. }  
  14. class Foo{  
  15.  int a = 1;  
  16.  static int b = 3;  
  17.  /** 靜態(tài)內(nèi)部類,作用域類似于靜態(tài)變量,屬于類的 */ 
  18.  static class Koo{  
  19.   public int add(){  
  20.    //a ,不能訪問a  
  21.    return b+1;  
  22.   }  
  23.  }  

2)成員內(nèi)部類

* 1 成員內(nèi)部類必須利用外部類實例創(chuàng)建

* 2 成員內(nèi)部類可以共享外部類的實例變量

  1. import com.tarena.day13.inn.Goo.Moo;  
  2.  
  3. public class InnerClassDemo {  
  4.  public static void main(String[] args) {  
  5.   //Moo moo = new Moo(); //編譯錯誤,必須創(chuàng)建Goo的實例  
  6.   Goo goo = new Goo();  
  7.   Moo moo = goo.new Moo();//利用goo實例創(chuàng)建Moo實例  
  8.   Moo moo1 = goo.new Moo();  
  9.   //moo和moo1共享同一個goo實例的實例變量  
  10.   System.out.println(moo.add());//2  
  11.   System.out.println(moo1.add());//2  
  12.   Goo goo1 = new Goo();  
  13.   goo1.a = 8;  
  14.   Moo m1 = goo1.new Moo();  
  15.   Moo m2 = goo1.new Moo();  
  16.   System.out.println(m1.add());//9  
  17.   System.out.println(m2.add());//9  
  18.     
  19.  }  
  20. }  
  21. class Goo{  
  22.  int a = 1;  
  23.  /**成員內(nèi)部類*/ 
  24.  class Moo{  
  25.   public int add(){  
  26.    return a+1;  
  27.   }  
  28.  }  

3)局部內(nèi)部類(方法內(nèi)部類)

(1) 方法內(nèi)部類只能在定義該內(nèi)部類的方法內(nèi)實例化,不可以在此方法外對其實例化。

(2) 方法內(nèi)部類對象不能使用該內(nèi)部類所在方法的非final局部變量。

因為方法的局部變量位于棧上,只存在于該方法的生命期內(nèi)。當一個方法結束,其棧結構被刪除,局部變量成為歷史。但是該方法結束之后,在方法內(nèi)創(chuàng)建的內(nèi)部類對象可能仍然存在于堆中!例如,如果對它的引用被傳遞到其他某些代碼,并存儲在一個成員變量內(nèi)。正因為不能保證局部變量的存活期和方法內(nèi)部類對象的一樣長,所以內(nèi)部類對象不能使用它們。用法

  1. package com.tarena.day13.inn;  
  2.  
  3. import java.util.Comparator;  
  4.  
  5. /**  
  6.  * 局部內(nèi)部類  
  7.  */ 
  8. public class LocalInnerClassDemo {  
  9.  public static void main(String[] args) {  
  10.   int a = 5;  
  11.   final int b = 5;  
  12.   //局部內(nèi)部類,定義在方法內(nèi)部,作用域類似于局部變量  
  13.   //僅僅在方法內(nèi)部可見  
  14.   //在局部內(nèi)部類中可以訪問方法中的局部final變量  
  15.   class Foo{  
  16.    public int add(){  
  17.     return  b;//正確  
  18.     //return a;//編譯錯誤  
  19.    }  
  20.   }  
  21.     
  22.   Foo foo = new Foo();  
  23.   //臨時的自定義比較規(guī)則  
  24.   class ByLength implements Comparator<String>{  
  25.    public int compare(String o1,String o2){  
  26.     return o1.length()-o2.length();  
  27.    }  
  28.   }  
  29.  }  
  30.  

4)匿名內(nèi)部類

顧名思義,沒有名字的內(nèi)部類。表面上看起來它們似乎有名字,實際那不是它們的名字。

匿名內(nèi)部類就是沒有名字的內(nèi)部類。什么情況下需要使用匿名內(nèi)部類?如果滿足下面的一些條件,使用匿名內(nèi)部類是比較合適的:
只用到類的一個實例。

  • 類在定義后馬上用到。
  • 類非常?。⊿UN推薦是在4行代碼以下)
  • 給類命名并不會導致你的代碼更容易被理解

在使用匿名內(nèi)部類時,要記住以下幾個原則:

  • 匿名內(nèi)部類不能有構造方法。
  • 匿名內(nèi)部類不能定義任何靜態(tài)成員、方法和類。
  • 匿名內(nèi)部類不能是public,protected,private,static。
  • 只能創(chuàng)建匿名內(nèi)部類的一個實例。
  • 一個匿名內(nèi)部類一定是在new的后面,用其隱含實現(xiàn)一個接口或實現(xiàn)一個類。
  • 因匿名內(nèi)部類為局部內(nèi)部類,所以局部內(nèi)部類的所有限制都對其生效。

A、繼承式的匿名內(nèi)部類和接口式的匿名內(nèi)部類。

  1. import java.util.Arrays;  
  2. import java.util.Comparator;  
  3.  
  4. /**匿名內(nèi)部類 語法*/ 
  5. public class AnnInnerClass {  
  6.  
  7.  public static void main(String[] args) {  
  8.   // TODO Auto-generated method stub  
  9.   Yoo yoo = new Yoo();//創(chuàng)建Yoo的實例  
  10.   Yoo y1 = new Yoo(){};  
  11.   //new Yoo(){}創(chuàng)建匿名類實例  
  12.   //匿名類new Yoo(){}是繼承Yoo類,并且同時創(chuàng)建了對象  
  13.   //new Yoo(){}是Yoo的子類型,其中{}是類體(class Body)  
  14.   //類體中可以定義任何類內(nèi)的語法,如:屬性,方法,方法重載,方法覆蓋,等  
  15.   //子類型沒有名字,所以叫匿名類!  
  16.   Yoo y2 = new Yoo(){  
  17.    public String toString(){//方法重寫(覆蓋)  
  18.     return "y2"//y2是子類的實例  
  19.    }  
  20.   };  
  21.   System.out.println(y2);//"y2",調(diào)用了匿名類對象toString()  
  22.   //匿名內(nèi)部類可以繼承/實現(xiàn) 于 類,抽象類,接口等  
  23.   //按照繼承的語法,子類型必須實現(xiàn)所有的抽象方法  
  24.     
  25.   //Xoo x = new Xoo(){};//編譯錯誤,沒有實現(xiàn)方法  
  26.   final int b = 5;  
  27.   Xoo xoo = new Xoo(){ //是實現(xiàn)接口,并且創(chuàng)建匿名類實例,不是創(chuàng)建接口對象  
  28.    public int add(int a){//實現(xiàn)接口中的抽象方法  
  29.     return a+b; //要訪問局部變量b,只能訪問final變量  
  30.    }  
  31.   };  
  32.   System.out.println(xoo.add(5));//10,調(diào)用對象的方法  
  33.   //Comparator接口也可以使用匿名類的方式  
  34.   Comparator<String> byLength = new Comparator<String>(){  
  35.    public int compare(String o1,String o2){  
  36.     return o1.length()-o2.length();  
  37.       
  38.    }  
  39.   };  
  40.   String[] names = {"Andy","Tom","Jerry"};  
  41.   Arrays.sort(names,byLength);  
  42.   System.out.println(Arrays.toString(names));  
  43.   //也可以這樣寫,工作中常用  
  44.   Arrays.sort(names,new Comparator<String>(){  
  45.    public int compare(String o1,String o2){  
  46.     return o1.length()-o2.length();  
  47.    }  
  48.   });  
  49.  }  
  50.  

接口式的匿名內(nèi)部類是實現(xiàn)了一個接口的匿名類。而且只能實現(xiàn)一個接口。

 

B. 參數(shù)式的匿名內(nèi)部類。

  1. class Bar{     
  2.     void doStuff(Foo f){  
  3.      }     
  4. }     
  5. interface Foo{     
  6.     void foo();     
  7. }     
  8. class Test{    
  9.  static void go(){    
  10.      Bar b = new Bar();    
  11.      b.doStuff(new Foo(){    
  12.          public void foo(){    
  13.              System.out.println("foofy");    
  14.          }     
  15.       });   
  16.  }     

構造內(nèi)部類對象的方法有:

1、內(nèi)部類在自己所處的外部類的靜態(tài)方法內(nèi)構建對象或在另一個類里構造對象時應用如下形式:

(1)

  1. OuterClass out = new OuterClass();  
  2. OuterClass.InnerClass in = out.new InnerClass(); 

(2)

  1. OuterClass.InnerClass in=new OuterClass().new InnerClass(); 

其中OuterClass是外部類,InnerClass是內(nèi)部類。

2、內(nèi)部類在它所在的外部類的非靜態(tài)方法里或定義為外部類的成員變量時,則可用以下方式來構造對象:

  1. InnerClass in = new InnerClass(); 

3、如果內(nèi)部類為靜態(tài)類,則可用如下形式來構造函數(shù):

  1. OuterClass.InnerClass in = new OuterClass.InnerClass(); 

無需再利用外部類的對象來來構造內(nèi)部類對象,如果靜態(tài)內(nèi)部類需要在靜態(tài)方法或其它類中構造對象就必須用上面的方式來初始化。

原文鏈接:http://www.cnblogs.com/hqr9313/archive/2012/04/16/2452906.html

【編輯推薦】

  1. 在Java程序中調(diào)用Matlab函數(shù)
  2. Java線程:線程安全與不安全
  3. Java NIO原理圖文分析及代碼實現(xiàn)
  4. Java RMI遠程調(diào)用
  5. 淺談Java的方法覆蓋與變量覆蓋
責任編輯:林師授 來源: 只是小人物的博客
相關推薦

2023-12-04 11:02:53

C++空類

2019-02-12 11:45:05

Java數(shù)據(jù)庫開發(fā)

2020-01-15 11:14:21

Java算法排序

2022-05-26 15:30:21

Spring AOP框架

2011-12-26 11:13:24

密碼

2015-12-08 14:49:13

SDN軟件定義網(wǎng)絡

2017-09-12 08:03:29

數(shù)據(jù)庫MySQL主庫

2020-12-14 10:23:23

Java內(nèi)部類外部類

2013-12-26 13:35:39

2020-01-03 07:57:39

UDPTCP網(wǎng)絡協(xié)議

2011-03-29 14:11:15

內(nèi)部類

2022-05-26 09:03:39

AOP編程

2013-09-17 10:37:03

AOPAOP教程理解AOP

2018-03-30 16:03:04

軟件無狀態(tài)”

2012-03-12 21:23:47

Windows pho

2021-04-13 09:12:45

網(wǎng)絡設備無線路由器交換機

2023-03-06 07:53:36

JavaN種內(nèi)部類

2009-06-11 13:08:29

Java內(nèi)部類Java編程思想

2023-10-19 13:24:00

Java工具

2018-05-17 09:46:40

apachenginx阻塞
點贊
收藏

51CTO技術棧公眾號