亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Java內部類

2019-11-14 08:50:00
字體:
來源:轉載
供稿:網友

java中,可以將一個類定義在另一個類里面或者一個方法里面,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這四種:非靜態內部成員類、靜態內部成員類、局部內部類和匿名內部類。下面就先來了解一下這四種內部類的用法。

內部類是指在一個外部類的內部再定義一個類。類名不需要和文件夾相同。內部類可以是靜態static的,也可用public,default,PRotected和private修飾。(而外部頂級類即類名和文件名相同的只能使用public和default)。

 注意:內部類是一個編譯時的概念,一旦編譯成功,就會成為與外部類完全不同的兩個類。對于一個名為outer的外部類和其內部定義的名為inner的內部類。編譯完成后出現outer.class和outer$inner.class兩類。所以內部類的成員變量及方法名可以和外部類的相同。

非靜態成員內部類

非靜態成員內部類即普通成員內部類,就是作為外部類的成員,可以直接使用外部類的所有成員和方法,即使是private的。同時外部類如果要訪問內部類的所有成員變量與方法,則需要通過內部類的實例對象來獲取。要注意的是,普通成員內部類不能含有static的變量和方法。因為普通成員內部類需要先創建了外部類,才能創建它自己,了解這一點,就可以明白更多事情,在此省略更多的細節了。在普通成員內部類要引用外部類對象時,使用outer.this來表示外部類對象;而需要創建內部類對象時,可以使用outer.inner obj = outerobj.new inner()來創建,在創建內部類實例之前需要先創建外部類的實例對象。測試代碼如下:

public class OuterNestedClass {	private int x = 100;	class MyInner {		private String y = "Hello!";		public void innerMethod() 		{			System.out.println("內部類中 String = " + y);			System.out.println("外部類中的x = " + x);//直接訪問外部類變量x			outerMethod();			System.out.println("內部類調用外部類方法執行x++后,x = " + OuterNestedClass.this.x);		  }	 }	 	 public void outerMethod() {		 x++;	 }	 	 public MyInner makeInner() {		return new MyInner();	//在外部類方法中創建內部類實例	 }	 public int getX(){		 return x;	 }	 	 public static void main(String[] args) {		 OuterNestedClass outer = new OuterNestedClass();	//創建外部類實例		 OuterNestedClass.MyInner inner = outer.new MyInner();//內部類實例		 outer.outerMethod();		 System.out.println("外部類中的x = " + outer.getX());	    inner.innerMethod();		    	    OuterNestedClass.MyInner inner2 = outer.makeInner();//創建內部類實例	    inner2.innerMethod();	}}運行結果如下:
外部類中的x = 101內部類中 String = Hello!外部類中的x = 101內部類調用外部類方法執行x++后,x = 102內部類中 String = Hello!外部類中的x = 102內部類調用外部類方法執行x++后,x = 103上面代碼中,如果將public MyInner makeInner()方法聲明改為public static MyInner makeInner(),編譯器將提示錯誤:“沒有任何類型OuterNestedClass的外層實例可訪問。必須用類型OuterNestedClass的外層實例(例如,x.new A(),其中x是OuterNestedClass的實例)來限定分配。”這表明非靜態成員類的每個實例都隱含著與外圍類的一個外圍實例相關聯,在沒有外圍實例的情況下,要想創建非靜態成員內部類的實例是不可能的。

靜態成員內部類

靜態成員內部類,就是修飾為static的內部成員類。聲明為static的內部類,不需要內部類對象和外部類對象之間的聯系,就是說我們可以直接引用outer.inner,即不需要創建外部類實例,也不需要創建內部類。靜態內部類與靜態內部方法相似,只能訪問外圍類的static成員,不能直接訪問外部類的實例變量與實例方法,只有通過對象引用才能訪問。由于static內部類不具有任何對外部類實例的引用,因此static內部類中不能使用this關鍵字來訪問外部類中的實例成員,但是可以訪問外部類中的static成員,這與一般類的static方法相通。靜態成員內部類和普通的內部類還有一個區別:普通內部類不能有static數據和static屬性,也不能再包含靜態成員內部類,但靜態成員內部類可以,而靜態成員內部類不能聲明為private,一般聲明為public,方便調用。測試代碼如下:

public class Outer {	private static int x = 100;		//外圍類靜態數據成員	 //創建靜態內部類	public static class MyInner {		private String y = "Hello!";		public void innerMethod() 		{			System.out.println("內部類中String = " + y);			System.out.println("外部類中的staic變量x = " + x);  		 }	}		public static MyInner makeInner() {		return new MyInner();	//在外部類方法中創建內部類實例	}	 	public void outerMethod() {		 x++;	}		public int getX(){		return x;	}		public static void main(String[] args) {		Outer outer = new Outer();		//與普通類的實例通過類名創建相似		Outer.MyInner si = new Outer.MyInner();//靜態內部類不通過外部實例就可以創建對象		outer.outerMethod();		System.out.println("外部類中的static變量x = " + outer.getX());		si.innerMethod();		outer.outerMethod();		Outer.MyInner si2 = Outer.makeInner();	//通過外圍類靜態方法創建內部類實例		si2.innerMethod();	}}運行結果如下:

外部類中的static變量x = 101內部類中 String = Hello!外部類中的staic變量x = 101內部類中 String = Hello!外部類中的staic變量x = 102

局部內部類

定義在代碼塊、方法體內、作用域(使用花括號“{}”括起來的一段代碼)內的類叫局部內部類。局部內部類只能在代碼代碼塊、方法體內和作用域中使用(創建對象和使用類對象)。局部內部類也像別的類一樣進行編譯,但只是作用域不同而已,只在該方法或條件的作用域內才能使用,退出這些作用域后無法引用的。局部內部類訪問外部類的屬性和方法使用“外部類名.this.屬性名”和“外部類名.this.方法名(參數)”的形式。局部內部類就像是方法里面的一個局部變量一樣,是不能有public、protected、private以及static修飾符的,最多只能有final修飾。局部內部類的定義方式如下:

public class Test {    {        class AA{}				//塊內局部類    }    public Test(){        class AA{}				//構造器內局部類    }    public static void main(String[] args){    }    public void test(){        class AA{}				//方法內局部類    }}

注意到了吧,局部內部類可以同名,編譯后形成諸如:外部類名稱+$+同名順序+局部類名稱:Test$1AA.class/Test$2AA.class/Test$3AA.class。以下是將局部內部類定義在代碼塊內的示例代碼:

public class LocalNestedClass2 {     private String internalTracking(boolean b)     {         if (b)         {             final class TrackingSlip             {                 private String id;                 TrackingSlip(String s) {                     id = s;                 }                 String getSlip() {                     return id;                 }             }             TrackingSlip ts = new TrackingSlip("slip");             String s = ts.getSlip();             return s.toUpperCase();        }         else        	return "";    }      public String track() {         return internalTracking(true);     }     public static void main(String[] args)     {     	 LocalNestedClass2 p = new LocalNestedClass2();         System.out.println(p.track());     } } 

匿名內部類

匿名類,就是沒有名稱的類,其名稱由Java編譯器給出,一般是形如:外部類名稱+$+匿名類順序,沒有名稱也就意味著在其他地方就不能引用,不能實例化,只用一次,當然也就不能有構造器。匿名類根據位于地方不同分為:成員匿名類和局部匿名類。匿名類不能使用任何關鍵字和訪問控制符,匿名類和局部類訪問規則一樣,只不過內部類顯式的定義了一個類,然后通過new的方式創建這個局部類實例,而匿名類直接new一個類實例,沒有定義這個類。匿名類最常見的方式就是回調模式的使用,通過默認實現一個接口創建一個匿名類然后,然后new這個匿名類的實例。匿名內部類定義和實例化形式如下:

new父類構造方法(參數){	修飾符 返回參數類型 方法名(參數列表)//該方法名須在父類中存在	{	}}

匿名內部類只能和new連用,用于創建一個實例。匿名內部類只能使用一次,創建實例之后,類定義會立即消失(想要多次使用就要用到反射的知識了)。匿名內部類必須繼承一個類(抽象的、非抽象的都可以)或者實現一個接口。如果父類(或者父接口)是抽象類,則匿名內部類必須實現其所有抽象方法。匿名內部類不能是抽象類,因為匿名內部類在定義之后,會立即創建一個實例。匿名內部類不能定義構造方法,匿名內部類沒有類名,無法定義構造方法,但是,匿名內部類擁有與父類相同的所有構造方法。匿名內部類中可以定義代碼塊,用于實例的初始化,但是不能定義靜態代碼塊。以下是匿名內部類的測試代碼:

abstract class Test{      public abstract void print();  }interface Inner {     String getName(); }public class AnonymousNestedClass {     public static void main(String[] args) {     	AnonymousNestedClass  outer = new AnonymousNestedClass ();        Inner inner = outer.getInner("Inner", "gz");        System.out.println(inner.getName());        //定義一個匿名內部類,并實例化對象         Test test = new Test()        {              @Override              public void print() {                 System.out.println("匿名內部類實現父類所有的抽象方法");              }          };          test.print();          System.out.println("匿名內部類的類名:test.getClass().getName() == " + test.getClass().getName());          System.out.println("父類的類名:Test.class.getName() == " + Test.class.getName());          System.out.println("test.getClass().equals(Test.class) == " + test.getClass().equals(Test.class));          System.out.println("test.getClass().getSuperclass().equals(Test.class) == " + test.getClass().getSuperclass().equals(Test.class));     }      public Inner getInner(final String name, String city) {         return new Inner()         {             private String nameStr = name;             public String getName() {                 return nameStr + ", " + city;             }         };     }     }  運行結果:

Inner, gz匿名內部類實現父類所有的抽象方法!匿名內部類的類名:test.getClass().getName() ==  nestedClass.AnonymousNestedClass$1父類的類名:Test.class.getName() == nestedClass.Testtest.getClass().equals(Test.class) == falsetest.getClass().getSuperclass().equals(Test.class) == true


上一篇:TCP和UDP

下一篇:藍橋杯練習-01字串

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩在线免费观看| 亚洲欧美日本另类| 欧美极品欧美精品欧美视频| 精品国产视频在线| 欧美三级xxx| 国产精品国产三级国产专播精品人| 91探花福利精品国产自产在线| 国产精品狠色婷| 蜜月aⅴ免费一区二区三区| 欧美又大又硬又粗bbbbb| 美女视频黄免费的亚洲男人天堂| 日韩欧美999| 91大神福利视频在线| 日韩中文字幕在线视频| 欧美壮男野外gaytube| 亚洲午夜av久久乱码| 亚洲欧美福利视频| 国产成+人+综合+亚洲欧洲| 欧美精品在线免费播放| 亚洲老头老太hd| 亚洲精品国产品国语在线| 亚洲欧美中文日韩在线v日本| 日韩av电影免费观看高清| 国产精品成人国产乱一区| 日韩视频免费大全中文字幕| 国产欧美日韩中文字幕在线| 日本a级片电影一区二区| 国产精品一久久香蕉国产线看观看| 欧美日韩国产一区二区| 亚洲精品福利资源站| www.日韩av.com| 亚洲男人天堂2019| 亚洲天堂久久av| 成人欧美一区二区三区在线| 国语对白做受69| 久久91亚洲精品中文字幕奶水| 欧美激情亚洲一区| 国产精品午夜一区二区欲梦| 欧美黑人又粗大| 亚洲性生活视频| 正在播放欧美一区| 国产精品激情av在线播放| 亚洲色图综合久久| 亚洲成人网在线| 黄色成人av在线| 成人久久精品视频| 正在播放欧美视频| 国产91精品在线播放| 欧美www视频在线观看| 欧美成人免费一级人片100| 国产精品偷伦免费视频观看的| 亚洲一区二区国产| 亚洲伊人久久综合| 欧美亚洲成人精品| 国产主播欧美精品| 午夜精品久久久久久99热| 伊人久久久久久久久久久久久| 亚洲国产成人精品一区二区| 久久成人精品视频| 久久777国产线看观看精品| 久久99国产精品自在自在app| 中文字幕精品一区二区精品| 日韩av大片在线| 亚洲黄在线观看| 欧美性在线观看| 啪一啪鲁一鲁2019在线视频| 亚洲国产成人精品久久久国产成人一区| 欧美一级淫片aaaaaaa视频| 一本一本久久a久久精品牛牛影视| 亚洲国产欧美一区| 欧美影院在线播放| 欧美在线视频网站| 亚洲高清福利视频| 97在线精品国自产拍中文| 国产欧美最新羞羞视频在线观看| 欧美成人在线网站| 成人性生交大片免费观看嘿嘿视频| 国产综合视频在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 久久躁日日躁aaaaxxxx| 亚洲人成亚洲人成在线观看| 亚洲精品电影在线| 亚洲激情自拍图| 91精品国产成人| 免费91麻豆精品国产自产在线观看| 欧美精品在线免费| 亚洲欧美中文日韩在线v日本| 性欧美激情精品| 日韩精品中文字幕有码专区| 国产精品成av人在线视午夜片| 国产一区视频在线播放| 精品久久久久久国产91| 久久久91精品国产一区不卡| 大胆欧美人体视频| 日韩av在线免费| 少妇高潮久久久久久潘金莲| 久久精品人人爽| 色综合老司机第九色激情| 一区二区三区久久精品| 日本久久久久久久久| 久久人人97超碰精品888| 亚洲视频视频在线| 成人在线精品视频| 亚洲精品久久久久中文字幕二区| 欧美极品美女电影一区| 亚洲毛片在线看| 亚洲偷熟乱区亚洲香蕉av| 久热精品视频在线观看| 俺也去精品视频在线观看| 2019中文在线观看| 日本精品在线视频| 国产欧美日韩91| 欧美亚洲激情在线| 91免费看片网站| 国产精品美女在线| 神马久久桃色视频| 国产精品久久色| 色婷婷久久av| 欧美成年人网站| 亚洲精品久久7777777| 国产成人福利夜色影视| 亚洲欧美色婷婷| 国产精品v日韩精品| 国产日产久久高清欧美一区| 国产精品三级网站| 日韩av影院在线观看| 精品国内自产拍在线观看| 精品久久久999| 亚洲japanese制服美女| 美女扒开尿口让男人操亚洲视频网站| 俺去亚洲欧洲欧美日韩| 精品亚洲一区二区三区四区五区| 国产精品久久久久久久app| 欧美日韩免费观看中文| 欧美成人午夜剧场免费观看| 欧美性猛交xxxx免费看漫画| 欧美视频在线观看免费| 亚洲国产精品悠悠久久琪琪| 国外成人在线播放| 久久成人精品电影| 日韩免费电影在线观看| 69精品小视频| 国产精品久久久999| 午夜精品久久17c| 国产精品极品美女粉嫩高清在线| 国产成人精品在线| 日韩免费在线电影| 久久视频这里只有精品| 亚洲黄色av女优在线观看| 亚洲精品白浆高清久久久久久| 欧美另类极品videosbest最新版本| 日韩精品欧美国产精品忘忧草| 欧美国产日韩一区二区| 97视频在线观看免费高清完整版在线观看| 久久久成人精品视频| 国产精品丝袜久久久久久不卡| 成人免费在线视频网站| 日韩av三级在线观看| 欧美壮男野外gaytube| 久久av在线看| 国产精品白丝jk喷水视频一区| 成人免费网站在线观看| 成人a视频在线观看| 成人啪啪免费看|