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

首頁 > 系統 > iOS > 正文

講解Java中如何構造內部類對象以及訪問對象

2020-07-26 03:34:13
字體:
來源:轉載
供稿:網友

通過反射構造內部類對象
首先在 javalang 包下寫一個包含內部類的類:

package javalang;public class Outer {  public static class Inner1{}}

注意這個類是 public static,后面我們慢慢把這些修飾符去掉。

要想通過反射來創建 Inner1 對象,首先要獲得 Inner1 的 Class 對象。我們在 Outer 中寫上 main 方法:

public class Outer {  public static class Inner1{}    public static void main(String[] args) {    System.out.println(Inner1.class);  }}

 

輸出結果:

class javalang.Outer$Inner1

然后我們試一下這個類名對不對:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1"));}

 

運行一下,沒錯。然后就是用它來創建對象。創建對象要靠構造方法。這個類有沒有構造方法呢?我們可以這么寫:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1").getConstructors().length);}

 

運行一下,輸出 1??磥碛?。然后看看這個構造方法是什么樣子的:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1").getConstructors()[0]);}

 

輸出結果:public javalang.Outer$Inner1()。這就是缺省構造方法嘛。所以我們可以這樣寫:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1")      .getConstructors()[0].newInstance();}

 

輸出結果:javalang.Outer$Inner1@ca0b6。這說明執行成功了。

接下來我們把 Inner 的 public 關鍵字去掉,然后再運行。結果報錯了:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

這說明沒有找到構造方法。真的沒有嗎?我們把 main 方法改回來:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1")      .getConstructors().length);}

 

輸出結果:0。真的沒有構造方法嗎?其實不是,只是構造方法不是公開的。這時我們必須用 getDeclaredConstructors() 來獲得:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1")      .getDeclaredConstructors().length);}

 

輸出結果:1。這就把構造方法找到了。然后我們繼續調用這個構造方法:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1")      .getDeclaredConstructors()[0].newInstance());}

 

輸出結果:javalang.Outer$Inner1@ca0b6?,F在我們可以用反射來構造非公開內部類的對象了。

接下來,我們再把 static 關鍵字去掉。這時候報錯了:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments

這說明什么呢?我們調用的時候沒有傳參數,而錯誤內容就是說參數數量不正確。那么這個構造方法有什么參數呢?我們改一下代碼看看:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1")      .getDeclaredConstructors()[0]);}

 

輸出結果:javalang.Outer$Inner1(javalang.Outer)

原來構造方法里面需要一個 Outer 類型的參數。這好辦:

public static void main(String[] args) throws Exception {  System.out.println(Class.forName("javalang.Outer$Inner1")      .getDeclaredConstructors()[0].newInstance(new Outer()));}

輸出結果:

javalang.Outer$Inner1@ca0b6

OK,原來如此??磥矸庆o態的內部類沒有缺省的構造方法,構造時需要傳一個外部類的實例作為參數。


Java: 如何訪問一個對象
對 Java 初學者來說一個頭疼的問題是,如何決定把一個對象是定義為方法變量,還是定義為成員變量?
 
最開始初學者還不會關心這點。但是當寫出來的程序越來越大,類越來越多時,這種苦惱也應運而生。
 
但我這里要寫的是:如何隨心所欲的安排一個對象,讓你隨時可以訪問。掌握了這點,你就可以自由的決定將一個對象放在什么地方了。
 
下面舉一個簡單的例子:

public class AccessingObject {     public static void main(String[] args) {     Date date = new Date();   }     // 獲得 date 對象一小時后的時間   private static void anHourLater() {     // 這里如何獲得 main() 方法中的 date 變量?   } } 

正如 anHourLater() 方法中描述的,想要獲得 date 一小時后的時間。怎么辦呢?有下面幾種方法。
 
(1)參數傳遞

public class AccessingObject {     public static void main(String[] args) {     Date date = new Date();     anHourLater(date);   }     // 獲得 date 對象一小時后的時間   private static void anHourLater(Date d) {     Date anHourLater = new Date(d.getTime() + 3600000);   } } 

(2)定義為成員。成員可以由所有方法訪問,成員的初始化可以放在定義的地方,也可以放在任何一個方法里。

public class AccessingObject {     private static Date date;     public static void main(String[] args) {     date = new Date();     anHourLater();   }     // 獲得 date 對象一小時后的時間   private static void anHourLater() {     Date anHourLater = new Date(date.getTime() + 3600000);   } } 

(3)放到另外一個類當中去。在下面的例子中,DateHolder.date 可以被同一個包中的所有類訪問,而不僅限于 AccessingObject 類。

public class AccessingObject {     public static void main(String[] args) {     DateHolder.date = new Date();   }     // 獲得 date 對象一小時后的時間   private static void anHourLater() {     Date anHourLater = new Date(DateHolder.date.getTime() + 3600000);   } }   class DateHolder {   public static Date date; } 

這三個例子比較起來,前兩個只能在類的內部使用,相對比較安全。如果你不希望這個對象被別的類直接修改,就不要用第三種方式。
 
第一種方式和第二種方式的區別在于:如果一個對象只在方法中使用,那么當方法執行完后,這個對象能夠很容易的被回收(注意,不是馬上被回收)。如果定義為類的成員,那么只有當它所在的類被回收之后,這個對象才會被回收。顯然,第一種方式是最節約資源的,我們應該盡量使用第一種方式。
 
回頭再看看這三個例子,如果 main() 方法要獲得 anHourLater() 方法中得出的一小時后時間,它也有幾種對應的方式。后兩個例子就不用改了,date 對象是可以直接訪問的;第一個例子,有兩種修改方式:
 
(1)作為返回值

public class AccessingObject {     public static void main(String[] args) {     Date date = new Date();     Date anHourLater = anHourLater(date);   }     // 獲得 date 對象一小時后的時間   private static Date anHourLater(Date d) {     return new Date(d.getTime() + 3600000);   } } 

(2)直接修改參數的內容

public class AccessingObject {     public static void main(String[] args) {     Date date = new Date();     anHourLater(date);   }     // 獲得 date 對象一小時后的時間   private static void anHourLater(Date d) {     d.setTime(d.getTime() + 3600000);   } } 

其中第二種方法要慎用,因為隨便動人家的東西是不對的,你不知道方法的調用者喜不喜歡你這么做。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久午夜| 久久久中精品2020中文| 国产在线日韩在线| 亚洲欧美另类在线观看| 欧美精品一二区| 欧美性20hd另类| 日韩精品在线免费观看视频| 亚洲精品免费在线视频| 日韩亚洲欧美中文高清在线| 一区二区成人av| 俺也去精品视频在线观看| 在线播放日韩专区| 91精品国产91| 日韩精品免费在线播放| 日韩中文字幕在线免费观看| 午夜免费久久久久| 精品日韩美女的视频高清| 亚洲精品视频中文字幕| 国产啪精品视频网站| 国产玖玖精品视频| 亚洲男子天堂网| 久久久国产精品视频| 影音先锋日韩有码| 68精品久久久久久欧美| 日韩亚洲第一页| 日本高清久久天堂| 亚洲国内精品视频| 日韩美女在线观看一区| 欧美成人激情图片网| 大荫蒂欧美视频另类xxxx| 欧美精品videos另类日本| 亚洲老板91色精品久久| 久久天天躁狠狠躁夜夜av| 久久久久久久久网站| 97精品一区二区视频在线观看| 亚洲欧美日韩爽爽影院| 中文字幕亚洲欧美日韩在线不卡| 国产91精品高潮白浆喷水| 久久天天躁狠狠躁夜夜爽蜜月| 51精品国产黑色丝袜高跟鞋| 欧美色图在线视频| 亚洲欧美激情视频| 国产精品白丝jk喷水视频一区| 成人午夜黄色影院| 国产精品日韩电影| 国产日韩视频在线观看| 国产精品偷伦一区二区| 亚洲日韩中文字幕| 日韩经典中文字幕在线观看| 亚洲视频在线看| 欧美性猛交xxxxx水多| 亚洲一区二区三区久久| 黑人极品videos精品欧美裸| 中文字幕精品一区久久久久| 欧美色图在线视频| 欧美在线欧美在线| 九九热在线精品视频| 日韩国产中文字幕| 97精品国产97久久久久久| 久久久久久国产精品三级玉女聊斋| 不卡av在线播放| 岛国av午夜精品| 中文字幕日韩视频| 国产精品久久久久9999| 91高清视频免费| 91亚洲精品一区| 一区二区在线视频| 永久免费精品影视网站| 亚洲精品欧美日韩| 国产一级揄自揄精品视频| 欧美国产日韩在线| 亚洲天堂开心观看| 欧美在线视频观看免费网站| 中文字幕精品影院| 中文字幕亚洲一区二区三区五十路| 中文字幕日韩欧美在线视频| 中文字幕视频在线免费欧美日韩综合在线看| 国产在线拍揄自揄视频不卡99| 亚洲国产免费av| 国产在线视频欧美| 国产97在线播放| 北条麻妃在线一区二区| 欧美在线一级va免费观看| 在线亚洲午夜片av大片| 欧美一级大片在线观看| 国产成人黄色av| 国产精品欧美日韩久久| 国产女精品视频网站免费| 性欧美视频videos6一9| 亚洲有声小说3d| 一区二区三区四区在线观看视频| 成人国产亚洲精品a区天堂华泰| 色婷婷综合成人av| 久久韩剧网电视剧| 国产欧美精品在线| 国产精品嫩草影院一区二区| 国产精品视频yy9099| 日韩电影免费观看中文字幕| 国产精品一区二区久久| 中文字幕亚洲字幕| 国产自产女人91一区在线观看| 久久免费精品日本久久中文字幕| 欧美激情视频网站| 亚洲自拍偷拍一区| 欧美极品少妇xxxxx| 久久精品国产一区| 日韩电影网在线| 91精品啪aⅴ在线观看国产| 国产免费成人av| 欧美精品一区三区| 91精品国产91久久久久久久久| 国产精品美乳一区二区免费| 热草久综合在线| 在线播放精品一区二区三区| 亚洲午夜精品久久久久久久久久久久| 亚洲国产成人精品久久久国产成人一区| 欧美成人精品在线视频| 国产91在线播放九色快色| 亚洲人午夜精品| 亚洲精品综合久久中文字幕| 国产精品影片在线观看| 色偷偷av一区二区三区| 久久网福利资源网站| 国产免费久久av| 欧美一区二区三区精品电影| 国产精品十八以下禁看| 国产成人精品久久二区二区| 国产精品福利在线观看网址| 亚洲午夜av久久乱码| 97在线视频免费播放| 亚洲精品永久免费精品| 国产精品欧美日韩一区二区| 亚洲自拍偷拍色图| 欧美精品成人91久久久久久久| 日韩精品在线免费观看| 久色乳综合思思在线视频| 久久精品国产成人| 少妇高潮 亚洲精品| 欧美一级在线播放| 欧美激情一区二区三级高清视频| 亚洲天天在线日亚洲洲精| 精品中文字幕在线2019| 日韩精品在线观看视频| 亚洲精品国产精品国产自| 日韩av最新在线观看| 久久亚洲精品中文字幕冲田杏梨| 欧美极品欧美精品欧美视频| 欧美在线免费看| 日韩亚洲在线观看| 一区二区三区回区在观看免费视频| 亚洲一区免费网站| 久久亚洲电影天堂| 国产成人91久久精品| 97成人精品视频在线观看| 超碰日本道色综合久久综合| 精品国产乱码久久久久久婷婷| 国产福利视频一区二区| 午夜精品福利在线观看| 中文字幕日韩在线观看| 日韩av色在线| 欧美性xxxx极品高清hd直播| 亚洲第一精品福利| 国产97色在线|日韩| 亚洲精品wwww|