Java中允许在一个类的内部定义一个类,这样的类就成为内部类,而内部类所在的类就被称为外部类
一、内部类的创建和调用
在创建内部类的时候,内部类可以是静态的也可以是非静态的,修饰符可以是public、private、protected以及default,但是内部类所在的外部类的类型就必须是public或者default。
内部类一旦编译成功就会和相应的外部类生成两个完全不同的两个类。
public class Outer(){
public static void outerShow(){
System.out.println("外部类");
}
public class Inner(){
public static void innerShow(){
System.out.println("内部类");
}
}
}
上例代码中外部类Outer和内部类Inner,他们在编译完成的时候回生成两个不同的class文件,分别是Outer.class和Outer&Inner.class。
内部类的调用需要通过外部类对象来创建内部类,创建格式:
外部类.内部类 对象名 = new 外部类().new 内部类();
public class Outer(){
public static void outerShow(){
System.out.println("外部类");
}
public class Inner(){
public static void innerShow(){
System.out.println("内部类");
}
}
}
public class Test{
public static void main(String[] args){
Outer.Inner ic = new Outer().new Inner();
ic.innerShow();
}
}
二、成员内部类
成员内部类类似于类中的成员变量、成员方法。
- 成员内部类可以访问外部类中所有的成员变量以及成员方法,也可以使用任意的访问修饰符。
- 可以访问外部类所有的数据,包括私有数据。
- 成员内部类必须使用外部类对象来创建
即:内部类 对象名 = new 外部类().new 内部类();
外部类不能直接使用内部类的成员,只能通过创建内部类的对象,通过内部类的对象来访问。 - 如果外部类和内部类具有相同的成员变量或者方法,内部类默认访问的是自己的成员,如果要访问外部类的成员的话可以使用this关键字(外部类名.this .成员变量/成员方法)。
public class Outer(){
private int a = 0;
public class Inner(){
int a = 1;
public void innerTest(){
System.out.println("外部类的成员:" + Outer.this.a);
System.out.println("内部类的成员:" + a);
}
}
public static void main(String[] args){
Inner i = new Outer().new Inner();
i.test();
}
}
三、匿名内部类
匿名内部类就是没有名字的内部类,它是最常用的内部类,并且匿名内部类是唯一没有构造方法的类。由于匿名内部类没有构造方法,所以匿名内部类的使用大部分是用于接口的回调。一般情况下,匿名内部类用于继承其他类或用于实现接口,所以匿名内部类在创建的时候首先要创建匿名类的接口,否则编译的时候会提示匿名类不存在。
button.addActionListener(){
new ActionListener(){
public static actionPerformed(ActionEvent e){
System.out.println("button");
}
}
}
四、局部内部类
局部内部就是定义在一个方法或者作用域中的类,就像方法中的一个局部变量一样,是不能有public、private、protected以及static修饰符的。它和成员内部类的区别是局部内部类的访问仅限用于方法内部或者该作用域内。
方法内的内部类:
public class Outer(){
public void test(){
class Inner(){
int a = 0;
}
}
}
作用域内的内部类:
public class Outer(){
public void test01(int a){
if(a>0){
class Inner(){
private int i;
int getNum(int b){
return i = b;
}
}
}
}
public void test02(){
test01(2);
}
public static void main(String[] args){
Outer o = new Outer();
o.test02();
}
}
五、静态内部类
静态内部类和其他内部类相同,只是多了一个static关键字。它的特点如下:
- 静态内部类不能直接访问外部类的非静态成员,因为静态内部类在没有外部类对象的情况下可以直接创建,而外部类的非静态成员依附于外部类对象,如果直接访问外部类的非静态成员则会发生矛盾。可以使用“new 外部类.成员”的方式访问。
- 如果外部类的静态成员和内部类的成员名称相同,可以通过“类名.静态成员名”访问外部类的成员,否则默认访问的是内部类的成员。
- 创建内部类的对象的时候可以直接创建,不需要通过外部类的对象,格式为:
内部类 对象名 = new 内部类();
public class Outer(){
public static in a = 0;
private int = 1;
public stataic class Inner(){
int a = 2;
public void test(){
System.out.println("内部类的a:" + a);
System.out.println("外部类的a:" + Outer.a);
System.out.printn("外部类的b:" + new Outer().b);
}
}
public static void main(String[] args){
Inner i = new Inner();
i.test();
}
}
(内容为自己学习总结,学习资料来源于网上和书籍,侵删)