W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
您可以在類(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)在類(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; } }
一個(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)沒(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é)果。
以下代碼使用匿名類(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; } }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: