999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

深入研究Java內(nèi)部類的實現(xiàn)原理

2014-04-06 11:57:40
山東工業(yè)技術(shù) 2014年17期
關(guān)鍵詞:定義方法

魏 鋼

(錦州師范高等??茖W(xué)校,遼寧 錦州 121000)

深入研究Java內(nèi)部類的實現(xiàn)原理

魏 鋼

(錦州師范高等??茖W(xué)校,遼寧 錦州 121000)

內(nèi)部類按照使用方式的不同可以分為常規(guī)內(nèi)部類、靜態(tài)內(nèi)部類、局部內(nèi)部類和匿名內(nèi)部類。通過對這四種內(nèi)部類的定義方式、使用約束和引用方式的分析,應(yīng)用反編譯技術(shù)對內(nèi)部類和外部類進(jìn)行反編譯,分析編譯器生成的額外代碼,闡述內(nèi)部類的實現(xiàn)原理。

內(nèi)部類;靜態(tài)內(nèi)部類;局部內(nèi)部類;匿名內(nèi)部類;外部類

通常情況下Java中類的定義包括屬性和方法,特殊用途下,類中還可以定義類,被包含的類叫做內(nèi)部類[1]。相對于內(nèi)部類而言,包含內(nèi)部類的類叫做外部類。根據(jù)內(nèi)部類在外部類中使用方式不同,又可以分為常規(guī)內(nèi)部類、靜態(tài)內(nèi)部類、局部內(nèi)部類和匿名內(nèi)部類四種。以下論述中外部類命名為Outer,內(nèi)部類命名為Inner。

1 常規(guī)內(nèi)部類

1.1 常規(guī)內(nèi)部類的定義

在外部類中直接定義無static修飾的類,稱為常規(guī)內(nèi)部類。例如:

public class Outer {;private int i=10;;private class Inner{;public void print(){;System.out.println(i); }};public void fun(){;Inner in=new Inner();;in.print();}}。

1.2 常規(guī)內(nèi)部類的使用約束

第一,定義時可以加訪問控制符,public、protected、默認(rèn)和private均可。第二,不能定義靜態(tài)屬性和靜態(tài)方法。第三,可以訪問外部類的屬性和方法。第四,外部類可以訪問內(nèi)部類的所有屬性和方法。

1.3 常規(guī)內(nèi)部類的引用方式

私有的常規(guī)內(nèi)部類只能在外部類內(nèi)引用,格式為Inner in=new Inner()。對于非私有的常規(guī)內(nèi)部類可以在外部類之外進(jìn)行引用,格式為:Outer.Inner in=new Outer().new Inner()。

1.4 常規(guī)內(nèi)部類的實現(xiàn)原理

Java編譯器對內(nèi)部類和外部類是分別進(jìn)行編譯的,編譯后產(chǎn)生Outer.class和Outer$1Inner.class兩個字節(jié)碼文件,外部類能實例化私有常規(guī)內(nèi)部類的根本原因在于編譯器在編譯私有常規(guī)內(nèi)部類時生成了部分附加代碼,通過反編譯技術(shù)對Outer$1Inner.class進(jìn)行反編譯可以查到附加代碼如下:

final Outer this$0;;private Outer$1Inner(){this$0=Outer.this;super();};Outer$1Inner(Outer$1Inner outer$1inner){this();}。

反編譯Outer.class時發(fā)現(xiàn)實例化私有常規(guī)內(nèi)部類時的代碼被改為1Inner in=new 1Inner(null),實際上調(diào)用的是包可見構(gòu)造器,包可見構(gòu)造器內(nèi)部又調(diào)用了私有構(gòu)造器,因此外部類可以實例化私有常規(guī)內(nèi)部類。因為私有常規(guī)內(nèi)部類通過構(gòu)造器初始化了外部類引用變量,所以私有常規(guī)內(nèi)部類能夠訪問外部類的屬性和方法,對于能夠訪問外部類私有屬性的原因在于編譯器對外部類私有屬性生成了專門的靜態(tài)方法static int access$0(Outer),代碼隱藏不可見,通過在內(nèi)部類中使用靜態(tài)的access$0方法引用外部類中的私有屬性[2]。

2 靜態(tài)內(nèi)部類

2.1 靜態(tài)內(nèi)部類的定義

在外部類中直接定義有static修飾的類,稱為靜態(tài)內(nèi)部類,例如:

public class Outer {;private static int i=10;;private static class Inner{;public void print(){;System.out.println(i); }}};

2.2 靜態(tài)內(nèi)部類的使用約束

只能訪問外部類的靜態(tài)屬性和靜態(tài)方法,其它約束與常規(guī)內(nèi)部類使用約束基本相同。

2.3 靜態(tài)內(nèi)部類的引用方式

靜態(tài)內(nèi)部類的引用方式同常規(guī)內(nèi)部類的引用方式相同。

2.4 靜態(tài)內(nèi)部類的實現(xiàn)原理

反編譯Outer$1Inner.class時發(fā)現(xiàn)編譯器對靜態(tài)內(nèi)部類并不產(chǎn)生外部類引用變量,因此靜態(tài)內(nèi)部類無法得到外部類的引用,所以靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)屬性和靜態(tài)方法。

3 局部內(nèi)部類

3.1 局部內(nèi)部類的定義

在方法中定義的類,稱為局部內(nèi)部類,例如:

3.2 局部內(nèi)部類的使用約束

第一,局部內(nèi)部類定義時不能加訪問控制符,只能在方法內(nèi)部使用。第二,局部內(nèi)部類能訪問外部類的屬性和方法。第三,局部內(nèi)部類只能訪問包含方法中fnal修飾的變量。

3.3 局部內(nèi)部類的引用方式

局部內(nèi)部類只能在方法內(nèi)部進(jìn)行引用,使用方式同基本類。

3.4 局部內(nèi)部類的實現(xiàn)原理

反編譯Outer$1Inner.class時發(fā)現(xiàn)編譯器對局部內(nèi)部類生成“fnal Outer this$0”和“private fnal int val$j”。局部內(nèi)部類通過外部類引用變量可實現(xiàn)訪問外部類的屬性和方法,val$j是fnal修飾的形參j的一個備份,目的在于方法運(yùn)行結(jié)束時,避免Java垃圾回收器對方法內(nèi)的資源進(jìn)行垃圾回收時導(dǎo)致局部內(nèi)部類在訪問內(nèi)部資源時查找失敗[3]。

4 匿名內(nèi)部類

4.1 匿名內(nèi)部類的定義

只創(chuàng)建一個對象且不用命名的局部內(nèi)部類,稱為匿名內(nèi)部類,例如:

4.2 匿名內(nèi)部類的使用約束

匿名內(nèi)部類由于沒有類名,因此不能定義構(gòu)造器,其它使用約束同局部內(nèi)部類。

4.3 匿名內(nèi)部類的引用方式

匿名內(nèi)部類通常以方法的參數(shù)形式出現(xiàn),分為繼承式匿名內(nèi)部類和接口式匿名內(nèi)部類兩種。引用方式為new 父類名(){//重寫父類方法}或new 接口名(){//實現(xiàn)接口方法}。

4.4 匿名內(nèi)部類的實現(xiàn)原理

編譯產(chǎn)生匿名內(nèi)部類名稱為Outer$1,反編譯后發(fā)現(xiàn)生成fnal Outer this$0,證明匿名內(nèi)部類可以訪問外部類的屬性和方法。

5 結(jié)束語

通過反編譯技術(shù)的使用,深入研究了Java內(nèi)部類的實現(xiàn)原理,加深了對內(nèi)部類定義方式、使用約束和引用方式的認(rèn)識,提高了對Java技術(shù)的應(yīng)用水平。

[1]張孝祥.Java就業(yè)培訓(xùn)教程[M].北京:清華大學(xué)出版社,2003.

[2]郭廣軍,陳代武,王劍波.Java內(nèi)部類的研究及應(yīng)用[J].湖南人文科技學(xué)院學(xué)報,2007(06):32-38.

[3]劉文杰,鄭玉,劉志昊.Java 7實用教程[M].北京:清華大學(xué)出版社,2013.

魏鋼(1978-),男,遼寧盤錦人,碩士,講師,主要從事Java Web開發(fā)研究。

猜你喜歡
定義方法
永遠(yuǎn)不要用“起點(diǎn)”定義自己
海峽姐妹(2020年9期)2021-01-04 01:35:44
定義“風(fēng)格”
學(xué)習(xí)方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
修辭學(xué)的重大定義
山的定義
主站蜘蛛池模板: 亚洲一级色| 五月婷婷综合色| 亚洲乱码视频| 亚洲第一黄色网址| 国产欧美亚洲精品第3页在线| 91高清在线视频| 人妻一区二区三区无码精品一区| 香蕉eeww99国产精选播放| 伊人狠狠丁香婷婷综合色| 成人日韩精品| JIZZ亚洲国产| 国产女人爽到高潮的免费视频| 伊人AV天堂| 四虎成人免费毛片| 国产精品lululu在线观看| 亚洲性日韩精品一区二区| 激情爆乳一区二区| 午夜国产理论| 亚洲床戏一区| 日韩天堂视频| 免费一级成人毛片| 久久婷婷综合色一区二区| 亚洲av片在线免费观看| 国产成人福利在线视老湿机| v天堂中文在线| 性欧美久久| 亚洲国产理论片在线播放| 国产精品白浆无码流出在线看| 色悠久久久| 国产91蝌蚪窝| 国产成人资源| 国产亚洲精品在天天在线麻豆 | 亚洲制服丝袜第一页| 91九色视频网| 亚洲精品成人片在线观看| 国产精品主播| 国模私拍一区二区| 2021国产精品自产拍在线观看| 国产亚洲精品91| 日韩成人在线网站| 亚洲免费毛片| 国产成人精品一区二区三在线观看| 亚洲天堂视频在线观看| 欧美亚洲中文精品三区| 免费jizz在线播放| 亚洲欧美在线精品一区二区| 成人免费午间影院在线观看| 国产成人艳妇AA视频在线| 国产一区二区丝袜高跟鞋| 欧美一级在线看| 91精品视频在线播放| 亚洲日韩精品无码专区97| 国产日本一线在线观看免费| 毛片一级在线| 国产乱子伦视频三区| 日本精品中文字幕在线不卡| 日韩欧美国产成人| 青草91视频免费观看| 亚洲欧洲自拍拍偷午夜色无码| 久久窝窝国产精品午夜看片| 免费一级毛片| 亚洲乱码在线播放| 麻豆精品视频在线原创| 欧美69视频在线| 亚洲第一页在线观看| 免费国产不卡午夜福在线观看| 亚洲国产成人在线| 免费人成视频在线观看网站| 成人国产一区二区三区| AV无码无在线观看免费| 欧洲高清无码在线| 国产精品免费电影| 无码精品国产VA在线观看DVD| 亚洲香蕉在线| 色综合激情网| 欧美一级黄色影院| 国产女人在线| 国产美女91呻吟求| 国产精品久久久精品三级| 久久99国产精品成人欧美| 蝌蚪国产精品视频第一页| 任我操在线视频|