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