1、成员内部类
在一个类中使用内部类,可以在内部类中直接存取其所在类的私有成员变量。
成员内部类的语法:
public class OuterClass{//外部类
private class InnerClass{//内部类
//……
}
}
在内部类中可以随意使用外部类的成员方法及成员变量,尽管这些类成员被修饰为private。
内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。内部类初始化方式与其他类初始化方式相同,都是用new关键字。
package javademo;
public class OuterClass {
innerClass in = new innerClass();//在外部类实例化内部类对象的引用
public void outf(){
in.inf();//在外部类方法中调用内部类方法·
}
class innerClass{
innerClass(){//内部类构造方法
}
public void inf(){//内部类成员方法
}
int y = 0;//定义内部类成员变量
}
public innerClass doit(){//外部类方法,返回值为内部类引用
//y = 4;//外部类不可以直接访问内部类成员变量
in.y = 4;
return new innerClass();//返回内部类引用
}
public static void main(String[] args) {
// TODO Auto-generated method stub
OuterClass out = new OuterClass();
OuterClass.innerClass in = out.doit();//内部类的对象实例化操作必须在外部类或外部类的非静态方法中实现
OuterClass.innerClass in2 = out.new innerClass();
}
}
2、实例内部类
实例内部类是成员内部类的一种,没有static修饰,实例内部类具有以下特点:
a、在创建实例内部类的实例时,外部类的实例必须已经存在。
b、实例内部类的实例自动持有外部类的实例引用,这个引用形式是:外部类名字.this。在内部类中,可以直接访问外部类的所有成员,包括成员变量和成员方法。
c、外部类实例与内部类实例之间是一对多的关系,一个内部类实例只会引用一个外部类实例,而一个外部类实例对应零个或多个内部类实例。在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问。
d、在实例内部类中不能定义静态成员,而只能定义实例成员。
e、如果实例内部类与外部类包含同名的成员,this.a 表示内部类的成员变量a,Outer.this.a 表示外部类成员a。