Java 內(nèi)部類(lèi)類(lèi)型

2018-01-18 18:10 更新

Java面向?qū)ο笤O(shè)計(jì) - Java內(nèi)部類(lèi)類(lèi)型


您可以在類(lèi)中的任何位置定義內(nèi)部類(lèi),您可以在其中編寫(xiě)Java語(yǔ)句。

有三種類(lèi)型的內(nèi)部類(lèi)。內(nèi)部類(lèi)的類(lèi)型取決于位置和聲明的方式。

  • 成員內(nèi)部類(lèi)
  • 局部?jī)?nèi)部類(lèi)
  • 匿名內(nèi)部類(lèi)

成員內(nèi)部類(lèi)

成員內(nèi)部類(lèi)在類(lèi)中聲明的方式與聲明成員字段或成員方法相同。

它可以聲明為public,private,protected或package-level。

成員內(nèi)部類(lèi)的實(shí)例可以僅存在于其封閉類(lèi)的實(shí)例內(nèi)。

以下代碼創(chuàng)建了一個(gè)成員內(nèi)部類(lèi)。

class Car {
  private int year;

  // A member inner class named Tire public
  class Tire {
    private double radius;
    public Tire(double radius) {
      this.radius = radius;
    }
    public double getRadius() {
      return radius;
    }
  } // Member inner class declaration ends here

  // A constructor for the Car class
  public Car(int year) {
    this.year = year;
  }
  public int getYear() {
    return year;
  }
}

局部?jī)?nèi)部類(lèi)

一個(gè)局部?jī)?nèi)部類(lèi)在塊中聲明。其范圍僅限于聲明它的塊。

由于其范圍限于其封閉塊,因此其聲明不能使用任何訪問(wèn)修飾符,例如public,private或protected。

通常,在方法內(nèi)定義局部?jī)?nèi)部類(lèi)。但是,它也可以在靜態(tài)初始化器,非靜態(tài)初始化器和構(gòu)造器中定義。

下面的代碼顯示了一個(gè)局部?jī)?nèi)部類(lèi)的例子。

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  public static void main(String[] args) {
    StringList tl = new StringList();
    tl.addTitle("A");
    tl.addTitle("B");

    Iterator iterator = tl.titleIterator();
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
  }
}
class StringList {
  private ArrayList<String> titleList = new ArrayList<>();

  public void addTitle(String title) {
    titleList.add(title);
  }

  public void removeTitle(String title) {
    titleList.remove(title);
  }

  public Iterator<String> titleIterator() {
    // A local inner class - TitleIterator
    class TitleIterator implements Iterator<String> {
      int count = 0;
      @Override
      public boolean hasNext() {
        return (count < titleList.size());
      }

      @Override
      public String next() {
        return titleList.get(count++);
      }
    }

    TitleIterator titleIterator = new TitleIterator();
    return titleIterator;
  }
}

上面的代碼生成以下結(jié)果。

例子

下面的代碼有一個(gè)局部?jī)?nèi)部類(lèi)繼承自另一個(gè)公共類(lèi)。

import java.util.Random;

abstract class IntGenerator {
  public abstract int getValue() ;
}
class LocalGen {
  public IntGenerator getRandomInteger() {
    class RandomIntegerLocal extends IntGenerator {
      @Override
      public int getValue() {
        Random rand = new Random();
        long n1 = rand.nextInt();
        long n2 = rand.nextInt();
        int value = (int) ((n1 + n2) / 2);
        return value;
      }
    }

    return new RandomIntegerLocal();
  } // End of getRandomInteger() method
}

public class Main {
  public static void main(String[] args) {
    LocalGen local = new LocalGen();
    IntGenerator rLocal = local.getRandomInteger();
    System.out.println(rLocal.getValue());
    System.out.println(rLocal.getValue());
  }
}

上面的代碼生成以下結(jié)果。

匿名內(nèi)部類(lèi)

匿名內(nèi)部類(lèi)沒(méi)有名稱(chēng)。因?yàn)樗鼪](méi)有名稱(chēng),它不能有一個(gè)構(gòu)造函數(shù)。

匿名類(lèi)是一次性類(lèi)。您定義一個(gè)匿名類(lèi)并同時(shí)創(chuàng)建它的對(duì)象。

創(chuàng)建匿名類(lèi)及其對(duì)象的一般語(yǔ)法如下:

new Interface()  {
// Anonymous  class body  goes  here
}

new Superclass(<argument-list-for-a-superclass-constructor>)  {
// Anonymous  class body  goes  here
}

new運(yùn)算符用于創(chuàng)建匿名類(lèi)的實(shí)例。

它后面是現(xiàn)有的接口名稱(chēng)或現(xiàn)有的類(lèi)名稱(chēng)。

接口名稱(chēng)或類(lèi)名稱(chēng)不是新創(chuàng)建的匿名類(lèi)的名稱(chēng)。

如果使用接口名稱(chēng),則匿名類(lèi)實(shí)現(xiàn)接口。

如果使用類(lèi)名,則匿名類(lèi)繼承自類(lèi)。

僅當(dāng)新運(yùn)算符后面跟有類(lèi)名時(shí),才使用<argument-list>。如果新運(yùn)算符后跟接口名稱(chēng),則它為空。

如果<argument-list>存在,它包含要調(diào)用的現(xiàn)有類(lèi)的構(gòu)造函數(shù)的實(shí)際參數(shù)列表。

匿名類(lèi)主體像往常一樣在大括號(hào)中。

匿名類(lèi)主體應(yīng)該簡(jiǎn)短,以便更好的可讀性。

下面的代碼包含一個(gè)簡(jiǎn)單的匿名類(lèi),它在標(biāo)準(zhǔn)輸出上打印一條消息。

public class Main {
  public static void main(String[] args) {
    new Object() {
      // An instance initializer
      {
        System.out.println("Hello from  an  anonymous class.");
      }
    }; // A semi-colon is necessary to end the statement
  }
}

上面的代碼生成以下結(jié)果。

例2

以下代碼使用匿名類(lèi)來(lái)創(chuàng)建Iterator。

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  private ArrayList<String> titleList = new ArrayList<>();

  public void addTitle(String title) {
    titleList.add(title);
  }

  public void removeTitle(String title) {
    titleList.remove(title);
  }

  public Iterator<String> titleIterator() {
    // An anonymous class
    Iterator<String> iterator = new Iterator<String>() {
      int count = 0;

      @Override
      public boolean hasNext() {
        return (count < titleList.size());
      }

      @Override
      public String next() {
        return titleList.get(count++);
      }
    }; // Anonymous inner class ends here

    return iterator;
  }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)