内部类
1.1 内部类的概述
将类定义在另一个类的内部则成为内部类。其实就是类定义的位置发生了变化。
在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为成员内部类和局部内部类。
备注:内部类生产的class文件为 “外部类$内部类”,为了标明该内部类是属于具体哪个外部类的。
1.2 成员内部类的访问方式
- 内部类可以直接访问外部类的成员属性。(孙悟空相当于内部类飞到牛魔王的肚子里面去)。
- 外部类需要访问内部类的成员属性时需要创建内部类的对象。
- 在外部类的成员函数中创建内部类的对象,通过内部类对象对象直接访问内部类的成员。
- 在其他类中直接创建内部类的对象。
Outer.Inner inner = new Outer().new Inner();
外部类访问内部类的属性
编译异常分析:外部类需要访问内部类的属性时,需要创建内部类的对象访问。
有A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来A类中的成员。这时,就将A类定义成B类的内部类。比喻:孙悟空和铁扇公主。孙悟空到了公主肚子中,就成了内部类(其实是持有外部类的对象引用)。
疑问: 什么时候使用内部类呢?
当我们分析事物时,发现事物的内部还有具体的事物,这时则应该定义内部类了。
比如人体是一个类,人体有心脏,心脏的功能在直接访问人体的其他内容。这时就将心脏定义在人体类中,作为内部类存在。
内部类的优势:成员内部类作为外部类的成员,那么可以访问外部类的任意成员。
1.3 成员内部类访问细节
私有的成员内部类不能在其他类中直接创建内部类对象来访问。
如果内部类中包含有静态成员,那么java规定内部类必须声明为静态的访问静态内部类的形式:Outer.Inner in = new Outer.Inner();
总结:成员内部类(成员属性、成员方法)特点:
- 1. 私有的成员内部类
特点:不能在其他类中直接创建内部类对象来访问
- 2. 静态的成员内部类
特点:如果内部类中包含有静态成员,那么java规定内部类必须声明为静的
访问静态内部类的形式:
Outer.Inner in = new Outer.Inner();
疑问: 目前打印的num是20,如果想打印10的话,应该怎么做?
解答:这时候其实在show方法中已经存在了两个this对象,一个是外部类对象,一个是内部类对象,所以要在this前面加上类名标明对应的this。
1.4 局部内部类
局部内部类概述:包含在外部类的函数中的内部类称之为局部内部类。
访问:可以在包含局部内部类的方法中直接创建局部内部类的对象调用局部内部类的成员。
注意:局部内部类只能访问所在函数的fanal属性。
1.5 匿名内部类
匿名内部类:就是没有类名字的内部类。
匿名内部类作用:简化内部类书写。
匿名内部类的前提:必须继承一个父类或者是实现一个接口。
匿名内部类的格式:
new 父类或者接口(){ 执行代码….};
内部类的写法:
class Outer{ class Inner { public void show(){ System.out.println("内部类的show方法"); } } public void print(){ new Inner().show(); } }
匿名内部类调用show方法:
案例:在外部类调用show1、show2方法。内部类的实现方法
使用匿名内部类实现:
注意细节:
1.使用匿名内部类时,如果需要调用匿名内部类的两个方法或者两个方法以上。可以使用变量指向该对象。