1. 界说
界说在一个类中的类
2. 利用时机
- 当一个类必要用到另一个类,并且两个类的接洽比力密切时就必要利用内部类
- 内部类可以访问外部类的私有成员,这样可以将相关的类和接口隐藏在外部类的内部,提高封装性
- 匿名内部类是没著名字的类,通常用于界说一个只利用一次的类
3. 分类
3.1 静态内部类
可以当做静态变量来看
- //静态内部类
- public class OuterClass{
- private static int i = 0;
- private int j = 100;
- public static void m1() {
- System.out.println("m1");
- }
- public void m2() {
- System.out.println("m2");
- }
- //静态内部类
- //四种访问控制权限修饰符在这里都可以使用
- private static class InnerClass {
- public void m3() {
- System.out.println(i); //可以访问
- System.out.println(j); //不可以访问
- m1(); //可以访问
- m2(); //不可以访问
- }
- }
- }
复制代码 注意点:无法直接访问外部类中实例变量和实例方法
如何利用: OuterClass.InnerClass oi = new OuterClass.InnerClass ();
3.2 实例内部类
可以当做实例变量来看
- //实例内部类
- public class OuterClass{
- private static int i = 0;
- private int j = 100;
- public static void m1() {
- System.out.println("m1");
- }
- public void m2() {
- System.out.println("m2");
- }
- //静态内部类
- //四种访问控制权限修饰符在这里都可以使用
- private class InnerClass {
- public void m3() {
- System.out.println(i); //可以访问
- System.out.println(j); //可以访问
- m1(); //可以访问
- m2(); //可以访问
- }
- }
- }
复制代码 注意点:可以直接访问外部类中所有的实例变量,实例方法,静态变量,静态方法
如何利用: OuterClass.InnerClass oi = new OuterClass().new InnerClass ();
3.3 局部内部类
可以当做局部变量来看
- //局部内部类
- public class OuterClass{
- private static int i = 0;
- private int j = 100;
- public void m1() {
- //局部变量
- int i = 11;
- //局部内部类
- class InnerClass {
- public void m2() {
- System.out.println(i); //可以访问
- System.out.println(j); //可以访问
- }
- }
- //new 对象
- InnerClass ic = new InnerClass();
- ic.m2();
- }
- public static void m3() {
- int i = 11;
- //局部内部类
- //这里的内部类的类名可以和上面相同的原因是属于局部,就和局部变量一样,出了大括号之后就没了
- class InnerClass {
- public void m2() {
- System.out.println(i); //可以访问
- System.out.println(j); //不可以访问
- }
- }
- }
- }
复制代码 注意点:
- 局部内部类方外类外部的局部变量时,局部变量必要被final修饰
- 不能利用访问权限控制符修饰,由于只是在局部访问,外部不必要访问,添加这些修饰符也没有什么用
- 从JDK8开始,不必要手动添加final了,但JVM会自动添加
3.4 匿名内部类
特殊的局部内部类,没著名字,只可以利用一次
- //匿名内部类
- public class test {
- public static void main(String[] args) {
- Computer c = new Computer();
- c.conn(new Usb() {
- @Override
- public void read() {
- System.out.println("read");
- }
- @Override
- public void write() {
- System.out.println("write");
- }
- });
- }
- }
- class Computer {
- public void conn(Usb usb) {
- usb.read();
- usb.write();
- }
- }
- interface Usb {
- void read();
- void write();
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |