奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語言

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

時間:2024-07-24 19:22:32 java語言 我要投稿
  • 相關推薦

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

  通過反射構造內部類對象

  首先在 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。現在我們可以用反射來構造非公開內部類的對象了。

  接下來,我們再把 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,原來如此。看來非靜態的內部類沒有缺省的構造方法,構造時需要傳一個外部類的實例作為參數。

  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); } }

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

【講解Java中如何構造內部類對象及訪問對象】相關文章:

java面向對象編程講解06-18

如何理解Java對象的序列化09-26

Java中對象和引用的具體區別05-18

java如何構造09-21

Java語言的內部類07-07

Java中通過final關鍵字面向對象的詳解08-09

java序列化對象的技巧09-30

java對象持久化的使用技巧09-23

JAVA對象創造及內存布局介紹10-09

java反序列化對象的技巧08-29

主站蜘蛛池模板: 余姚市| 凌源市| 新邵县| 竹北市| 抚州市| 黑水县| 揭西县| 木里| 沁水县| 商河县| 青海省| 洪洞县| 锦屏县| 吴堡县| 横山县| 赞皇县| 那曲县| 长武县| 泰州市| 简阳市| 穆棱市| 阜城县| 鞍山市| 津南区| 武邑县| 寿宁县| 留坝县| 玉山县| 弥勒县| 榆社县| 长子县| 陕西省| 罗田县| 连城县| 安国市| 个旧市| 昌乐县| 长治县| 通山县| 且末县| 天门市|