標籤:類方法 app utc auto hide over inner tin enc
定義:
可以將一個類的定義放在另一個類的內部 這就是內部類。--摘自java編程思想
一般實現方式:
public class SimpleInnerClass { class Content { private int i; public int getVlaue() { return i; } } class Description { private String lable; Description(String lab) { this.lable = lab; } public String readLable() { return lable; } } public void ship(String lable) { Content content=new Content(); Description description=new Description(lable); System.out.println(description.readLable()); } public static void main(String[] args) { Parcle2 parcle2 = new Parcle2(); parcle2.ship("hi"); }}View Code
上面的案例是最普通不過的內部類表達的例子,通過建立內部類對象的引用訪問內部類方法
但一般有更通用的做法,通常是在外圍類建立一個方法關聯內部類的引用;通過這種方式來建立彼此之間的聯絡。以代碼為例:
public class InnerClass { class Content { private int i; public int getVlaue() { return i; } } class Description { private String lable; Description(String lab) { this.lable = lab; } public String readLable() { return lable; } } public Content getContentInstance() { return new Content(); } public Description getDescriptionIntance(String lable) { return new Description(lable); } public void ship(String lable) { Content content = getContentInstance(); Description description = getDescriptionIntance(lable); System.out.println(description.readLable()); System.out.println(description.readLable()); } public static void main(String[] args) { InnerClass parcle2 = new InnerClass(); parcle2.ship("hi"); InnerClass.Content c = parcle2.getContentInstance();// 如果想在外部類的非靜態方法之外的任意位置訪問某個內部類的對象,那麼必須通過OutClass.xx InnerClass.Description d = parcle2.getDescriptionIntance("hello"); }}View Code
有了聯絡之後內部類就可以訪問外圍類的所有元素,無論是private類型也可以。
以下代碼即是佐證:
public interface Selector { boolean end(); Object current(); void next();}public class Sequence { private Object[] items; private int next = 0; public Sequence(int size) { items = new Object[size]; } public void add(Object object) { if (next < items.length) { items[next++] = object; } } class SequenceSelector implements Selector { private int i = 0; @Override public boolean end() { // TODO Auto-generated method stub return i == items.length; } @Override public Object current() { // TODO Auto-generated method stub return items[i]; } @Override public void next() { if (i < items.length) { i++; } } } /** * 內部類對象只有與外圍類對象相關聯時才能被建立<p> * 構建內部類對象時,需要指向一個其外圍類對象的引用;如果編譯器訪問不到這個引用就會報錯 * @return */ public Selector selector() { return new SequenceSelector(); } public static void main(String[] args) { Sequence sequence = new Sequence(5); for (int i = 0; i < 5; i++) { sequence.add(i); }// Sequence.SequenceSelector c=sequence.selector(); Selector selector = sequence.selector(); while (!selector.end()) { System.out.println(selector.current()); selector.next(); } }}View Code
在此,比較初始化的內部類細節介紹完畢,下一章筆者在繼續介紹更深一層次的內部類細節
初探JAVA內部類細節一