1、定义
将一个类的定义放在另一个类的内部,这就是内部类。
2、内部类与外部类的链接
内部类可以访问其外部类的素有成员。
当某个外部类创建内部类时,内部类就会捕获一个指向外部类对象的相关引用,就是用该引用来访问外部类的成员。
注意:当内部类是static时无法访问外部类的非static域,内部类只用得到外部类的引用时才能访问外部类成员,然而对于静态的内部类,外部类甚至都没有创建自身的对象,所以也就不能访问。这可以解释在其他类创建内部类对象的方式。
3、.this与.new
在内部类使用OutClassName.this可以生成对外部类对象的引用。
创建非静态内部类之前需要先创建外部类的对象
Outer o = new Outer();
Outer.Inner in = o.new Inner();
创建静态内部类(嵌套类)时不需要外部类的对象
Outer.Inner in = new Outer.Inner();
非静态内部类不能有static数据和static字段
class Outer{
private int a=1;
class Inner{
public void g() {
int c = Outer.this.a;
Outer o = Outer.this;//对外部类对象的引用
o.a=2;
}
public void f() {
System.out.println("Inner.f() a="+a);
}
}
public void f() {
System.out.println("Outer.f() a="+a);
}
}
public class InnerTest {
public static void main(String[] args) {
//非静态的内部类必须要与外部类建立起关联(捕获外部类对象的引用),所以先要有外部类的对象
//才能创建内部类
Outer o = new Outer();
Outer.Inner a = o.new Inner();
o.f();
a.f();
a.g();
o.f();
a.f();
}
}
//output:
//Outer.f() a=1
//Inner.f() a=1
//Outer.f() a=2
//Inner.f() a=2
4、匿名内部类
匿名内部类语法的实质是:创建一个继承自基类的匿名类的对象,通过new表达式返回的引用被自动转型为对基类的引用。例如:
class Outer{
private int a=1;
class Inner{
public void f() {
System.out.println("Inner.f() a="+a);
}
}
public Inner g() {
return new Inner(){
public void f() {
System.out.println("nf()");
}
};
}
}
public class InnerTest {
public static void main(String[] args) {
Outer o = new Outer();
Outer.Inner a = o.g();
a.f();
}
}
//output:
//nf()