六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

淺析Java語言中的內部類

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

  第一次見面

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

  在這個例子里類Content和GDestination被定義在了類Goods內部,并且分別有著protected和private修飾符來控制訪問級別。Content代表著Goods的內容,而GDestination代表著Goods的目的地。它們分別實現了兩個接口Content和Destination。在后面的main方法里,直接用 Contents c和Destination d進行操作,你甚至連這兩個內部類的名字都沒有看見!這樣,內部類的第一個好處就體現出來了——隱藏你不想讓別人知道的操作,也即封裝性。

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

  outerObject=new outerClass(Constructor Parameters);

  outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);

  注意在創(chuàng)建非靜態(tài)內部類對象時,一定要先創(chuàng)建起相應的外部類對象。至于原因,也就引出了我們下一個話題——非靜態(tài)內部類對象有著指向其外部類對象的引用,對剛才的例子稍作修改:

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

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

  有人會問,如果內部類里的一個成員變量與外部類的一個成員變量同名,也即外部類的同名成員變量被屏蔽了,怎么辦?沒事,Java里用如下格式表達外部類的引用:

  outerClass.this

  有了它,我們就不怕這種屏蔽的情況了。



主站蜘蛛池模板: 午夜视频在线观看网站 | 在线亚洲精品国产波多野结衣 | 伊人久久大香线蕉资源 | 特黄毛片| 色涩在线 | 天天爱天天色 | 一级做a爰片久久毛片图片 一级做a爰片久久毛片人呢 | 欧洲精品视频在线观看 | 伊人久久大香线蕉综合7 | 青青青国产在线手机免费观看 | 日本精品久久久久护士 | 亚洲国产精品线播放 | 香蕉视频一区 | 四虎影院久久久 | 亚洲永久免费视频 | 亚洲精品中文字幕乱码三区一二 | 天天色天天干天天 | 日韩成人在线观看视频 | 中国国产一国产一级毛片视频 | 婷婷丁香色 | 青娱乐在线视频免费观看 | 欧美性野久久久久久久久 | 日韩精品一区二区三区中文字幕 | 欧美综合一区二区三区 | 青青草华人在线 | 婷婷伊人五月 | 欧美一级视频免费看 | 呦呦国产 | 亚洲精品成人网 | 在线视频一二三区 | 日操夜操天天操 | 日本免费爱爱视频 | 小xav导航福利网址 香蕉中文在线 | 青青青在线视频人视频在线 | 天美传媒麻豆自制剧 | 欧美一级啪啪 | 午夜免费观看_视频在线观看 | 啪啪免费视频网站 | 日本免费网址 | 任我鲁这里有精品视频在线播 | 新版bt天堂资源在线 |