在 Java 中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。
根据内部类的位置、修饰符和定义的方式可分为成员内部类、静态内部类、方法内部类。
成员内部类
在一个类中,除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。在成员内部类中可以访问外部类的所有成员。
Example.java 示例代码:
class Outer{
private int num = 4; //定义类的成员变量
//成员内部类
class Inner{
void show(){
//在成员内部类的方法中访问外部类的成员变量
System.out.println("num=" + num);
}
}
//成员方法,该方法中访问内部类
public void test(){
Inner inner = new Inner();
inner.show();
}
}
public class Example{
public static void main(String[] args){
Outer outer = new Outer(); //创建外部类对象
outer.test(); //调用 test() 方法
}
}
此代码,说明内部类可以在外部类中被使用,并能访问外部类的成员。
如果想通过外部类去访问内部类,则需要通过外部类对象去创建内部类对象,创建内部类对象的具体语法格式如下:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
Example.java 示例代码:
public class Example{
public static void main(String[] args){
Outer.Inner inner = new Outer().new Inner(); //创建内部类对象
inner.show(); //调用 test() 方法
}
}
注意: 如果内部类被声明为私有,外界将无法访问。
静态内部类
使用 static 关键字修饰一个成员内部类,该内部类被称作静态内部类,它可以在不创建外部类对象的情况下被实例化。
创建静态内部类对象的具体语法格式如下:
外部类名.内部类名 变量名 = new 外部类名.内部类名();
Example.java 示例代码:
class Outer{
private static int num = 6;
//静态内部类
static class Inner{
void show(){
System.out.println("num=" + num);
}
}
}
class Example{
public static void main(String[] args){
Outer.Inner inner = new Outer.Inner(); //创建内部类对象
inner.show(); //调用内部类的方法
}
}
注意:
1、在静态内部类中,只能访问外部类的静态成员。
2、在静态内部类中可以定义静态的成员,而在非静态的内部类中不允许定义静态的成员。例如下面的代码,编译会报错
class Outer{
class Inner{
static int num = 10; //不能定义静态成员,编译报错
void show(){
System.out.println("num=" + num);
}
}
}
方法内部类
方法内部类是指在成员方法中定义的类,它只能在当前方法中被使用。
Example.java 示例代码:
class Outer{
private int num = 4; //定义成员变量
public void test(){
//内部类
class Inner{
void show(){
System.out.println("num=" + num); //访问外部类的成员变量
}
}
Inner in = new Inner(); //创建内部类对象
in.show(); //调用内部类的方法
}
}
public class Example{
public static void main(String[] args){
Ourter outer = new Outer(); //创建外部类对象
outer.test(); //调用 test() 方法
}
}
在此代码中,由于 Inner 是方法内部类,因此程序只能在方法中创建该类的实例对象并调用 show() 方法。