内部类

1、内部类概念

概念:在一个类的内部再定义一个完整的类

特点:

  • 内部类可直接访问外部类的私有成员,而不破坏封装性
  • 可为外部类提供必要的内部功能组件
//Out外部类
public class Out {
    
    //String为Out类的私有属性
    private String name;

    //In为内部类
    public class In{
        public void printName(){
            System.out.println(name);
        }
    }
}

此处我们可以看见,Out类内部定义了一个In类,这个In类就是Out的内部类,它可以直接访问外部类Out的私有成员name。

 

2、内部类分类

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

3、成员内部类

  • 在类的内部定义,与实例变量、实例方法同级别的类
  • 创建内部类对象时,必须依赖外部类对象

   如果想要创建内部类对象,必须先实例化一个外部类对象,然后通过外部类的对象来创建内部类的对象,如以下代码:

     //1.创建外部类对象
        Out outer = new Out();

        //2.创建内部类对象
        Out.In inner = outer.new In();
  • 当外部类、内部类存在重名属性时,会优先访问内部类属性
  • 成员内部类中,不能定义静态成员,但可以包含静态常量

 

4、静态内部类

  • 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员(与成员内部类不同)
//Out外部类
public class Out {

    //String为Out类的私有属性
    private String name = "outer";
    private int age = 20;

    //In为静态内部类,级别和外部类相同
    public static class In{
        private String address = "xxx";
        private String phone = "11";
        //可以包含静态成员
        private static int num = 100;

        public void show(){

            /**
             * 调用外部类的属性
             * 1.首先创建外部类对象
             * 2.调用外部类对象成员属性
             */
            
            Out outer = new Out();
            System.out.println(outer.name);
            System.out.println(outer.age);
        }
    }
}

  其中静态内部类如果想使用外部类的成员,必须先创建外部类对象,然后调用外部类对象成员属性。

  

        //创建内部类对象,这里并没有实例化外部类对象
        Out.In inner = new Out.In();

  创建静态内部类对象时,不需要创建外部类对象,可直接创建。

  

  • 只有内部类可以是静态static的,普通的类不可以是静态类

 

5、局部内部类

  • 定义在外部类的方法中,作用范围和创建对象仅限于当前方法,所以需要在方法中创建内部类的对象
    //Out外部类
    public class Out {
    
        //String为Out类的私有属性
        private String name = "outer";
        private int age = 20;
    
        public void show(){
            //定义局部变量
            String address = "xxx";
    
            //局部内部类
            class In{
                private int id = 1;
    
                public void show2(){
                    //可以直接访问外部类的属性
                    System.out.println(Out.this.name);
                    System.out.println(Out.this.age);
    
                    //访问内部类的属性
                    System.out.println(this.id);
    
                    //访问方法的局部变量
                    System.out.println(address);
                }
    
            }
    
            //在方法内部创建局部内部类对象
            In inner = new In();
            inner.show2();
        }
    }

    注:可以直接访问外部类的成员属性

  • 局部内部类跟局部变量一样,不可以加访问修饰符
  • 局部内部类中不可以添加静态成员,但是可以添加静态常量

 

6、匿名内部类

  • 没有类名的局部内部类(一切特征与局部内部类相同)
  • 必须继承一个父类或者实现一个接口
  • 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
public interface USB {
    void service();
}

  这是一个接口USB

            //使用匿名内部类
            USB usb = new USB() {
                @Override
                public void service() {
                    System.out.println("连接成功");
                }
            };
    
            usb.service();

  这是一个匿名内部类,相当于要使用某一个接口时,临时构建一个内部类

 

欢迎关注微信公众号,不定期分享学习笔记与资料,与Mike一起学java,谢谢~

posted @ 2020-11-17 17:50  Mike小菜鸡  阅读(121)  评论(1)    收藏  举报