java中的内部类
在Java 1.1中,可将一个类界说置入另一个类界说中。这就叫作“内部类”。内部类对我们很是有用,因为操作它可对那些逻辑上彼此接洽的类举办分组,并可节制一个类在另一个类里的“可见性”。然而,我们必需认识到内部类与以前报告的“合成”要领存在着基础的区别。
凡是,对内部类的需要并不是出格明明的,至少不会当即感受到本身需要利用内部类。在本章的末端,先容完内部类的所有语法之后,各人会发明一个出格的例子。通过它应该可以清晰地认识到内部类的长处。
建设内部类的进程是平淡无奇的:将类界说置入一个用于封装它的类内部(若执行这个措施碰着贫苦,请拜见第3章的3.1.2小节“赋值”):
//: Parcel1.java // Creating inner classes package c07.parcel1; public class Parcel1 { class Contents { private int i = 11; public int value() { return i; } } class Destination { private String label; Destination(String whereTo) { label = whereTo; } String readLabel() { return label; } } // Using inner classes looks just like // using any other class, within Parcel1: public void ship(String dest) { Contents c = new Contents(); Destination d = new Destination(dest); } public static void main(String[] args) { Parcel1 p = new Parcel1(); p.ship("Tanzania"); } } ///:~
若在ship()内部利用,内部类的利用看起来和其他任何类都没什么别离。在这里,独一明明的区别就是它的名字嵌套在Parcel1内里。但各人不久就会知道,这其实并非独一的区别。
更典范的一种环境是,一个外部类拥有一个非凡的要领,它会返回指向一个内部类的句柄。就象下面这样:
//: Parcel2.java // Returning a handle to an inner class package c07.parcel2; public class Parcel2 { class Contents { private int i = 11; public int value() { return i; } } class Destination { private String label; Destination(String whereTo) { label = whereTo; } String readLabel() { return label; } } public Destination to(String s) { return new Destination(s); } public Contents cont() { return new Contents(); } public void ship(String dest) { Contents c = cont(); Destination d = to(dest); } public static void main(String[] args) { Parcel2 p = new Parcel2(); p.ship("Tanzania"); Parcel2 q = new Parcel2(); // Defining handles to inner classes: Parcel2.Contents c = q.cont(); Parcel2.Destination d = q.to("Borneo"); } } ///:~
若想在除外部类非static要领内部之外的任那里所生成内部类的一个工具,必需将谁人工具的范例设为“外部类名.内部类名”,就象main()中展示的那样。