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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

淺析Java語言中的內(nèi)部類

2019-11-18 10:41:02
字體:
供稿:網(wǎng)友

  提起java內(nèi)部類(Inner Class)可能很多人不太熟悉,實(shí)際上類似的概念在C++里也有,那就是嵌套類(Nested Class),關(guān)于這兩者的區(qū)別與聯(lián)系,在下文中會(huì)有對(duì)比。內(nèi)部類從表面上看,就是在類中又定義了一個(gè)類(下文會(huì)看到,內(nèi)部類可以在很多地方定義),而實(shí)際上并沒有那么簡(jiǎn)單,乍看上去內(nèi)部類似乎有些多余,它的用處對(duì)于初學(xué)者來說可能并不是那么顯著,但是隨著對(duì)它的深入了解,你會(huì)發(fā)現(xiàn)Java的設(shè)計(jì)者在內(nèi)部類身上的確是專心良苦。學(xué)會(huì)使用內(nèi)部類,是把握J(rèn)ava高級(jí)編程的一部分,它可以讓你更優(yōu)雅地設(shè)計(jì)你的程序結(jié)構(gòu)。下面從以下幾個(gè)方面來介紹:

  第一次見面

public interface Contents {
 int value();
}

public interface Destination {
 String readLabel();
}

public class Goods {
 PRivate class Content implements Contents {
  private int i = 11;
  public int value() {
   return i;
  }
 }

 protected class GDestination implements Destination {
  private String label;
  private GDestination(String whereTo) {
   label = whereTo;
  }
  public String readLabel() {
   return label;
  }
 }

 public Destination dest(String s) {
  return new GDestination(s);
 }
 public Contents cont() {
  return new Content();
 }
}

class TestGoods {
 public static void main(String[] args) {
  Goods p = new Goods();
  Contents c = p.cont();
  Destination d = p.dest("Beijing");
 }
}
  在這個(gè)例子里類Content和GDestination被定義在了類Goods內(nèi)部,并且分別有著protected和private修飾符來控制訪問級(jí)別。Content代表著Goods的內(nèi)容,而GDestination代表著Goods的目的地。它們分別實(shí)現(xiàn)了兩個(gè)接口Content和Destination。在后面的main方法里,直接用 Contents c和Destination d進(jìn)行操作,你甚至連這兩個(gè)內(nèi)部類的名字都沒有看見!這樣,內(nèi)部類的第一個(gè)好處就體現(xiàn)出來了——隱藏你不想讓別人知道的操作,也即封裝性。

  同時(shí),我們也發(fā)現(xiàn)了在外部類作用范圍之外得到內(nèi)部類對(duì)象的第一個(gè)方法,那就是利用其外部類的方法創(chuàng)建并返回。上例中的cont()和dest()方法就是這么做的。那么還有沒有別的方法呢?當(dāng)然有,其語法格式如下:

outerObject=new outerClass(ConstrUCtor Parameters);

outerClass.innerClass inNerobject=outerObject.new InnerClass(Constructor Parameters);
  注重在創(chuàng)建非靜態(tài)內(nèi)部類對(duì)象時(shí),一定要先創(chuàng)建起相應(yīng)的外部類對(duì)象。至于原因,也就引出了我們下一個(gè)話題——非靜態(tài)內(nèi)部類對(duì)象有著指向其外部類對(duì)象的引用,對(duì)剛才的例子稍作修改:

public class Goods {

 private valueRate=2;

 private class Content implements Contents {
  private int i = 11*valueRate;
  public int value() {
   return i;
  }
 }

 protected class GDestination implements Destination {
  private String label;
  private GDestination(String whereTo) {
   label = whereTo;
  }
  public String readLabel() {
   return label;
  }
 }

 public Destination dest(String s) {
  return new GDestination(s);
 }
 public Contents cont() {
  return new Content();
 }
}
  修改的部分用藍(lán)色顯示了。在這里我們給Goods類增加了一個(gè)private成員變量valueRate,意義是貨物的價(jià)值系數(shù),在內(nèi)部類Content的方法value()計(jì)算價(jià)值時(shí)把它乘上。我們發(fā)現(xiàn),value()可以訪問valueRate,這也是內(nèi)部類的第二個(gè)好處——一個(gè)內(nèi)部類對(duì)象可以訪問創(chuàng)建它的外部類對(duì)象的內(nèi)容,甚至包括私有變量!這是一個(gè)非常有用的特性,為我們?cè)谠O(shè)計(jì)時(shí)提供了更多的思路和捷徑。要想實(shí)現(xiàn)這個(gè)功能,內(nèi)部類對(duì)象就必須有指向外部類對(duì)象的引用。Java編譯器在創(chuàng)建內(nèi)部類對(duì)象時(shí),隱式的把其外部類對(duì)象的引用也傳了進(jìn)去并一直保存著。這樣就使得內(nèi)部類對(duì)象始終可以訪問其外部類對(duì)象,同時(shí)這也是為什么在外部類作用范圍之外向要?jiǎng)?chuàng)建內(nèi)部類對(duì)象必須先創(chuàng)建其外部類對(duì)象的原因。

  有人會(huì)問,假如內(nèi)部類里的一個(gè)成員變量與外部類的一個(gè)成員變量同名,也即外部類的同名成員變量被屏蔽了,怎么辦?沒事,Java里用如下格式表達(dá)外部類的引用:



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 荥经县| 库尔勒市| 修水县| 柘荣县| 威宁| 定边县| 广元市| 铅山县| 武宁县| 农安县| 永福县| 云林县| 张家界市| 莆田市| 灵川县| 漯河市| 乃东县| 称多县| 张北县| 军事| 股票| 分宜县| 昌宁县| 滨州市| 台前县| 高邑县| 深圳市| 承德市| 吴江市| 洞头县| 自治县| 河西区| 保定市| 阜阳市| 陆川县| 宜丰县| 锦州市| 广宁县| 武义县| 隆安县| 佛教|