Java语言中允许在一个类(或方法、代码块)的内部定义另一个类,后者称为“内部类”(InnerClasses),也称为“嵌套类”(Nested Classes),封装它的类称为“外部类”。
内部类与外部类之间存在逻辑上的隶属关系,内部类一般只用在封装它的外部类或代码块中使用。
内部类的作用如下:
01. 封装。将不想公开的实现细节封装到一个内部类中,内部类可以声明为私有的,只能在所在外
部类中访问。
02. 提供命名空间。静态内部类和外部类能够提供有别于包的命名空间。
03. 便于访问外部类成员。内部类能够很方便访问所在外部类的成员,包括私有成员也能访问。
内部类的分类
内部类的分类如图所示,按照内部类在定义的时候是否给它一个类名,可以分为:有名内部类和匿名内部类。有名内部类又按照作用域不同可以分为:局部内部类和成员内部类,成员内部类又分为:实例内部类和静态内部类。
成员内部类
成员内部类类似于外部类的成员变量,在外边类的内部,且方法体和代码块之外定义的内部类。
实例内部类
实例内部类与实例变量类似,可以声明为公有级别、私有级别、默认级别或保护级别,即4种访问级别都可以,而外部类只能声明为公有或默认级别。
实例内部类示例代码如下:
//Outer.java文件
package com.a51work6;
//外部类
public class Outer {
// 外部类成员变量
private int x = 10;
// 外部类方法
private void print() {
System.out.println("调用外部方法...");
}
// 测试调用内部类
public void test() {
Inner inner = new Inner();
inner.display();
}
// 内部类
class Inner { ①
// 内部类成员变量
private int x = 5; ②
// 内部类方法
void display() { ③
// 访问外部类的成员变量x
System.out.println("外部类成员变量 x = " + Outer.this.x); ④
// 访问内部类的成员变量x
System.out.println("内部类成员变量 x = " + this.x); ⑤
System.out.println("内部类成员变量 x = " + x); ⑥
// 调用外部类的成员方法
Outer.this.print(); ⑦
print(); ⑧
}
}
}
上述代码第①行声明了内部类Inner,它的访问级别是默认,这里还可以是public、private和protected。
内部类Inner有一个成员变量x和成员方法display()。
在display()方法中代码第④行是访问外部类的x成员变量,代码第⑤行和第⑥行一样都是访问内部类的x成员变量。
代码第⑦行和第⑧行都是访问外部类的print()成员方法。