Java 内部类,Lambda表达式 ⑦

文章目录

  • 内部类
      • 内部类定义
      • 内部类的分类
        • 成员内部类
        • 静态内部类
        • 局部内部类
        • 匿名内部类
          • lambda表达式
  • 接口和抽象类的区别
  • 函数式接口
  • 内存管理
      • 堆内存
        • 原理:
          • 内存溢出:
          • 内存泄漏:
  • ATM模拟

内部类

内部类定义

在类的内部的某个位置再定义一个类.

内部类的分类

成员内部类

  1. 内部类相当于是成员变量和成员方法,可以用private修饰.
  2. 可以访问外部类的所有成员,
  3. 内部类不可以定义静态成员,包括变量和方法,(除了静态常量特殊) 原因: 内部类是在外部类初始化玩再进行初始化,如果内部类中有静态成员,而静态成员是在类加载时候就进行初始化,显然矛盾了.
  4. 成员内部类的创建格式:
    外部类名.内部类名.内部类对象名=new 外部类名().new 内部类名();
    Java 内部类,Lambda表达式 ⑦_第1张图片

静态内部类

  1. 静态内部类不能访问外部类的非静态成员,因为static在实例化之前初始化.
  2. 但是可以访问静态成员
  3. 创建静态内部类的语法:
    外部类名.内部类名.内部类对象名=new 外部类名.内部类名();
    Java 内部类,Lambda表达式 ⑦_第2张图片

局部内部类

  1. 相当于方法中的局部变量 ,不能被static 和 private 修饰
  2. 不能被static修饰原因:加载顺序,假如用static修饰了局部变量,那就说明在类加载 的时候,方法内的局部变量已经被初始化了.但是方法是和对象息息相关的,方法之后在对象 初始化后才能调用,对象的实例化始终在静态修饰之后.
    不能用private的原因: 局部变量的声明周期就是所在方法体,所以不需要加任何修饰权限
  3. 不可以在局部内部类中定义静态成员,但可以定义静态常量。
  4. 方法内的内部类可以访问外部类方法的成员,但不能修改。
    Java 内部类,Lambda表达式 ⑦_第3张图片

匿名内部类

创建的是匿名类的对象,而不是父类的对象.

Java 内部类,Lambda表达式 ⑦_第4张图片
Java 内部类,Lambda表达式 ⑦_第5张图片

lambda表达式

lambda表达式 前提是只能有一个方法
(参数列表)–>{方法体} ;
左边

  1. 参数列表的数据类型可以省略;
  2. 如果只有一个参数小括号可以省略
    右边
  3. 如果方法体只有一条语句,则大括号可省略;
  4. 如果只有 return 语句,则 return 可以省
  5. :: 调用方法,创建对象
    Java 内部类,Lambda表达式 ⑦_第6张图片

接口和抽象类的区别

  • 类是定义对象的模板(所有对象) 接口定义规范(**不同类型的对象 **)
  • 抽象类不可以多继承, 接口可以多实现 (** 单继承.多实现**)
  • 抽象类里面的变量是普通变量.接口是由 public, static,final修饰
  • 抽象类可以定于抽象方法,由 abstract 修饰,也可以定义普通方法;接口在JDK1.8之前只能定义抽象方法,在之后可以定义普通方法,但是只能用 defaultstatic 并且默认是public修饰的.
  • 抽象类里有构造方法,但是接口里面没有构造方法
  • 抽象类里可以定义,而接口不可以.
    Java 内部类,Lambda表达式 ⑦_第7张图片

函数式接口

概述:确保接口中有且只有一个抽象方法,但是可以有多个普通方法。
语法:@FunctionalInterface 修饰的接口

内存管理

堆内存

JVM自动分配内存,内存由垃圾回收器清理. 不是在对象不用的时候马上回收.

原理:

垃圾回收: 判断是否为Null,或是否被引用.

内存溢出:

创建对象时,内存不够用了.

内存泄漏:

对象使用完成,没有被垃圾回收. (可能导致内存溢出)

ATM模拟

Java 内部类,Lambda表达式 ⑦_第8张图片

系统功能概述:
ATM读入银行卡,进行判断银行卡的属性,因为不同系统的银行,对应的界面和相对的功能也不一样,但对于公共的功能:比如查询、存钱、取钱、退出系统这些就可以抽象出一个公共的类(抽象类UnionCard),而对于BOC能交水费,ICBC能交话费,需要通过实现接口来完成功能,ATM完成插卡,接受用户输入和一系列提示,输出功能。

系统的逻辑实现

  1. 针对一个银行实现:以BOC为例。

第一步: 完成抽象类UnionCard
成员变量:卡号,密码,余额 (私有成员变量)
子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的
成员方法:存钱,取钱,(单纯的完成数据的运算,提示不在这里完成)检查密码
构造方法:全餐构造方法。
第二步:子类继承抽象类
第三步:定义PayTelMoney、payWaterMoney接口(只有一个抽象方法,可用lambda表达式实现)
第四步:完成ATM类实现
ATM与银行卡交互,所以类中要有UnionCard的引用。完成 存,取等操作,通过判断银行卡账户类型,进入对应系统的分支,根据所示菜单进行功能实现,
第五步:测试类(mainClass),入口函数

 其他银行以此类推.

你可能感兴趣的:(Java 内部类,Lambda表达式 ⑦)