在java中运行部一个类定义位于另一个类的内部,外面的类称为外部类,里面的类称为内部类。内部类主要是为外部类服务。
注意:方法内部不能定义方法,只能调用方法
内部类按位置划分,分为三类,成员内部类(在类的内部定义一个类),局部内部类(在方法或代码快中定义一个类),匿名内部类。
一、成员内部类
内部类访问修饰符有四个(private,默认,protected,public);
外部类的访问修饰符有两(public,默认);
因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。就可以满足所有的情况了。
1.非静态内部类
没有被static修饰的内部类。
1)特点
在非静态内部类中不能定义static修饰的属性,方法。
非静态内部类中可以调用外部类的属性,方法。(若外部类的属性或方法与内部类属性方法同名,则可通过 外部类名.this.属性|方法();还可以访问外部类中static修饰的属性,方法。)
2)非静态内部类中属性,方法的调用
在外部类中调用:
外部类非静态方法中:直接创建内部类内部类对象,然后通过对象调用属性或方法
外部类静态方法中:创建外部类对象,通过外部类对象根据 外部类对象.new 内部类(Outer.Inner inner = out.new Inner();) 语法创建内部类对象,之后通过内部类对象调用。
在其他类中调用:
创建外部类对象,根据 外部类对象.new 内部类 语法创建内部类对象,通过内部类对象调用属性和方法。
2.静态内部类
static修饰的类
1)特点
在静态内部类中,只能调用外部类中静态的属性和方法。(在静态内部类中不能使用 外部类名.this)
2)静态内部类中属性和方法的调用
调用的是静态成员,在外部类中可以直接通过 静态内部类名. 进行调用;在其他类中可以通过 外部类.内部类.静态成员
如果调用的是非静态成员,通过 外部类.内部类 对象名 = new 外部类.内部类();创建对象 通过对象名. 调用。
注意:内部类可以创建对象也是因为在内部类中有构造方法。如果显示添加带参构造方法,new对象的时候,必须传递参数。
2.局部内部类
编写在方法内部的类
特点
局部内部类不可以使用访问修饰符,static进行修饰(即:局部内部类中的属性和方法都是非静态的)
局部内部类可以直接访问方法中的属性
局部内部类可以直接访问外部类中的属性和方法
3.匿名内部类
特点
匿名内部类不能定义任何静态成员,方法,和类,只能创建匿名内部类中的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。