进阶三

内部类

什么是内部类

  • 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
  • 场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

内部类

四种内部类

  • 成员内部类

    • 就是类中的一个普通成员。

      成员内部类

    • 成员内部类的创建。

      成员内部类创建语法

    • 和前面学过的实例方法一样,成员内部类的实例方法中,同样可以直接访问外部类的实例成员、静态成员。

    • 可以在成员内部类的实例方法中,拿到当前外部类对象,格式是:外部类名.this

  • 静态内部类

    • 有static修饰的内部类,属于外部类自己持有。

      静态内部类

    • 静态内部类的创建。

      静态内部类创建语法

    • 可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。

  • 局部内部类(基本没用)

    • 局部内部类是定义在在方法中、代码块中、构造器等执行体中的类。
  • 匿名内部类(重点

    • 就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。

      匿名内部类

    • 特点:匿名内部类本质就是一个子类,并会 立即 创建出一个 子类对象

    • 作用:用于更方便的创建一个子类对象。(不用再专门定义一个类)

  • 匿名内部类在开发中的使用场景:通常作为一个参数传输给方法。(一般都是调别人的API 不会自己写 核心目的是简化代码)

枚举

什么是枚举

  • 枚举是一种类
  • 枚举的格式

枚举

  • 枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。
  • 这些名称,本质是常量,每个常量都会记住枚举类的一个对象。

枚举源码

  • 枚举的特点(已经创建好多个对象的单例类)

    • 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
    • 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
    • 枚举都是最终类,不可以被继承。
    • 枚举类中,从第二行开始,可以定义类的其他各种成员。
    • 编译器为枚举类新增了几个方法,并且枚举类都是继承:Java.lang.Enum 类的,从enum类也会继承到一些方法。
  • 用枚举构建单例类设计模式

枚举单例类

枚举的常见应用场景

  • 选择定义一个一个的常量来表示一组信息,并作为参数传输。
  • 参数值不受约束。
  • 经常作为switch选择结构的入参

使用final

使用枚举

  • 使用枚举可以让代码可读性好,参数值得到了约束,对使用者更友好。

泛型

什么是泛型

  • 定义类、接口、方法时,同时声明了一个或者多个类型变量(如:),称为泛型类、泛型接口,泛型方法、它们统称为泛型。

常用泛型约束集合

  • 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
  • 泛型的本质:把具体的数据类型作为参数传给类型变量。

泛型类

  • 可以约束传入的数据。

泛型类

1
2
3
public class A<E>{}  //约束一个参数
public class B<E, T>{} //约束多个参数
public class C<E extends onotherClass>{} //要求约束的参数必须继承某一类

泛型接口

  • 根据不同的参数进行不同的实现。

泛型接口

  • 例:系统要处理老师和学生的数据,提供保存和查询功能。

定义泛型接口

老师类实现

学生类实现

  • 注意:类型变量建议用大学英文字母,常用E、T、K、V等。

泛型方法

  • 构建泛型方法

泛型方法

  • 集和泛型的拓展:

    • 用 “?” 代表一切类型
    • ? extends 上限类 入参必须是上线类或其子类
    • ? super 下限类 入参必须是下限类或其父类

    集合中的泛型拓展

  • 小结:

    • 通配符”?”可以在“使用泛型”的时候代表一切类型;ETKV是在定义泛型的时候使用。
    • 泛型上限:? extends Car 表示?能接收的必须是Car或者其子类。
    • 泛型下限:? super Car 表示?能接收的必须是Car或者其父类。
  • 泛型的擦除问题和注意事项

    • 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
    • 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。 (如 ArrayList报错 应该用 ArrayList