5.8.1 内部类
java支持在一个类中声明了一个类,这样的类称为内部类(InnerClass),而包含内部类的类 称为 内部类的外部类(OuterClass).内部类一般用来试下一些没有通用意义的功能逻辑。
定义内部类:只需要将类的定义放在一个用于封装他的外部类 的 类体内部即可。
【例5-23】内部类的定义和使用示例。
Ex5_23_InnerClass.java
package com.ch5;
public class Ex5_23_InnerClass {
public static void main(String[] args) {
Parcel p = new Parcel(); // 这个构造方法是系认提供的默认无参构造方法
Parcel.Contents c = p.new Contents(33);// 创建内部类
Parcel.Destination d = p.new Destination("山西大同"); // D行
// Destination d = p.new Destination("山西大同"); // A行
p.setValue(c, d);
p.ship();
p.testShip();
}
}
class Parcel{
private Contents c;
private Destination d;
private int contentsCount = 0;
class Contents{ // 内部类
private int i;
Contents(int i){
this.i = i;
contentsCount++; // C行
}
int value(){
return i;
}
}
class Destination { // 内部类
private String lable;
Destination(String whereTo){
lable = whereTo;
}
String readLabel(){
return lable;
}
}
void setValue(Contents c,Destination d){
this.c = c;
this.d = d;
}
void ship(){
System.out.println("运输" + c.value() + "到" + d.lable);// B行
}
public void testShip(){
c = new Contents(22);
d = new Destination("山西太原");
ship();
}
}
运行结果:
程序编译后生成4个文件:
Ex5_23_InnerClass.class,
Parcel.class,
Parcel $ Contents.class
Parcel $ Destination.class .
例5-23中,可以看出内部类Destination和Contents的定义包含在外部类 Parcel中,内部类的声明 与 声明成员变量或成员方法一样。 注意内部类的声明和创建 均需要使用 外部类 . 内部类 的形式。如 D行中的Parcel.Destination , p.new Destination(“山西大同”) .
内部类与类中的成员变量 和 成员方法一样,均为外部类的成员,其使用有如下特点:
- 外部类使用内部类成员。 外部类使用内部类 同 (外部类使用)其他成员变量和成员方法 没有区别。 例如5-23中的B行,在Parcel 类的ship方法中可以世界使用Destination和Contents类的成员方法和成员变量。
- 内部类使用外部类的成员。 一个类把 内部类看成是自己的成员,外部类的成员变量在内部类中仍然有效,内部类可以直接使用外部类的成员变量和 方法(这些变量和方法可以是private修饰的),这是内部类的一个好处,如李5-23的C行。 如果内部类和外部类有 同名 的成员变量,可以使用“外部类名 . this “来访问外部类中同名的成员变量。
- 非外部类使用内部类。 非外部类的其他类 使用内部类,如Ex5_23_InnerClass 类 使用Destination 和 Contents类,在类名和new 运算符前分别冠以外部类的名字 及外部对象名,如D行。如果直接使用的话,如A行,会出错。