匿名对象+内部类
匿名對象
普通的類對象在使用時(shí)會定義一個(gè)類類型的變量,用來保存new出來的類所在的地址。而匿名類取消掉了這個(gè)變量,這個(gè)地址由編譯器來處理,并且在new出來之后,它占用的內(nèi)存會有JVM自動回收掉。后續(xù)無法再使用了。
例如
匿名對象最常用的方式是作為函數(shù)的參數(shù),比如上述的打印語句 "good morning teacher!" 它就是一個(gè)匿名對象,由于字符串是以對象的形式存儲的,所以這里實(shí)際上就是一個(gè)沒有使用對象引用的匿名對象。
當(dāng)然也可以將匿名對象作為函數(shù)的返回值。
內(nèi)部類
內(nèi)部類的種類:成員內(nèi)部類、靜態(tài)內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類
成員內(nèi)部類
java中允許在一個(gè)類中定義另一個(gè)類。例如
public class Car{ public class Engine{ } }上述例子在Car這個(gè)類中定義了一個(gè)Engine類,那么Car就是外部類,而Engine就是內(nèi)部類。
使用內(nèi)部類需要注意:外部類是包含內(nèi)部類的,所以內(nèi)部類可以看到外部類的所有屬性和方法,包括private方法。但是反過來則不行;
使用內(nèi)部類主要有兩種方式:
- 在外部類中使用內(nèi)部類的成員(間接使用)。這種方法一般是在外部類的方法中創(chuàng)建內(nèi)部類的對象,并調(diào)用對象的方法
- 直接使用:根據(jù)上面的定義,可以這樣使用 `Car.Engine eng = new Car().new Engine()
局部內(nèi)部類
內(nèi)部類不光可以直接定義在外部類中作為成員內(nèi)部類,也可以定義在方法中,作為局部內(nèi)部類
局部內(nèi)部類也叫區(qū)域內(nèi)嵌類,局部內(nèi)部類與成員內(nèi)部類類似,不過,區(qū)域內(nèi)嵌類是定義在一個(gè)方法中的內(nèi)嵌類
主要特定有:
- 局部內(nèi)部類只能在對應(yīng)方法中訪問,在方法外無效
- 不能使用private,protected,public修飾符。
- 不能包含靜態(tài)成員
- 局部內(nèi)部類如果想要訪問方法中的局部變量時(shí),局部變量必須是常量。因?yàn)榫植孔兞繒r(shí)分配在棧中,而局部內(nèi)部類是分配在堆中的,有可能出現(xiàn)這樣的情況,外部類的方法執(zhí)行完了,內(nèi)存被回收了,但是局部內(nèi)部類可能還在,所以在訪問局部變量時(shí),做了一個(gè)拷貝將局部變量拷貝到局部內(nèi)部類所在的堆中。為了保證數(shù)據(jù)的完整性,所以這里被拷貝的變量不允許再做修改。
靜態(tài)內(nèi)部類
內(nèi)部類如果使用static聲明,則此內(nèi)部類就稱為靜態(tài)內(nèi)部類。它可以通過?外部類 . 內(nèi)部類?的方式來訪問。由于靜態(tài)內(nèi)部類是與對象無關(guān)的,在使用靜態(tài)類的成員時(shí)是不需要?jiǎng)?chuàng)建對象的。所以如果想要在靜態(tài)內(nèi)部類中來訪問外部類的成員變量,必須通過外部類的對象實(shí)例來訪問。
public class Company { String companyNam; static String country; static class Clear{ String name; public Clear() { } public Clear(String name) { super(); this.name = name; } public void work(String name){ String na = new Company().companyNam="聯(lián)想"; country="中國"; System.out.println(name+"為"+na+"打掃衛(wèi)生,該公司屬于"+country); } } }匿名內(nèi)部類
如果一個(gè)內(nèi)部類在整個(gè)操作中只使用一次的話,就可以定義為匿名內(nèi)部類。匿名內(nèi)部類也就是沒有名字的內(nèi)部類,這是java為了方便我們編寫程序而設(shè)計(jì)的一個(gè)機(jī)制,因?yàn)橛袝r(shí)候有的內(nèi)部類只需要?jiǎng)?chuàng)建一個(gè)它的對象就可以了,以后再不會用到這個(gè)類,這時(shí)候使用匿名內(nèi)部類就比較合適。
匿名內(nèi)部類,一般都伴隨著接口一起使用比如
public interface USB{ public abstract void open(); public abstract void close(); } public class Demo{ public static void main(String[] args){ USB usb = new USB(){ public void open(){} public void close(){} } usb.open(); usb.close(); //使用匿名內(nèi)部類的匿名對象的方式 USB usb = new USB(){ public void open(){} public void close(){} }.open(); } }轉(zhuǎn)載于:https://www.cnblogs.com/sy130908/p/11433015.html
總結(jié)
- 上一篇: final+static
- 下一篇: 算法第一次作业