实例内部类
没有使用static
修饰的内部类,说明内部类属于外部类的对象,不属于外部类本身。
特点:
1、创建实例内部类前,必须存在外部类对象,通过外部类镀锌创建内部类对象(当存在内部类对象时,一定存在外部类对象)
Outter.Inner in = new Outter().new Inner();
2、实例内部类的实例自动持有外部类的实例的引用,内部类可以直接访问外部类成员
3、外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问
4、实例内部类中不能定义静态成员,只能定义实例成员
5、如果实例内部类和外部类存在同名的字段或方法abc,那么在内部类中this.abc
表示访问内部类成员
// 外部类
class Outter
{
String name = "Outter.name";
public void xxoo()
{
System.out.println(this.new Inner().age);
}
// 实例内部类
class Inner
{
int age = 18;
String name = "Inner.name";
public void test()
{
String name = "Local.name";
System.out.println(name);
System.out.println(this.name);
System.out.println(Outer.this.name);
}
}
}
静态内部类
使用static
修饰内部类
特点:
1、静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例
Outter.Inner in = new Outter.Inner();
2、静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,必须通过外部类的实例去访问
3、在静态内部类中可以定义静态成员和实例成员
4、测试类可以通过完整的类名直接访问静态内部类的静态成员
// 外部类
class Outter
{
String name = "Outter.name";
static String name2 = "name2";
// 静态内部类
static class Inner
{
static int age = 18;
String name1 = "Inner.name";
public void test()
{
String name = "Local.name";
System.out.println(name2);
System.out.println(new Outter().name1);
}
}
}