内部类:
一般我们说的内部类就是成员内部类
作用:
很方便调用外部类的私有数据(甚至包括私有变量
);
<-->外部类调用内部类就需要new对象
了;
原因:
Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着;
分类:
静态内部类 (static修饰的成员内部类)
Java中的静态内部类是没有了指向外部的引用,类似C++中的嵌套类;
用法:和成员内部类差不多
区别:<1>在测试类中创建对象格式不一样
格式: <外部类名>.<内部类名>对象 = new 外部类.内部类();
<2>静态只能调用静态
静态内部类只能调用外部类中的静态成员
成员内部类
位置:定义在方法外
修饰符:四种权限都可以修饰,也可以用static修饰(此时就变成了静态内部类)
实例化:
格式1 : <外部类名>.<内部类名> <对象名> = new <外部类>().new<内部类>( )
格式2: 把内部类导包 就可以声明内部类 但是new对象还是得这两步操作
变量查找顺序: 在当前方法中寻找局部变量
如果没有 继续向上寻找
找当前类的成员变量
如果没有 继续向上找
找到外部类的成员属性
如果再找不到 报错
如果没有 继续向上寻找
找当前类的成员变量
如果没有 继续向上找
找到外部类的成员属性
如果再找不到 报错
调用外部类的变量(内部外部变量两同名): <外部类名>.this.<属性名>
注意:成员内部类中不能有静态成员(否则这个类就得用static修饰,那么就变成了静态内部类)
局部内部类 (局部变量)
位置:
定义在一个方法甚至一个代码块之内
生命周期:随着方法调用结束而消失
记住:匿名内部类就是局部内部类的形式之一;
修饰符:跟局部变量一样,都不可以 注意:局部内部类再调用局部变量时 在JDK1.8之前 局部变量要用final修饰
情况:
l
如果内部类里的一个成员变量与外部类的一个成员变量同名
结果:
外部类的同名成员变量被屏蔽了
解决办法:
外部类名.this