内部类(InnerClass),也称嵌套类,是JDK 1.1区别于1.0版本的一个非常重要的新特性。内部类就是在某个类的内部嵌套定义的一个类。内部类可以是其他类的成员,也可以在一个语句块的内部定义,还可以在—个表达式内部匿名定义。
内部类有下面这些特性。
· 类名只能在定义的范围内被使用,内部类的名称必须区别于外部类。
· 内部类可以定义为abstract。
· 内部类可以声明为private或protected。
· 内部类可以使用包含它的类的成员变量,包括静态和实例成员变量,也可以使用内部类所在方法的局部变量。
· 内部类不能与包含它的类名相同。
· 内部类如果被声明为static,就变成顶层类,这样就不能再使用局部变量;内部类是顶层类时,才可以声明static成员。
· 内部类可以像外部类那样被继承,同样也可以实例化。
【例7-5】一个内部类的例子。
public class mainClass
{
public static void main(String []args)
{
mainClass obj=new mianClass();
obj.printMethod();
}
void printMethod()
{
innerClass innObj=new innerClass();
innObj.outFun();
}
class innerClass
{
public void outFun()
{
System.out.println("This is a inner class testing!");
}
}
}
在本例中,内部类innerClass是作为类mainClass的成员,程序结构非常简单,就是通过内部类输出一个字符串。
内部类作为一种特殊的类,它也有类的一般特性,如类的封装、实现和继承。下面介绍关于内部类的实例化和内部类的继承。
【例7-6】内部类的实例化例子。
class Outerclass
{
private static int number=100;
class innerclass
{
private int number=50;
public void print()
{
System.out.println("下面的index是内部类的:");
System.out.println(this.number); // 访问内部类的成员
System.out.println("下面的index是外部类的:");
System.out.println(Outerclass.this.number);// 访问外部类的成员
}
}
class Test
{
public static void main(String []args)
{
Outerclass oc=new Outerclass();
Outerclass.innerclass oi=oc.new innerclass();
}
}
本例中定义了一个外部类Outerclass,在这个类中有一个内部类innerclass,在类Test中将内部类进行了实例化。
【例7-7】可以在外部类中对内部类进行实例化,本例是对例7-6的一点改动。
class Outerclass
{
private static int number=100;
static class innerclass
{
private int number=50;
public void print()
{
System.out.println("下面的index是内部类的:");
System.out.println(this.number);
System.out.println("下面的index是外部类的:");
System.out.println(Outerclass.number); //访问外部类的静态成员,
//非静态成员不可访问。
}
}
public static innerclass Getinnerclass()
{
return new innerclass()
{
public void print()
{
System.out.println("这个内部类实例是一个匿名类!!");
}
};
}
}
class Test
{
public static void main(String []args)
{
Outerclass oc=new Outerclass();
Outerclass.innerclass oi=oc.Getinnerclass();
}
}
上述两个内部类的实例化的最大区别是:第二个内部类是静态的,而第一个不是。静态内部类和非静态的内部类有以下两点区别。
(1)静态内部类只能访问外部类的静态成员。
(2)只有在静态内部类中,才能声明静态成员。
内部类除了可以声明为static类型的之外,还可以声明为final和abstract类型的。
【例7-8】内部类继承的例子。
class Outer
{
class inner
{
inner()
{
System.out.println("内部类被派生了!");
}
}
}
class innerclasschild extends Outer.inner
{
innerclasschild(Outer Outer)
{
Outer.super();
}
}
class Test
{
public static void main(String []args)
{
Outer o=new Outer();
innerclasschild ic=new innerclasschild(o);
}
}
在本例中,innerclasschild类由Outer的内部类innerclass派生,因此在innerclasshcild类的构造函数中就要接收一个Outer类型的参数,以通过该参数访问Outer的内部类。