欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

講解Java中如何構(gòu)造內(nèi)部類對(duì)象以及訪問(wèn)對(duì)象

 更新時(shí)間:2015年09月15日 09:00:27   作者:捏造的信仰  
這篇文章主要介紹了講解Java中如何構(gòu)造內(nèi)部類對(duì)象以及訪問(wèn)對(duì)象,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

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

package javalang;

public class Outer {
  public static class Inner1{}
}

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

要想通過(guò)反射來(lái)創(chuàng)建 Inner1 對(duì)象,首先要獲得 Inner1 的 Class 對(duì)象。我們?cè)?Outer 中寫上 main 方法:

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

 

輸出結(jié)果:

class javalang.Outer$Inner1

然后我們?cè)囈幌逻@個(gè)類名對(duì)不對(duì):

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

 

運(yùn)行一下,沒(méi)錯(cuò)。然后就是用它來(lái)創(chuàng)建對(duì)象。創(chuàng)建對(duì)象要靠構(gòu)造方法。這個(gè)類有沒(méi)有構(gòu)造方法呢?我們可以這么寫:

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

 

運(yùn)行一下,輸出 1??磥?lái)有。然后看看這個(gè)構(gòu)造方法是什么樣子的:

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

 

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

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

 

輸出結(jié)果:javalang.Outer$Inner1@ca0b6。這說(shuō)明執(zhí)行成功了。

接下來(lái)我們把 Inner 的 public 關(guān)鍵字去掉,然后再運(yùn)行。結(jié)果報(bào)錯(cuò)了:

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

這說(shuō)明沒(méi)有找到構(gòu)造方法。真的沒(méi)有嗎?我們把 main 方法改回來(lái):

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

 

輸出結(jié)果:0。真的沒(méi)有構(gòu)造方法嗎?其實(shí)不是,只是構(gòu)造方法不是公開的。這時(shí)我們必須用 getDeclaredConstructors() 來(lái)獲得:

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

 

輸出結(jié)果:1。這就把構(gòu)造方法找到了。然后我們繼續(xù)調(diào)用這個(gè)構(gòu)造方法:

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

 

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

接下來(lái),我們?cè)侔?static 關(guān)鍵字去掉。這時(shí)候報(bào)錯(cuò)了:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments

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

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

 

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

原來(lái)構(gòu)造方法里面需要一個(gè) Outer 類型的參數(shù)。這好辦:

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

輸出結(jié)果:

javalang.Outer$Inner1@ca0b6

OK,原來(lái)如此??磥?lái)非靜態(tài)的內(nèi)部類沒(méi)有缺省的構(gòu)造方法,構(gòu)造時(shí)需要傳一個(gè)外部類的實(shí)例作為參數(shù)。


Java: 如何訪問(wèn)一個(gè)對(duì)象
對(duì) Java 初學(xué)者來(lái)說(shuō)一個(gè)頭疼的問(wèn)題是,如何決定把一個(gè)對(duì)象是定義為方法變量,還是定義為成員變量?
 
最開始初學(xué)者還不會(huì)關(guān)心這點(diǎn)。但是當(dāng)寫出來(lái)的程序越來(lái)越大,類越來(lái)越多時(shí),這種苦惱也應(yīng)運(yùn)而生。
 
但我這里要寫的是:如何隨心所欲的安排一個(gè)對(duì)象,讓你隨時(shí)可以訪問(wèn)。掌握了這點(diǎn),你就可以自由的決定將一個(gè)對(duì)象放在什么地方了。
 
下面舉一個(gè)簡(jiǎn)單的例子:

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

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

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

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

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

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

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

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

public class AccessingObject { 
  
  public static void main(String[] args) { 
    Date date = new Date(); 
    Date anHourLater = anHourLater(date); 
  } 
  
  // 獲得 date 對(duì)象一小時(shí)后的時(shí)間 
  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 對(duì)象一小時(shí)后的時(shí)間 
  private static void anHourLater(Date d) { 
    d.setTime(d.getTime() + 3600000); 
  } 
} 

其中第二種方法要慎用,因?yàn)殡S便動(dòng)人家的東西是不對(duì)的,你不知道方法的調(diào)用者喜不喜歡你這么做。

相關(guān)文章

  • iOS正確監(jiān)聽手機(jī)靜音鍵和側(cè)邊音量鍵的方法示例

    iOS正確監(jiān)聽手機(jī)靜音鍵和側(cè)邊音量鍵的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS正確監(jiān)聽手機(jī)側(cè)邊音量鍵的相關(guān)資料,并且給大家分享了ios監(jiān)聽靜音鍵的示例代碼,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-11-11
  • IOS框架Spring常用的動(dòng)畫效果

    IOS框架Spring常用的動(dòng)畫效果

    本文給大家介紹的是在IOS開發(fā)中常用的動(dòng)畫效果以及自定義轉(zhuǎn)場(chǎng)動(dòng)畫特效的代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2016-03-03
  • iOS開發(fā)中多線程的安全隱患總結(jié)

    iOS開發(fā)中多線程的安全隱患總結(jié)

    在本篇文章中小編給大家整理了關(guān)于iOS開發(fā)中多線程的安全隱患的知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)參考下。
    2019-07-07
  • iOS schem與Universal Link 調(diào)試時(shí)踩坑解決記錄

    iOS schem與Universal Link 調(diào)試時(shí)踩坑解決記錄

    這篇文章主要為大家介紹了iOS schem與Universal Link 調(diào)試時(shí)踩坑解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • iOS開發(fā)之級(jí)聯(lián)界面(推薦界面)搭建原理

    iOS開發(fā)之級(jí)聯(lián)界面(推薦界面)搭建原理

    這篇文章主要為大家詳細(xì)介紹了iOS級(jí)聯(lián)界面(推薦界面)搭建原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • iPhoneX 序列適配方案(小結(jié))

    iPhoneX 序列適配方案(小結(jié))

    這篇文章主要介紹了iPhoneX 序列適配方案(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • iOS開發(fā)之導(dǎo)航欄各種右滑返回失效的解決方法匯總

    iOS開發(fā)之導(dǎo)航欄各種右滑返回失效的解決方法匯總

    這篇文章主要給大家總結(jié)介紹了關(guān)于iOS開發(fā)教程之導(dǎo)航欄各種右滑返回失效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • iOS系統(tǒng)和微信中不支持audio自動(dòng)播放問(wèn)題的解決方法

    iOS系統(tǒng)和微信中不支持audio自動(dòng)播放問(wèn)題的解決方法

    最近在微信端開發(fā)H5的時(shí)候,audio標(biāo)簽在蘋果機(jī)上無(wú)法進(jìn)行自動(dòng)播放,查找相關(guān)資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于iOS系統(tǒng)和微信中不支持audio自動(dòng)播放問(wèn)題的解決方法,需要的朋友可以參考下。
    2017-09-09
  • iOS Swift 值類型與引用類型使用區(qū)別基礎(chǔ)詳解

    iOS Swift 值類型與引用類型使用區(qū)別基礎(chǔ)詳解

    這篇文章主要為大家介紹了iOS Swift 值類型與引用類型使用區(qū)別基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 通過(guò)UIKit坐標(biāo)系來(lái)全面掌握iOS中的UIScrollView組件

    通過(guò)UIKit坐標(biāo)系來(lái)全面掌握iOS中的UIScrollView組件

    iOS開發(fā)套件中的UIScrollView組件十分強(qiáng)大,不僅是滾動(dòng),縮放操作也能夠控制自如,其核心當(dāng)然是坐標(biāo)軸上的控制,下面就通過(guò)UIKit坐標(biāo)系來(lái)全面掌握iOS中的UIScrollView組件
    2016-05-05

最新評(píng)論