JAVA“基础不牢地动山摇“ ==> 重温 《内部类》
本章导学:
-
初始内部类 ArrayList使用内部类案例
一、初识内部类
1.1、什么是内部类
可以将一个类的定义放在里另一个类的内部,这就是内部类。广义上我们将内部类分为四种:成员内部类、静态内部类、局部(方法)内部类、匿名内部类。
1.2、使用内部类的好处
我们都知道,Java仅支持单基础多实现,但使用内部类,每个内部类又可以去继承一个父类。
使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。——《Think in java》
1.3、使用内部类的细节
- 内部类可以直接访问自己的成员属性和外部类的成员属性
- 外部类访问内部类的成员属性,需要创建内部类对象
内部类可以直接访问自己的成员属性和外部类的成员属性
显而易见,自己访问自己的属性肯定是没有问题的
外部类访问内部类的成员属性,需要创建内部类的对象
如上图,外部类不可以直接访问内部类的成员属性,那我们如何访问内部类里的属性呢?
我们可以在外部类(Car)里直接new内部类(Engine)的对象,然后再去访问属性
创建一个测试类试试
为了调用Engine里的engineShow()方法,我们需要创建出Engine的对象
而Engine属于Car的内部类,按照《外部类访问内部类,需要创建内部类对象》的原则,我们需要先创建出外部类(Car)对象,然后外部类(Car)再创建出内部类(Engine)对象。
使用engineShow()方法,也可以简写成
测试一下
1.4、ArrayList使用内部类案例
我们可以看到,Itr就是ArrayList的内部类
//举个例子,ArrayList里的迭代器(Iterator)就是内部类 //ArrayList(外部类)访问Iterator(内部类),需要创建对象 //比如:我们访问迭代器的hasNext方法必须先创建内部类(Iterator)的对象
这里不能写成new ArrayList<String>().new Itr();
因为Itr被定义成private仅自身可见,而ArrayList里有一个iterator()可以帮我们返回一个Itr对象
我们模仿一下,改写我们的代码。流程如下
1,创建Start接口,创建engineShow()
2,修改Engine为private
3,Engine实现Start接口,并重写engineShow()
4,通过 接口 = new 实现类,创建Engine实现类并调用engineShow()
创建Start接口,创建engineShow()
修改Engine为private
Engine实现Start接口,并重写engineShow()
通过 接口 = new 实现类,创建Engine实现类并调用engineShow()
这样一来,我们就不用写两个new来创建Engine对象了,必须先创建Car对象然后通过getEngine()获取Engine对象,同时也满足了《内部类单独使用无意义》这一原则。