JAVA小白的崛起之路(十八)内部类
一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类 的内部定义,称为内部类。
作用:
-
内部类可以很好的实现细节隐藏。 一般的非内部类,是不允许有 private 与 protected 权限的,但内部类可以。
-
内部类拥有外围类的所有元素的访问权限,利用这个特性可以实现java中的多 继承
-
可以避免修改接口而实现同一个类中两种同名方法的调用。
分类:
广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名 内部类和静态内部类。
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件, 但是前面冠以外部类的类名和$符号 。
内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以 自由地访问外部类的成员变量,无论是否是private的 。
内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只 能访问外部类的静态成员变量
成员内部类:
成员内部类可以访问外部类的所有成员变量和方法(无论静态、非静态、私有、非 私有),自身没有静态成员。
局部内部类:
将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去 调用内部类方法。局部内部类和成员内部类的区别在于局部内部类的访问仅限于方 法内。
匿名内部类:
定义类的最终目的是创建一个类的实例,但是如果某个类以及它的实例只是用一 次,则可以将类的定义与类的创建,放到与一起完成,或者说在定义类的同时就创 建一个类 , 以这种方法定义的没有名字的类成为匿名内部类。 用于只创建这个类的 一个对象的场合(不必命名),通常是作为方法的参数,隐式地继承了一个父类或 者实现了一个接口。或直接使用接口引用指向匿名子类对象。
注意:
1、匿名内部类可以继承一个类或实现一个接口,这里的 ClassOrInterfaceName 是匿名内部类所继承的类名或实现的接口名。但匿名内部类不能同时实现一个接口 和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是 Object 类的 直接子类,匿名类继承一个类或实现一个接口,不需要 extends 和 implements 关键字。
②由于匿名内部类没有名称,所以类体中不能定义构造方法,由于不知道类名也不 能使用关键字来创建该类的实例。
静态内部类:
当使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外 围对象,可以将内部类声明为 static 。如果用 static 将内部类静态化,那么内 部类就只能访问外部类的静态成员变量,不能直接访问外部类的实例变量、实例方 法,只有通过对象引用才能访问。