接口、lambda、内部类

接口

Comparable接口

  • compareTo(T other)要与equels()方法一致
  • Arrays.sort()可以传入实现了comparable接口的对象数组,也可以一个数组,加上自定义的比较器comparator

接口方法、超类方法冲突

  • 类优先
  • 接口方法与超类方法冲突,优先超类方法
  • 两个接口的方法冲突,只要有一个有默认实现,则实现类需要自行选择

cloneable接口

  • cloneable接口是一个标记接口,没有定义方法,只是标记为可以提供clone方法
  • Object类提供的clone方法权限是受保护的,不能在其他类中调用,必须重写clone方法再将权限改为public
  • clone要注意浅拷贝和深拷贝

lambda表达式

lambda表达式定义

  • 没有方法参数时用 ()
  • 参数类型可以通过上下文推导出时可以省略,单个参数时可以省略()
  • 不需要写返回类型,根据上下文自动推导
  • 单行表达式可以省略 {}和 return
  • 参数与方法体之间用 -> 连接

函数式接口

  • 只有一个抽象方法的接口
  • 可以用lambda表达式来传入函数式接口参数
  • 将一个lambda表达式赋值给函数时接口实例时,就是自动创建一个实现接口的实例,并用lambda表达式来覆盖抽象方法

方法引用

  • 对象/类::方法名
  • object::instanceMethod ,等价于向方法传递参数的lambda表达式。 类似与 System.out::println 对应表达式为 x -> System.out.println(x)
  • Class::instanceMethod ,第一个参数会成为方法的隐式参数。类似于 String::compareToIgnoreCase 对应表达式为 (x,y) -> x.compareToIgnoreCase(y)
  • class::staticMethod , 所有参数传递到静态方法, Math::pow 对应表达式 (x,y) -> Math.pow(x,y)

构造器引用

  • 类名::new
  • 一个类有多个构造方法,会根据上下文参数选择对应的构造器
  • java无法创建泛型类型数组,数组构造器引用可以解决这个问题,配合stream的toArray方法来实现:例 Person[] people = stream.toArray(Person[]::new)

lambda表达式变量作用域

  • lambda表达式分为三个部分
    1. 一个代码块
    2. 参数
    3. 自由变量的值,这是指非参数而且不在代码中定义的变量
  • lambda表达式的代码块和自由变量值就像其他语言的闭包
  • lambda捕获外围作用域变量值的限制
    1. 只能引用值不会改变的变量
    2. 不能在代码块中对变量值进行更改(如果可以更改,并发执行多个动作时就会不安全)
    3. 引用的变量在外部不能改变,必须是事实最终变量(初始化之后不会再赋新值)
    4. lambda表达式的代码块与外围嵌套快有相同的作用域。参数名和局部变量名不能与外部冲突
    5. lambda表达式中this关键之指代的是创建这个表达式的方法的this参数

处理lambda表达式

  • lambda的重点是延迟执行。如:
    1. 在一个单独的线程中运行代码
    2. 多次运行代码
    3. 在算法的适当位置运行代码(例如排序中的比较操作)
    4. 发生某种情况时执行代码
    5. 只在必要时运行代码
  • 常用函数时接口
  • 基本类型的特殊函数式接口

内部类

内部类好处

  • 可以对同一个包中的其他类隐藏
  • 内部类方法可以访问外部类的数据,包括私有数据

内部类特殊语法

  • 内部类引用外部类语法:OuterClass.this
  • 外部类之外访问内部类:OuterClass.InnerClass
  • 内部类中声明的所有静态字段必须是final,并初始化为一个编译时常量
  • 内部类不能有static方法

方法内部类

  • 声明类时不能有访问修饰符
  • 对外部事件完全隐藏,只有该方法可以访问
  • 内部类可以访问外部方法的局部变量,这些变量必须是事实最终变量
  • 外部方法中的局部变量,在编译时,会传递给内部类构造方法,创建对应的实例变量

匿名内部类

  • 没有类名
  • 没有构造方法,构造参数传递给超类构造器,实现接口不能有构造参数
  • 可以有构造代码块

静态内部类

  • 内部类不需要访问外部类对象时,就应该使用static内部类
  • 可以有静态字段和方法
  • 接口中声明的类自动静态内部类
posted @   扣jio大汉子  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示