亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2014-04-06 11:57:40
        山東工業(yè)技術(shù) 2014年17期
        關(guān)鍵詞:部類編譯器靜態(tài)

        魏 鋼

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

        深入研究Java內(nèi)部類的實(shí)現(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)部類的實(shí)現(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)部類的實(shí)現(xiàn)原理

        Java編譯器對內(nèi)部類和外部類是分別進(jìn)行編譯的,編譯后產(chǎn)生Outer.class和Outer$1Inner.class兩個字節(jié)碼文件,外部類能實(shí)例化私有常規(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)實(shí)例化私有常規(guī)內(nèi)部類時的代碼被改為1Inner in=new 1Inner(null),實(shí)際上調(diào)用的是包可見構(gòu)造器,包可見構(gòu)造器內(nèi)部又調(diào)用了私有構(gòu)造器,因此外部類可以實(shí)例化私有常規(guī)內(nèi)部類。因?yàn)樗接谐R?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)部類的實(shí)現(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)部類的實(shí)現(xiàn)原理

        反編譯Outer$1Inner.class時發(fā)現(xiàn)編譯器對局部內(nèi)部類生成“fnal Outer this$0”和“private fnal int val$j”。局部內(nèi)部類通過外部類引用變量可實(shí)現(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 接口名(){//實(shí)現(xiàn)接口方法}。

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

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

        5 結(jié)束語

        通過反編譯技術(shù)的使用,深入研究了Java內(nèi)部類的實(shí)現(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實(shí)用教程[M].北京:清華大學(xué)出版社,2013.

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

        猜你喜歡
        部類編譯器靜態(tài)
        靜態(tài)隨機(jī)存儲器在軌自檢算法
        基于相異編譯器的安全計算機(jī)平臺交叉編譯環(huán)境設(shè)計
        探討Java中內(nèi)部類及其用法
        固定資本、生產(chǎn)資料優(yōu)先增長與工業(yè)化
        ——基于三大部類再生產(chǎn)圖式的結(jié)構(gòu)分析*
        機(jī)床靜態(tài)及動態(tài)分析
        具7μA靜態(tài)電流的2A、70V SEPIC/升壓型DC/DC轉(zhuǎn)換器
        通用NC代碼編譯器的設(shè)計與實(shí)現(xiàn)
        50t轉(zhuǎn)爐靜態(tài)控制模型開發(fā)及生產(chǎn)實(shí)踐
        上海金屬(2013年6期)2013-12-20 07:57:59
        馬克思再生產(chǎn)模型中的最高、最低積累率
        馬克思兩部類模型非均衡增長分析及模擬
        免费人成视频欧美| 一区二区和激情视频| 特级做a爰片毛片免费看| 国产午夜精品一区二区三区| 国产又黄又猛又粗又爽的a片动漫 亚洲精品毛片一区二区三区 | 久久久精品2019中文字幕之3| 在线亚洲精品国产成人二区| 白白色视频这里只有精品| 男人的天堂av高清在线| 亚洲va久久久噜噜噜久久男同| 亚洲美国产亚洲av| 国产成人精品aaaa视频一区 | 精品精品国产三级av在线| 久久久久久夜精品精品免费啦| 无码人妻精品一区二区| 精品久久无码中文字幕| 中文字幕一区二区网站| 丝袜美腿亚洲综合第一页| 国产亚州精品女人久久久久久| 黑人巨大无码中文字幕无码| 久久久精品国产亚洲AV蜜| 白色月光在线观看免费高清| 国产一区二区精品人妖系列在线| 97人人模人人爽人人喊网| 最近日本免费观看高清视频| 国产综合第一夜| 久久亚洲精品中文字幕蜜潮 | 久久久久久久亚洲av无码| 人人澡人人澡人人看添av| 无码一区东京热| 一区二区三区四区免费国产视频| av剧情演绎福利对白| 男ji大巴进入女人的视频小说| 国产成人无码一二三区视频| 一区二区视频网站在线观看 | 日本伊人精品一区二区三区 | 国产mv在线天堂mv免费观看| 久久亚洲精品成人AV无码网址| 按摩少妇高潮在线一区| 亚洲av综合一区二区在线观看| 国产国语熟妇视频在线观看|