来自: http://www.blogjava.net/lincode/archive/2008/08/13/221594.html
一 概念:
Java将嵌套类分成两个主要的分类:静态嵌套类(static nested classes)和内部类(inner classes)。
1 嵌套类(nested classes),在一个类内部定义的另一个类,称为嵌套类。
嵌套类分为两种, static 修饰的 静态嵌套类, 和无 static 修饰的 非静态嵌套类,也叫作 内部类。
2 内部类(inner classes), 无 static 修饰的 非静态嵌套类。
Java还进一步将内部类分为:
实例内部类(instance inner class) ,假设在声明嵌套类时,没有在前面加上static关键字。这样得到的是个实例内部类。静态嵌套类只能够访问外部类的static成员,而实例内部类能够同时访问static和实例成员。
本地内部类(local inner class),Java允许在任意的代码段中放入一个类,该类的代码放在一对大括号中{ }。这意味着类能够出现在一个方法中,甚至是在if语句的一对括号中。这样的类就称为本地内部类。相对于实例内部类来说,本地内部类和有一个好处。他除了能够访问外部类的实例和类字段外(称为实例和类方法),还能够访问本地变量和方法的参数。
匿名内部类(and anonymous inner class),没有给出类名的内部类为匿名内部类。
二 使用:
1. 访问内部类:
我们可以在嵌套类(包括静态的和非静态的 )前加上 private,protected 或 public 关键字,以指示该类在外部类以外的访问级别。
具体访问方法如下:
(1).内部类,要以如下形式访问, outclass 是 OutClass 的一个实例,它放在 new 前指示内部类的实例是属于一个特定的外部类的实例的。 这是因为,只有外部类的实例存在,他的实例内部类( 也就是非静态内部类)才能存在。
//
innerclass
OutClass outclass
=
new
OutClass();
OutClass.InnerClass innerclass
=
outclass.
new
InnerClass();
innerclass.normalMethod();
(2).静态嵌套类, 可以用 OutClass.StaticInnerClass 来指示。
静态嵌套类,可以有实例成员(实例方法 和 实例变量)
访问静态嵌套类的实例域,需要先实例化静态嵌套类。
这个类是静态的,它不依赖于它外部类的某个实例,所以无须先实例化外部类。这和内部类是不一样的。
OutClass.StaticInnerClass staticinnerclass = new
OutClass.StaticInnerClass();
staticinnerclass.normalMethod();
(3).静态嵌套类的静态方法,可以用 OutClass.StaticInnerClass.staticMethod() 来访问。
实例代码:
//
OutClass.java
public
class
OutClass {
//
non static inner classes
class
InnerClass{
public
void
normalMethod(){
System.out.println(
"
success: non-static innerclass
"
);
}
}
//
static inner classes
static
class
StaticInnerClass
{
//
non static method of static inner classes
public
void
normalMethod()
{
System.out.println(
"
success: non static method of static innerclas
"
);
}
//
static methode of static inner classes
static
public
void
staticMethod()
{
System.out.println(
"
success: static method of static innerclass
"
);
}
}
}
//
end of InnerClass
//
Test.java
public
class
Test {
public
static
void
main(String[] args){
OutClass outclass
=
new
OutClass();
//
innerclass
OutClass.InnerClass innerclass
=
outclass.
new
InnerClass();
innerclass.normalMethod();
//
non static method of static innerclas
OutClass.StaticInnerClass staticinnerclass
=
new
OutClass.StaticInnerClass();
staticinnerclass.normalMethod();
//
static method of static innerclass
OutClass.StaticInnerClass.staticMethod();
}
}
//
end of Test
2. 嵌套类 访问 外部类的成员:
(1). 外部类对于内部类(非静态嵌套类)是透明的。包括外部类的private成员,其内部类都可以自由访问。
(2). 一个静态嵌套类只能访问外部类的静态方法,它是不能访问任何外部类的实例成员(包括变量和方法)。
(3). 内部类中的 this 是指内部类本身。内部类的成员和外部类的成员名冲突,内部类内,冲突的成员名是指内部类成员。
要调用外部类的冲突的成员,要以 外部类的类名 指示:对于冲突的变量 OutClass.conflitName 对于冲突的方法 OutClass.conflitName()。