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()中展示的那样。