直接创建外部类不会创建出内部类。内部类对象内访问外围类对象的所有成员,而不需要任何特殊条件,还拥有外围类的所有元素的访问权。
在内部类若要生成对外围类对象的引用,可使用外围类的名字后紧跟 .this。
创建内部类对象的操作:
1、外部类函数返回; 2、外部类对象.new 内部类类名
若内部类非static,则在拥有外部类对象之前,不可能创建内部类对象
在方法作用域内创建一个完整的类叫做局部内部类。在方法之外不能访问该内部类。
匿名内部类:创建一个集成自new的类的匿名类对象。匿名类描述结束后需要用分号(表示表达式的结束)
若定义一个匿名内部类,并希望它使用一个在其外部定义的对象,编译器会要求其参数引用时final的。
匿名内部类既能扩展类,也能实现接口,但二者不能兼得,且只能实现一个接口。
若不需要内部类对象与其外围类对象之间有联系,可将内部类声明为static,通常称为嵌套类。普通内部类对象隐式的保存了一个外围类对象的引用。不能从嵌套类对象中访问非静态的外围类对象。
普通内部类不能有static数据和static字段。
正常情况下,不能再解开内部设置任何代码,但嵌套类可作为解开的一部分。放到接口的任何类都自动的设定为public和static的(内部类会自动设置成嵌套类)。
内部类可以访问外围类的所有成员。内部类最大的优点:每个内部类都能独立继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的实现),对于内部类都没有影响。
内部类允许继承多个非接口类型(类/抽象类)。继承内部类的类构造器的默认构造器不能通多编译。必须在该构造器中的参数中加入外围类对象的引用。
局部内部类不能有访问说明符,因为它不是外围类的一部分。
使用局部内部类而非匿名内部类的原因:
1、需要一个命名的构造器/需要重载构造器; 2、需要不止一个内部类对象。