内部类:
内部类的好处:可以直接操作私有属性。
封装类:
class1{
class2{} //内部类
}
内部类的分类:
成员式:
静态内部类: (课堂代码:StaticInner.java ,TestStaticInner.java) 生成的内部类的字节码文件StaticInner$Inner1.class
在静态内部类中只能访问外部类的静态成员。构造静态内部类对象不再需要构造外部类对象
成员内部类:(课堂代码:MemberInner.java ,TestMemberInner.java)
必须要先构造外部类对象,再根据外部类对象构造内部类对象。
生成成员内部类对象形式: Inner2 i2=new MemberInner().new Inner2();
一个外部类对象可以生成多个成员内部类对象,一个成员内部类对象一定是由某一个外部类对象生成的。
成员内部类不能有静态属性
内部类和外部类的实例变量可以共存。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性。
在外部访问时,外部类.内部类作声明,new 外部类(得到外部类对象).new 内部类(得到内部类对象)
例:MemberInner.Inner2 i2=new MemberInner().new Inner2();
局部式:
局部内部类:定义在外部类的方法中。(课堂代码:MemberInner.java)
与局部变量类似,在局部内部类前只能用abstract或final修饰符,但一般不加此修饰符,避免对继承产生影响。其范围为定义它的代码块。
局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部常量,但是要求外部类的局部变量是final的。
实际上是为内部类添加了一个属性,这个属性就是外部类的final局部变量
在类外不可直接访问局部内部类(保证局部内部类对外是不可见的)。
在方法中才能调用其局部内部类。
匿名内部类: 特殊的局部内部类,用来继承一个类或者实现一个接口,我们只需要这个局部内部类的一个对象。
匿名内部类不能定义构造方法
匿名内部类在编译的时候由系统自动起名Out$1.class。
如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
因为匿名内部类无构造方法,所以其使用范围非常的有限。