基本上已经把thinking in java内部类部分学完了
内容比较多 整理下思路
简单的分类
内部类(inner class)
-> 匿名内部类
-> 域内部类(local class)
-> 嵌套内部类(nesting class)
1. 一般的内部类
class A { private class B{} }
特点:
> 可以使用外围内的方法和属性
> 无法定义static变量和方法
> 可以有private和protected访问修饰符(非inner class的类只有public和default2种访问修饰符)
> 在内部类中使用[外部类].this 语法可以获得该内部类的外部类引用
2. 域内部类
class A { { class B{} } }
或
class A { void f() { int i=0; class B{} } }
特点:
> 出了域的范围就无法访问, 比如在方法f()中的内部类, 在方法f()外的地方无法被访问
> 如果使用了局部变量(非外围内成员变量) 则该局部变量必需为final, 如class B想使用f()方法中的变量i
则i必需为final
3. 匿名内部类
class A{} class B { public getA() { return new A(){}; } }
4. 嵌套内部类: 就是嵌套的内部类为static class
class A { public static class B{} }
特点: 可以在内部类中定义static方法和变量
继承一个内部类
继承一个内部类时 需要使用到特殊语法来获得其外围类对象
class A { class InnerA{} } class B extends InnerA { public B(A a)//class B constructor { a.super();//使用这个语法编译时才不会报错 } }
也有种不需要这种语法的情况, 如下
class A{} class B { public getA() { return new A(){}; } }
class A { class InnerA{} } class B extends A { class InnerB extends InnerA{} }
此时InnerB虽然继承了InnerA, 但是由于其外围类B亦继承了A,
所以就不需要在InnerB的构造器中使用<外围类>.super()的语法了
心得体会:
1. 内部类实现了真正的多继承
//内部类实现多继承的示例 class Shape { void drow(){} } class Ashape { public class Rectangle extends Shape//长方形继承Shape { void drow() { System.out.println("a rectangle"); } } public Shape getTriangle()//方法getTriangle返回一个Shape { class Triangle extends Shape//三角形继承Shape { void drow() { System.out.println("a triangle"); } } return new Triangle(); } public Shape getCircle()//匿名内部类 实际是构造了一个circle继承Shape { return new Shape() { void drow() { System.out.println("a circle"); } }; } }//class Ashape end~ public class TestInnerclassExtends//该类用于测试Ashape { public static void main(String args[]) { Ashape a=new Ashape(); Ashape.Rectangle rec=a.new Rectangle();//构建一个内部类实例的语法 rec.drow(); a.getTriangle().drow(); a.getCircle().drow(); } }
输出结果:
a rectangle
a triangle
a circle