内部类的定义:
在java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。根据内部类的位置、修饰符和定义的方式可分为成员内部类、静态内部类、方法内部类。接下来针对这些内部类分别进行说明。
成员内部类:
在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。在成员内部类中可以访问外部类的所有成员。
代码说明 :
class Outer{
private int num=4; //定义类的成员变量
public void test(){
Inner inner =new Inner();
inner.show();
}
//下面的代码定义了一个成员内部类
class Inner{
void show(){
//在成员内部类中的方法访问外部类的成员变量
System.out.println("num="+num);
}
}
}
public class Example {
public static void main(String [] args){
Outer outer=new Outer();
outer.test();
}
}
Outer类是一个外部类,在该类重定义了一个内部类Inner和一个test()方法,其中,Inner类有一个show()的方法,在show()方法中访问外部类的成员变量num,test()方法中创建了内部类Inner的实例对象,并通过该对象调用show()方法,将num值进行打印。从运行的结果可以看出,内部类可以在外部类中别调用,并能访问外部类的成员。
如果想通过外部类去访问内部类,则需要通过外部类对象去创建内部类对象,创建内部类对象的具体语法如下:
Outer.Inner inner=new Outer().new Inner();
如果将内部类的Inner用private修饰的话编译会报错
静态内部类:
可以用static关键字来修饰一个成员内部类,该内部类被称作静态内部类,它可以在不创建外部类对象的情况下被实例化。创建静态内部类对象的具体语法如下:
外部类名 . 内部类名 变量名 =new 外部类名 . 内部类名();
具体代码如下:
class Outer{
private static int num=6;
//下面的代码定义了一个静态内部类
static class Inner{
void show(){
System.out.println("num="+num);
}
}
}
public class Example18 {
public static void main(String[] args) {
Outer.Inner inner=new Outer.Inner();
inner.show();
}
}
内部类Inner使用static关键字来修饰,是一个静态内部类。可以看出静态内部类的实例化方式与非静态的成员内部类的实例化方式是不一样的。静态内部类中只能访问外部类中的静态成员。
方法内部类
方法内部类是指在成员方法中定义的类,他只能在当前的方法中被使用。
具体代码示例如下:
class Outer1{
private int num=4;
public void test(){
//下面是方法中定义的内部类
class Inner{
void show(){
System.out.println("num="+num);
}
}
Inner inner=new Inner();
inner.show();
}
}
public class Example19 {
public static void main(String[] args) {
Outer1 outer1=new Outer1();
outer1.test();
}
}
在Outer类的test()方法中定义了一个内部类Inner。由于Inner是方法内部类。因此程序只能在方法中创建该类的实例化对象并且调用show()方法。从运行结果来看,方法内部类也可以访问在外部类的成员变量num。