亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

全面解讀Java編程中的內部類

2019-11-26 14:57:57
字體:
來源:轉載
供稿:網友

Java內部類及其實例化
在 Java 中,允許在一個類(或方法、語句塊)的內部定義另一個類,稱為內部類(Inner Class),有時也稱為嵌套類(Nested Class)。

內部類和外層封裝它的類之間存在邏輯上的所屬關系,一般只用在定義它的類或語句塊之內,實現一些沒有通用意義的功能邏輯,在外部引用它時必須給出完整的名稱。

使用內部類的主要原因有:
內部類可以訪問外部類中的數據,包括私有的數據。
內部類可以對同一個包中的其他類隱藏起來。
當想要定義一個回調函數且不想編寫大量代碼時,使用匿名(anonymous)內部類比較便捷。
減少類的命名沖突。

請看下面的例子:

public class Outer {  private int size;  public class Inner {    private int counter = 10;    public void doStuff() {      size++;    }  }  public static void main(String args[]) {    Outer outer = new Outer();    Inner inner = outer.new Inner();    inner.doStuff();    System.out.println(outer.size);    System.out.println(inner.counter);    // 編譯錯誤,外部類不能訪問內部類的變量    System.out.println(counter);  }}

這段代碼定義了一個外部類 Outer,它包含了一個內部類 Inner。將錯誤語句注釋掉,編譯,會生成兩個 .class 文件:Outer.class 和 Outer$Inner.class。也就是說,內部類會被編譯成獨立的字節碼文件。

內部類是一種編譯器現象,與虛擬機無關。編譯器將會把內部類翻譯成用 $ 符號分隔外部類名與內部類名的常規類文件,而虛擬機則對此一無所知。

注意:必須先有外部類的對象才能生成內部類的對象,因為內部類需要訪問外部類中的成員變量,成員變量必須實例化才有意義。

內部類是 Java 1.1 的新增特性,有些程序員認為這是一個值得稱贊的進步,但是內部類的語法很復雜,嚴重破壞了良好的代碼結構, 違背了Java要比C++更加簡單的設計理念。

內部類看似增加了―些優美有趣,實屬沒必要的特性,這是不是也讓Java開始走上了許多語言飽受折磨的毀滅性道路呢?本教程并不打算就這個問題給予一個肯定的答案。

Java靜態內部類、匿名內部類、成員式內部類和局部內部類
內部類可以是靜態(static)的,可以使用 public、protected 和 private 訪問控制符,而外部類只能使用 public,或者默認。
成員式內部類

在外部類內部直接定義(不在方法內部或代碼塊內部)的類就是成員式內部類,它可以直接使用外部類的所有變量和方法,即使是 private 的。外部類要想訪問內部類的成員變量和方法,則需要通過內部類的對象來獲取。

請看下面的代碼:

public class Outer{  private int size;  public class Inner {    public void dostuff() {      size++;    }  }  public void testTheInner() {    Inner in = new Inner();    in.dostuff();  }}

成員式內部類如同外部類的一個普通成員。

成員式內部類可以使用各種修飾符,包括 public、protected、private、static、final 和 abstract,也可以不寫。

若有 static 修飾符,就為類級,否則為對象級。類級可以通過外部類直接訪問,對象級需要先生成外部的對象后才能訪問。

非靜態內部類中不能聲明任何 static 成員。

內部類可以相互調用,例如:

class A {  // B、C 間可以互相調用  class B {}  class C {}}


成員式內部類的訪問

內部類的對象以成員變量的方式記錄其所依賴的外層類對象的引用,因而可以找到該外層類對象并訪問其成員。該成員變量是系統自動為非 static 的內部類添加的,名稱約定為“outClassName.this”。

1) 使用內部類中定義的非靜態變量和方法時,要先創建外部類的對象,再由“outObjectName.new”操作符創建內部類的對象,再調用內部類的方法,如下所示:

public class Demo{  public static void main(String[] args) {    Outer outer = new Outer();    Outer.Inner inner = outer.new Inner();    inner.dostuff();  }}class Outer{  private int size;  class Inner{    public void dostuff() {      size++;    }  }}

2) static 內部類相當于其外部類的 static 成員,它的對象與外部類對象間不存在依賴關系,因此可直接創建。示例如下:

public class Demo{  public static void main(String[] args) {    Outer.Inner inner = new Outer.Inner();    inner.dostuff();  }}class Outer{  private static int size;  static class Inner {    public void dostuff() {      size++;      System.out.println("size=" + size);    }  }}

運行結果:

size=1

3) 由于內部類可以直接訪問其外部類的成分,因此當內部類與其外部類中存在同名屬性或方法時,也將導致命名沖突。所以在多層調用時要指明,如下所示:

public class Outer{  private int size;  public class Inner{    private int size;    public void dostuff(int size){      size++; // 局部變量 size;      this.size; // 內部類的 size      Outer.this.size++; // 外部類的 size    }  }}

局部內部類

局部內部類(Local class)是定義在代碼塊中的類。它們只在定義它們的代碼塊中是可見的。

局部類有幾個重要特性:

  • 僅在定義了它們的代碼塊中是可見的;
  • 可以使用定義它們的代碼塊中的任何局部 final 變量;
  • 局部類不可以是 static 的,里邊也不能定義 static 成員;
  • 局部類不可以用 public、private、protected 修飾,只能使用缺省的;

局部類可以是 abstract 的。

請看下面的代碼:

public class Outer {  public static final int TOTAL_NUMBER = 5;  public int id = 123;  public void func() {    final int age = 15;    String str = "http://www.weixueyuan.net";    class Inner {      public void innerTest() {        System.out.println(TOTAL_NUMBER);        System.out.println(id);        // System.out.println(str);不合法,只能訪問本地方法的final變量        System.out.println(age);      }    }    new Inner().innerTest();  }  public static void main(String[] args) {    Outer outer = new Outer();    outer.func();  }}

運行結果:

512315


匿名內部類

匿名內部類是局部內部類的一種特殊形式,也就是沒有變量名指向這個類的實例,而且具體的類實現會寫在這個內部類里面。

注意:匿名類必須繼承一個父類或實現一個接口。

不使用匿名內部類來實現抽象方法:

abstract class Person {  public abstract void eat();}class Child extends Person {  public void eat() {    System.out.println("eat something");  }}public class Demo {  public static void main(String[] args) {    Person p = new Child();    p.eat();  }}

運行結果:

eat something

可以看到,我們用Child繼承了Person類,然后實現了Child的一個實例,將其向上轉型為Person類的引用。但是,如果此處的Child類只使用一次,那么將其編寫為獨立的一個類豈不是很麻煩?

這個時候就引入了匿名內部類。使用匿名內部類實現:

abstract class Person {  public abstract void eat();}public class Demo {  public static void main(String[] args){        // 繼承 Person 類    new Person() {      public void eat() {        System.out.println("eat something");      }    }.eat();  }}


可以看到,匿名類繼承了 Person 類并在大括號中實現了抽象類的方法。

內部類的語法比較復雜,實際開發中也較少用到,本教程不打算進行深入講解,各位讀者也不應該將內部類作為學習Java的重點。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人aaa| 日韩经典中文字幕在线观看| 伊人一区二区三区久久精品| 日韩成人在线免费观看| 久久九九国产精品怡红院| 亚洲天天在线日亚洲洲精| 亚洲综合视频1区| 91av中文字幕| 久久国产精品久久精品| 日本精品va在线观看| 亚洲一区二区久久久久久| 亚洲欧美国产一本综合首页| 少妇久久久久久| 欧美寡妇偷汉性猛交| 日韩精品亚洲视频| 中文字幕亚洲欧美在线| 中文字幕日韩在线视频| 成人黄色在线观看| 国自在线精品视频| 国产精品7m视频| 激情亚洲一区二区三区四区| 国产亚洲人成网站在线观看| 4k岛国日韩精品**专区| 国产精品久久久久一区二区| 国产精品高精视频免费| 色妞色视频一区二区三区四区| 国产精国产精品| 色综合老司机第九色激情| 91高潮精品免费porn| 欧美乱大交xxxxx另类电影| 欧美性猛交丰臀xxxxx网站| 欧美电影在线观看网站| 91高潮在线观看| 成人av番号网| 亚洲成人亚洲激情| 欧美激情第6页| 国产精品综合久久久| 狠狠综合久久av一区二区小说| 91社影院在线观看| 不卡毛片在线看| 久久九九热免费视频| 国内精品美女av在线播放| 青草青草久热精品视频在线观看| 久久av红桃一区二区小说| 亚洲人成绝费网站色www| 欧美肥臀大乳一区二区免费视频| 国产精品直播网红| 成人网在线观看| 国产aⅴ夜夜欢一区二区三区| 欧美一级片一区| 久久久久在线观看| 欧美一区二区大胆人体摄影专业网站| 久久久久国产精品免费网站| 亚洲视频自拍偷拍| 日韩精品亚洲视频| 亚洲区在线播放| 日韩不卡在线观看| 国产精品美女www爽爽爽视频| 成人在线观看视频网站| 欧美激情图片区| 欧美黄色www| 精品自拍视频在线观看| 黄网站色欧美视频| 国产精品成人aaaaa网站| 成人乱人伦精品视频在线观看| 欧美日韩精品在线| 亚洲黄色www| 亚洲欧美一区二区精品久久久| 色综合老司机第九色激情| 欧美成人午夜激情在线| 欧美人与性动交a欧美精品| 亚洲性夜色噜噜噜7777| 国产在线拍揄自揄视频不卡99| 97国产精品久久| 欧美精品成人在线| 欧美成人精品在线视频| 成人久久久久爱| 日韩美女主播视频| 精品久久久久久中文字幕大豆网| 亚洲精品福利免费在线观看| 国产精品羞羞答答| 亚洲精品xxx| 国产精品一区专区欧美日韩| 成人黄色片网站| 国产乱人伦真实精品视频| 国产精品久久久久av| 一本大道亚洲视频| 精品在线观看国产| 欧美激情精品久久久久久黑人| 亚洲国产小视频在线观看| 日韩在线免费观看视频| 91系列在线观看| 欧美日韩成人精品| 午夜精品在线视频| 精品美女永久免费视频| 国内成人精品视频| 欧美老肥婆性猛交视频| 久久久在线免费观看| 精品久久久香蕉免费精品视频| 国产精品视频一区二区三区四| 色综合男人天堂| 欧美日韩午夜视频在线观看| 亚洲精品福利视频| 在线看日韩欧美| 欧美激情性做爰免费视频| 亚洲国产成人精品一区二区| 亚洲精品福利在线观看| 孩xxxx性bbbb欧美| 黑人巨大精品欧美一区二区| 亚洲最大av网站| 欧美午夜久久久| 久久99视频免费| 国产精品黄页免费高清在线观看| 91av视频在线免费观看| 亚洲最大在线视频| 成人免费在线网址| 国产精品国产自产拍高清av水多| 日本久久91av| 97在线视频免费观看| 欧美日产国产成人免费图片| 91中文字幕在线观看| 日韩精品极品在线观看| 亚洲欧美日韩在线高清直播| 亚洲精品自拍视频| 日韩中文字幕视频在线| 国产精品久久久久久久久久| 草民午夜欧美限制a级福利片| 91超碰中文字幕久久精品| 国产色综合天天综合网| 亚洲黄色片网站| 中文字幕v亚洲ⅴv天堂| 国产日韩中文字幕在线| 日韩av在线最新| 欧美激情在线一区| 在线看片第一页欧美| 欧美日韩午夜剧场| 久久久www成人免费精品张筱雨| 亚洲乱码一区二区| 福利视频一区二区| 亚洲电影在线观看| 欧美老女人性生活| 国产一区私人高清影院| 国产91精品久久久| 成人亚洲欧美一区二区三区| 自拍亚洲一区欧美另类| 欧美电影在线观看完整版| 乱亲女秽乱长久久久| 4k岛国日韩精品**专区| 九九精品在线播放| 91国产高清在线| 中文亚洲视频在线| 欧美日韩国产一区二区三区| 亚洲qvod图片区电影| 在线观看免费高清视频97| 欧美视频在线免费| 欧美国产高跟鞋裸体秀xxxhd| 国产热re99久久6国产精品| 国产精品视频网| 久久久久在线观看| 国内精品中文字幕| 国产精品美女主播在线观看纯欲| 91久久中文字幕| 一区二区三区四区在线观看视频| 亚洲视频电影图片偷拍一区|