国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

講解Java中如何構造內(nèi)部類對象以及訪問對象

2020-02-19 15:52:21
字體:
來源:轉載
供稿:網(wǎng)友

Java中內(nèi)部類具有與外部類同名的變量時,會出現(xiàn)隱藏現(xiàn)象,即默認訪問內(nèi)部類的情況,下面就讓武林技術頻道小編講解Java中如何構造內(nèi)部類對象以及訪問對象,一起來了解一下吧!

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

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

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

要想通過反射來創(chuàng)建 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"));}

?

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

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。這說明執(zhí)行成功了。

接下來我們把 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。這就把構造方法找到了。然后我們繼續(xù)調(diào)用這個構造方法:

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

?

輸出結果:javalang.Outer$Inner1@ca0b6。現(xiàn)在我們可以用反射來構造非公開內(nèi)部類的對象了。

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

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

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

?

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

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

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,原來如此。看來非靜態(tài)的內(nèi)部類沒有缺省的構造方法,構造時需要傳一個外部類的實例作為參數(shù)。


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)參數(shù)傳遞

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

這三個例子比較起來,前兩個只能在類的內(nèi)部使用,相對比較安全。如果你不希望這個對象被別的類直接修改,就不要用第三種方式。
?
第一種方式和第二種方式的區(qū)別在于:如果一個對象只在方法中使用,那么當方法執(zhí)行完后,這個對象能夠很容易的被回收(注意,不是馬上被回收)。如果定義為類的成員,那么只有當它所在的類被回收之后,這個對象才會被回收。顯然,第一種方式是最節(jié)約資源的,我們應該盡量使用第一種方式。
?
回頭再看看這三個例子,如果 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)直接修改參數(shù)的內(nèi)容

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中如何構造內(nèi)部類對象以及訪問對象,希望對你學習這方面只是有幫助,也希望大家繼續(xù)支持武林技術頻道!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 拉萨市| 铜陵市| 游戏| 三原县| 岳阳市| 偃师市| 乌恰县| 德州市| 华阴市| 乌兰浩特市| 东乡| 高尔夫| 巫山县| 新宾| 科技| 南江县| 滕州市| 剑河县| 福州市| 宝清县| 新源县| 富顺县| 普定县| 白河县| 台前县| 崇州市| 视频| 来安县| 襄城县| 开封市| 巴东县| 绵阳市| 兰西县| 萨嘎县| 宝清县| 德阳市| 昌宁县| 苍梧县| 拜城县| 无极县| 孙吴县|