1.什么是内部类?内部类:定义在类当中的一个类
2.为什么要使用内部类?1.增强封装,把内部类隐藏在外部类当中,不允许其他类访问这个内部类
2.增加了代码一个维护性
3.内部类可以直接访问外部类当中的成员
3.内部类可以分为哪几种?内部类可以分为四种:
1.实例内部类:直接定义在类当中的一个类,在类前面没有任何一个修饰符
2.静态内部类:在内部类前面加上一个static
3.局部内部类:定义在方法的内部类
4.匿名内部类:属于局部内部的一种特殊情况
4.内外部类的修饰符外部类的修饰符只能有两个:
public 或者是 默认修饰
内部类可以使用很多个修饰符
实例内部类实例内部类是 属于对象的内部类,是 不属于类的,不使用static修饰的内部类意思就是把这玩意儿看成是一个对象,别把他当类看想要使用内部类 必须得要 先创建外部类
在实例内部类中存在对外部类的引用意思就是 实例内部类在堆中开辟的空间 里面不仅存放着自己的字段方法和this地址,还有外部类的地址内部类 可以 访问 外部类 当中的成员
外部类 不能 直接访问 内部类 当中的成员意思是 我们要把‘实例内部类’看作对象,而不是类,因此内部类中的成员变量不能使用static修饰,因为static是属于‘类’的 字段和方法,而实例内部类是对象。如果强行写上,编译器会报错。举例:实例内部类——出自高新强老师Java网课举例:实例内部类的 创建——出自高新强老师Java网课实例内部类在堆中开辟的空间 里面不仅存放着自己的字段方法和this地址,还有外部类的地址
静态内部类静态内部类是 在内部类前面加上static
静态内部类是 不需要创建外部对象
Outter.Inner in = new Outter.Inner();在静态内部类当中, 没有外部类引用意思是他在堆中开辟的空间 里面没有存放外部类的地址静态内部类,是可以访问外部类的静态成员但是不能直接访问外部类中的非静态成员变量
如果想要访问外部类中的非静态成员变量 可以new一个外部类出来:new Outer().age访问静态内部类当中的静态成员:Outter.Inner.color不需要new内部类,直接把内部类当对象用静态内部类当中不仅可以定义静态成员也可以定义非静态成员调用方法如出一辙
局部内部类局部内部类:定义在方法中的内部类
不能使用一些修饰符public private...
局部内部类只能定义在方法当中使用
局部内部类当中是不能包含静态变量因为局部内部类是‘属于方法的’,而static是‘属于类的’,两者相矛盾局部内部类当中可以包含局部变量,使用的局部变量的本质是final变量在方法中new出局部类,会在堆中开辟空间,若局部内部类使用了栈中该方法栈帧的成员变量,一旦方法栈帧出栈,堆中的成员变量就无法找到指向的元素,会空指针异常
为了避免这种情况,只能将方法中的成员变量设为static或final,但是static又不能设,所以只能设置为final当堆中一个对象没有人引用 它并不是直接就销毁出自高新强老师Java网课出自高新强老师Java网课
匿名内部类就是一个没有名字的局部内部类
它连名字都没有 所以也没有构造器 一个文件对应一个类
只使用一次的时候,就使用匿名内部类
new 父类的构造器 或接口(){
内部写的代码(在new时就会自动执行)
}匿名内部类不许得要有父类,或者是实现了接口出自高新强老师Java网课
注意不是new了一个接口,接口是不能new的。这是new了一个匿名内部类
其实要实现这个功能完全没必要用匿名内部类,我们直接在某一个方法里面写打印,然后调用就行了。匿名内部类大多用在安卓开发
比如手机触摸事件,如果每一个情况都要写一个方法的话,方法会显得非常多,干脆使用这种方法,只要是符合某一类父类特性或接口,就执行固定的操作,这样简便许多
关于这一块 我了解的不是很清楚,希望各路朋友批评指正出自高新强老师Java网课