内部类:
内部类指的是在JAVA中可以将一个类定义在另一个类的内部
内部类可以定义在 类的内部(与类成员层次一致)
内部类可以定义在 方法/程序块内部(与类成员相差一个层次,与方法的局部变量同一个层次)。
1.成员内部类:
将一个类直接定义在类的里面,作为成员,与属性或方法层次一致
成员内部类可以与正常类一样,使用不同的修饰符来修饰
好处1:省略了一个 .java 文件。
好处2:成员内部类中可以访问外部类的所有成员,包括私有的
若想要在内部类中通过
对象.调用
外部类成员,要这样写
外部类.this.外部类成员
内部类存在后 源代码进行编译 产生一个字节码 外部类名$Inner内部类名.class
2.局部内部类
将一个类定义在方法/程序块里面,作为成员的内部结构,与临时的局部变量一个层次。
局部内部类像是一个局部的变量一样,不能用public protected private和static修饰,只能用abstract或final修饰。
命名:外部类名$1Inner内部类名,外部类名$2Inner内部类名.以此类
局部内部类,因为类是需要先编译的,编译后,字节码就确定了,由于变量的内容可以改变,所以要求局部内部类使用的变量只能是final修饰的。(因为变量可以改。比如在局部内部类A里使用了变量 a 。如果这个 a 不是final修饰的。那么如果 a 的值改了,那原先的字节码就不对了)
3.匿名内部类
interface Test{
public void test();
}
public class Son implements Test{
public void test(){}
}
Son son = new Son();
// 一般来写是上面这样写
// 如果是匿名内部类,则下面这样写
Test t = new Test(){
public void test(){}
};
// 其中Test()后面的{};包裹的是类体,是Test接口的子类,new出来的是匿名类的对象
开发中为了省略一个类文件,上面的写法比较常见
匿名内部类很特殊,只有类体,没有类的所有结构(修饰符,名字,继承,实现)
不能用任何修饰符来修饰,匿名内部类也没有构造方法。
可应用于对按钮进行事件绑定。
4.静态内部类
成员静态内部类
不需要外部类对象,通过正常的方式直接创建内部类
静态元素不能访问非静态成员(自己类和外部类)
整体展示: