内部类

声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.

目录快捷跳转

    • 内部类
    • 成员内部类
    • 静态内部类

内部类

将一个类定义在另一个类的内部,这种类称之为内部类;

  1. 内部类的设计也属于封装的一种,封装体现的保护性和易用性在内部类上仍然适用;
  2. 现实生活中的内部类:
    发动机类和汽车类的关系,发动机就嵌套在汽车的内部;
  3. 根据内部类定义的位置以及关键字,一共分为四种内部类: 成员内部类、静态内部类、方法内部类、匿名内部类;
  4. 匿名内部类是Lambda表达式的前身,Lambda表达式其实就是一个匿名内部类的简化写法;

成员内部类

直接定义在一个类的内部,不加任何修饰符,这种内部类称为成员内部类;

  1. 直接在*.java源文件中定义的类称为外部类/普通类;
  2. 成员内部类的使用原则: 类比外部类的成员方法/属性; 成员内部类必须依赖外部类对象产生,先要产生外部类对象,才能产生成员内部类对象; 要产生一个发动机对象,必须先得有汽车对象,然后产生发动机对象;
  3. 关于成员内部类的实例化:
    a. 在外部类的内部进行实例化,就和普通类的产生一模一样;
    b. 在外部类的外部产生内部类的对象 => 前提是内部类在外部可见的才能创建;
    语法:
    外部类.内部类 内部类引用名称 = new 外部类().new 内部类();
  4. 成员内部类和他的外部类可以方便的互相访问彼此的私有域(这是内部类存在的最大价值与意义),内部类可以直接调用外部类的私有域(因为创建内部类对象会传入一个外部类的对象),外部类必须通过内部类的对象来调用其私有域;
  5. 在成员内部类中不能定义任何的静态域,可以访问外部类的静态域(JDK16之后放开了在成员内部类中定义静态域);
  6. 内部类可以使用private进行封装,对外部完全隐藏;
  7. 内部类和外部类不是继承关系,也不是简单的包含关系,内部类定义在外部类之中,需要依赖外部类存在;

静态内部类

直接定义在外部类之中,使用关键字static修饰,称为静态内部类;

  1. 静态内部类就和普通类一样,只不过是定义在一个类的内部而已,不需要依赖外部类对象; 例如汽车里的手机支架和汽车本身没什么关系,放在哪里都可以,只不过当前放在汽车里面;
  2. 成员内部类的使用有很多限制,反而静态内部类的使用更加灵活,因此应用更加广泛;
  3. 关于静态内部类的使用:
    a. 在外部类的内部创建静态内部类对象: 和普通类完全相同;
    b. 在外部类的外部创建静态内部类的对象,不需要依赖外部类对象,前提是静态内部类要在当前创建位置可见;
    语法:
    外部类.内部类 内部类引用 = new 外部类.内部类();
  4. 由于在静态内部类中不依赖外部类对象,因此产生静态内部类时,没有产生外部类对象; 静态内部类可以拥有自己的成员域,但是由于没有传入外部类对象,因此必须显示通过外部类对象访问外部类的成员域;
  5. 无论哪种内部类,内外部类的私有权限,都是可见的! private对于内部类和其嵌套的外部类来说,都是可见的;
  6. 静态内部类可以直接访问外部类的私有静态属性,成员属性需要通过外部类的对象调用; 外部类可以通过内部类的对象来访问内部类的私有域(静态|非静态)都可以;

你可能感兴趣的:(Java,java)