内部类的访问规则:
1、内部类可以直接访问它所在外部类中的成员,包括私有成员。内部类之所以能直接访问外部类中的成员,就是因为内部类持有一个外部类的引用,格式:外部类.this
class Outer
{
private int x=1;
class Inner
{
int x=3;
void show()
{
System.out.println("Inner:"+Outer.this.x);
}
}
}
2、外部类要访问内部类,必须建立内部类的对象。
访问格式:
1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他来中直接建立内部类对象。格式:外部类名.内部类名 变量名=new 外部类名().内部类名()。比如Outer.Inner in=new Outer().Inner();
2、当内部类在成员位置上时,就可以被成员修饰符所修饰。比如,private:将内部类在外部类中进行封装
static:用static修饰时,内部类就具备了static的特性,而且此时内部类只能直接访问外部类中的static成员,出现了访问的局限性。
在外部类中如何访问static内部类的非静态成员呢?new Outer.Inner().show()
在外部其他类中,如何直接访问static内部类中的静态成员呢?Outer.Inner.show()
注意:当内部类中定义了静态成员时,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。
说这么多,很多人会疑惑什么时候定义内部类?我们都知道类就是对事物的描述,而内部类显而言之就是事物的内部还有事物,这时就用内部类描述。
当内部类定义在局部时:
1、不可以被成员修饰符修饰
2、可以直接访问外部类中的成员,因为还持有外部类的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
匿名内部类:
1、匿名内部类其实就是内部类的简写格式。
2、定义匿名内部类的前提:
内部类必须是继承一个类或者实现一个接口
3、匿名内部类对象的格式:new 父类或者接口(){定义子类的内容}.子类方法
4、匿名内部类中定义的方法最好少于三个,因为定义匿名内部类的时候需要继承父类或者实现接口,如果方法太多,就达不到简化代码的效果,还不如带有名字的的内部类。