先下个定义,内部类分为以下几种:
定义在成员位置的称之为成员内部类,细分为普通成员内部类、静态内部类,这里要强调一下静态内部类不是普通内部类,它有独立的功能,藏在类内是为了“保护”自己
先说说成员内部类;成员内部类定义方法:
成员内部类特点:
成员内部类类加载机制:
我解释下下面这段描述,它的意思是因为成员内部类没有静态成员,在外围类中定义成员内部类并不是每个外围类对象中都会自动初始化一个内部类对象。只有在外围类对象的基础上,创建内部类对象才会触发成员内部类的类加载。说白了,内部类一定要依靠外围类的,没它不行。这里和静态内部类作为区分。
内部类的继承和实现:
定义在局部位置的内部类细分为局部内部类、匿名内部类
接下来重点唠唠访问,就是你访问我 我访问你这种垃圾操作
成员内部类内部访问外围类
需要理解的是,成员内部类相当于外围类的成员,并且内部类对象依赖外围类,在成员内部类的成员方法中一定存在一个外围类对象(重要)
成员内部类可以无条件访问外围类的所有成员属性和成员方法(包括private成员和静态成员)
需要注意的是,当外围类中有同名的属性或者方法时,都会发生类似“隐藏”的现象
- 即默认情况下访问的都是成员内部类的成员
如果要访问外围类的同名成员,需要以下面的形式进行访问:
外围类访问成员内部类
静态内部类
写的啰里八嗦,简单描述下就是说成员内部类、外围类、外部类、静态内部类这四个元素相互访问变量和方法的定义,多整几个案例联系下,熟练了访问方式就可以了。接下来的匿名内部类和lambda表达式才是重点。
可以获得外围类的私有成员变量
静态内部类
静态内部类无法直接访问非静态的属性
局部内部类
是声明在方法中的
外部类中创建内部类,要有权限的
public class Work2 {
public static void main(String[] args) {
//创建并初始化Bean1类对象bean1
//外围类的静态方法中,创建成员内部类的对象
Bean1 bean1 = new Work2().new Bean1();
bean1.i++;
// 创建并初始化Bean2类对象bean2
//外围类的静态方法中,创建静态内部类对象
Bean2 bean2 = new Bean2();
bean2.j++;
//创建并初始化Bean3类对象bean3
//在外部类当中创建成员内部类对象
Bean.Bean3 bean3 = new Bean().new Bean3();
bean3.k++;
}
class Bean1 {
public int i = 0;
}
static class Bean2 {
public int j = 0;
}
}
class Bean {
class Bean3 {
public int k = 0;
}
}