国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 講解Java中如何構(gòu)造內(nèi)部類對象以及訪問對象

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

2020-12-23 15:28捏造的信仰 Java教程

這篇文章主要介紹了講解Java中如何構(gòu)造內(nèi)部類對象以及訪問對象,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

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

?
1
2
3
4
5
package javalang;
 
public class Outer {
  public static class Inner1{}
}

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

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

?
1
2
3
4
5
6
7
public class Outer {
  public static class Inner1{}
  
  public static void main(String[] args) {
    System.out.println(Inner1.class);
  }
}

 

輸出結(jié)果:

?
1
class javalang.Outer$Inner1

然后我們試一下這個(gè)類名對不對:

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

 

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

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

 

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

?
1
2
3
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)造方法嘛。所以我們可以這樣寫:

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

 

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

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

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

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

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

 

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

?
1
2
3
4
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)造方法:

?
1
2
3
4
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)在我們可以用反射來構(gòu)造非公開內(nèi)部類的對象了。

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

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

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

 

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

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

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

輸出結(jié)果:

?
1
javalang.Outer$Inner1@ca0b6

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


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

?
1
2
3
4
5
6
7
8
9
10
11
public class AccessingObject {
  
  public static void main(String[] args) {
    Date date = new Date();
  }
  
  // 獲得 date 對象一小時(shí)后的時(shí)間
  private static void anHourLater() {
    // 這里如何獲得 main() 方法中的 date 變量?
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
public class AccessingObject {
  
  public static void main(String[] args) {
    Date date = new Date();
    anHourLater(date);
  }
  
  // 獲得 date 對象一小時(shí)后的時(shí)間
  private static void anHourLater(Date d) {
    Date anHourLater = new Date(d.getTime() + 3600000);
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AccessingObject {
  
  private static Date date;
  
  public static void main(String[] args) {
    date = new Date();
    anHourLater();
  }
  
  // 獲得 date 對象一小時(shí)后的時(shí)間
  private static void anHourLater() {
    Date anHourLater = new Date(date.getTime() + 3600000);
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AccessingObject {
  
  public static void main(String[] args) {
    DateHolder.date = new Date();
  }
  
  // 獲得 date 對象一小時(shí)后的時(shí)間
  private static void anHourLater() {
    Date anHourLater = new Date(DateHolder.date.getTime() + 3600000);
  }
}
  
class DateHolder {
  public static Date date;
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
public class AccessingObject {
  
  public static void main(String[] args) {
    Date date = new Date();
    Date anHourLater = anHourLater(date);
  }
  
  // 獲得 date 對象一小時(shí)后的時(shí)間
  private static Date anHourLater(Date d) {
    return new Date(d.getTime() + 3600000);
  }
}

(2)直接修改參數(shù)的內(nèi)容

?
1
2
3
4
5
6
7
8
9
10
11
12
public class AccessingObject {
  
  public static void main(String[] args) {
    Date date = new Date();
    anHourLater(date);
  }
  
  // 獲得 date 對象一小時(shí)后的時(shí)間
  private static void anHourLater(Date d) {
    d.setTime(d.getTime() + 3600000);
  }
}

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美1区 | 欧美一区二区精品 | 日韩毛片免费看 | 99久久久无码国产精品 | 精品96久久久久久中文字幕无 | 精品久久一区 | 在线视频一区二区三区 | 久久久99久久久国产自输拍 | 思热99re视热频这里只精品 | 亚洲精品久久久久久动漫 | 日本中文字幕在线电影 | 天天看天天爽 | 欧美高清com| 蜜桃免费一区二区三区 | 日韩精品一区二区三区四区五区 | 日韩在线区 | 做a视频免费观看 | 欧美日韩91| 久久a国产 | 欧美成人一区二免费视频软件 | 中文字幕在线观看日本 | 成人午夜精品久久久久久久网站 | 国产精品自拍在线观看 | 午夜爽 | www中文字幕在线观看 | 91久久久久久久久 | 99久久婷婷国产综合精品电影 | 久久亚洲精品国产精品紫薇 | 五月天黄色片 | 免费一级毛片在线播放放视频 | 黄色一级电影在线观看 | 国产成人精品一区 | 欧美日本韩国一区二区 | 大白屁股一区二区视频 | 国产婷婷色一区二区三区 | 九九色综合 | 亚洲a网| 精品国产免费久久久久久尖叫 | 成年人精品视频 | 日韩欧美中文字幕在线视频 | 国产精品久久久久久亚洲调教 |