内部类(inner class): 是一种声明在其他类内部的内嵌类型。 访问规则:可以访问外类中的成员(包括 private 修饰的)----->不用创建外部类的对象 直接使用。
外部类(outer class)要访问内部类(inner class)成员时,必须建立内部类的对象,通过对象进行调用。
创建内部类对象:: Outer.Inner in=new Outer().new Inner();
解释:Outer.Inner : 外部类.内部类------->Outer.Inner in, 也就是创建对象 in new Outer().new Inner() :外部类对象.内部类对象------->对象。
知识点:之所以内部类可以直接访问外部类中的成员,因为内部类中持有一个外部类的引用: “Outer.this.___” 这里的“this”是Outer 的。
内部类在成员位置上,可以被成员修饰符所修饰,例如:private(也只有这种情况下 类可以修饰成私有) static。,当修饰为static时只能直接访问外部类的static成员了。
但是,若在局部成员位置上,:1、不能别这些所修饰。可以直接访问外部类中的成员,但不可以访问其所在的局部中局部变量,除非将此变量修饰为"final".。
那么其他外部类如何访问别的类中的“静态内部类”呢? Outer.Inner._成员 因为此时内部类是静态的,所以可以直接使用外部类的类名调用,不用创建对象。
若访问Inner中的非静态方法: new Outer.Inner().方法名(); 此时需要建立对象调用。
注意点:当内部类中定义静态成员时,那么该内部类必须是静态的。 当外部类中的静态方法访问该内部类时,此内部类也应是静态的。
内部类的应用:当描述事物时,事物的内部还有事物时,该事物用内部类描述。此时,内部事物可以使用外部事物中的内容。
匿名内部类:匿名内部类其实就是内部类的简写格式
定义匿名内部类的前提: 该内部类必须是继承一个类或者实现接口。
匿名内部类的格式:先是一个有继承或实现接口的子类:
class Inner extends 父类 //定义子类
{
void show()
{abcde}
}
New Inner().show(); //再调用函数
以上简写成:
new Outer()
{
void show ()
{ abckkde}
}.show();
“.show()”之前 蓝色部分其实就是 new Inner(), 直接带有对象体,一个子类对象。
为什么是子类? 因为只有之类才能复写父类中的show()方法。