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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 全面解讀Java編程中的內部類

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

2020-01-06 14:43goldensun JAVA教程

這篇文章主要介紹了Java的內部類,包括類成員訪問等Java入門學習中的基礎知識,需要的朋友可以參考下

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

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

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

請看下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 的。外部類要想訪問內部類的成員變量和方法,則需要通過內部類的對象來獲取。

請看下面的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
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 成員。

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

?
1
2
3
4
5
class A {
  // B、C 間可以互相調用
  class B {}
  class C {}
}


成員式內部類的訪問

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 成員,它的對象與外部類對象間不存在依賴關系,因此可直接創建。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
    }
  }
}

運行結果:

?
1
size=1

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

?
1
2
3
4
5
6
7
8
9
10
11
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 的。

請看下面的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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();
  }
}

運行結果:

?
1
2
3
5
123
15


匿名內部類

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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();
  }
}

運行結果:

?
1
eat something

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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的重點。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品二区一区二区aⅴ污介绍 | 日韩精品在线视频 | 久久精品一 | 国产高清不卡 | 在线观看91 | 国产免费黄色 | 国产精品美女久久久久高潮 | 亚洲黄页 | 日本精品在线观看 | 久久国产亚洲精品 | 久久99操 | 午夜精品久久久久久久久久久久 | 日韩综合网 | 亚洲免费观看视频 | 久久精品a一级国产免视看成人 | 久久99精品国产麻豆婷婷洗澡 | 欧美精品欧美精品系列 | 一区二区三区免费观看 | 动漫泳衣美女 | 97精品国产 | 高清视频一区二区三区 | 亚洲精品一区二区三区 | 性刺激久久久久久久久九色 | 在线视频一区二区 | 国产精品一区二区三区在线播放 | 午夜精品久久久久久久久久久久 | 精品一区二区三区免费 | 91亚洲精品一区 | 久久九九精品视频 | 亚洲一区久久 | 在线午夜 | 亚洲一区久久 | 黄色影院| 综合久久网 | 羞羞视频在线播放 | 动漫卡通精品一区二区三区介绍 | 美日韩一区| 日本精品视频一区二区 | 毛片一区 | 国产精品高潮呻吟久久av野狼 | 黄在线免费观看 |