建设一个地方门户网站,推广app赚佣金平台,重庆网站外包,wordpress 个人公众号文章目录CH6.接口、lambda表达式与内部类1.接口基本2.常用接口3.lambda表达式4.内部类5.服务加载器与代理前章#xff1a;
第三章~第五章的学习笔记CH6.接口、lambda表达式与内部类
1.接口基本
接口基本——interface声明#xff0c;方法无需指明public#xff08;默认都是…
文章目录CH6.接口、lambda表达式与内部类1.接口基本2.常用接口3.lambda表达式4.内部类5.服务加载器与代理前章
第三章~第五章的学习笔记CH6.接口、lambda表达式与内部类
1.接口基本
接口基本——interface声明方法无需指明public默认都是public继承时使用implements关键字接口支持多继承。接口可以看做一个c中纯虚的抽象基类它代表的含义是继承自这个接口的类应该具有某些行为接口的函数而不在乎具体这些行为怎么实现的接口中不能包含实例字段但是可以包含常量字段也都是默认public接口可以继承接口接口中同样可以定义静态方法、私有方法不知道为什么这么做接口的方法可以有默认实现需要有关键字default——可以用于接口演化比如接口新增一个方法原来实现这个接口的类就编不过了如果新增的方法加default给一个默认的实现则原来的代码可以编过会使用这个新方法的默认实现同名函数冲突——类与接口中有同名函数同时继承自该类与该接口的类会“优先类”接口与接口有同名函数看继承者实现谁如果两个接口有一个有默认实现继承者必须定义同名函数可以通过接口名.super.同名方法指定调谁的实现因为类优先super含义就是父类因为单继承父类只可能有一个而父接口应该用接口名.super代表一种特殊的接口标记接口没有任何方法的接口只是作为标记作用使其子类可以使用instanceof判定是否有该标记如cloneable就是标记接口——每个类继承自Object都有Object.clone方法但是这个方法是protected的无法使用需要在子类中声明为public并调用super.clone的实现但是这样会抛出CloneNotSupportedException这是因为Object.clone的实现中判断了this instanceof Cloneable不是的话会抛出异常匿名接口——可以直接new一个接口然后在{}中写实现这个接口实现类是匿名的无法再生成该类的一个实例
2.常用接口
ComparableType或者Comparable——Array的比较要求比较的元素有实现该接口这也是函数式接口Cloneable——可克隆的接口Predicate——专门用来接受判断lambda表达式的函数式接口Supplier——供应者接口函数式接口有一个T get()函数用于懒加载如Object.requireNonNullElseGet(T,SupplierT)可以在传入T类型的参数为null时利用Supplier生成一个默认的实例为null的情况可能比较少所以传入一个将来要调的方法而不是传入一个实例以实现懒计算ComparatorT接口——用于比较其中的一些静态/成员方法用于生成Comparator如comparing,thenComparing,naturalOrdr,reverOrder,reversed等额外的一个小点Comparator中有两个抽象函数但是依然是函数式接口这是因为其中一个是从Object继承来的重写的equals函数接口也继承自Object类
3.lambda表达式 lambda表达式基本(参数列表)-{函数体}——当参数列表类型可以由接收的函数式接口推断出的话可以省略类型在此基础上如果还只有一个参数括号也可以省略如果函数体只有一个语句可以省略{} 与函数式接口的兼容lambda表达式可以赋值给一个函数式接口什么叫函数式接口——只有一个抽象函数的接口与函数式接口完全兼容大大拓展了lambda表达式的适用范围 方法引用等价于对应形式的lambda表达式也可以用函数式接口对象接收三种形式 object::instanceMethod(参数列表)-object.instanceMethod(参数列表);唯一不同的是方法引用会马上检测object是否为null,而对应的lambda表达式会等到调用时才检测object是否为nullClass::instanceMethod(Class类参数 self,参数列表)-self.instanceMethod(参数列表);Class::staticMethod(参数列表)-Class.staticMethod(参数列表); 构造器引用——与方法引用一样只不过方法名为new如object::new以及数组形式的构造器object[]::new调用的构造器重载版本根据具体场景推断 FunctionalInterface注解可以表明这个接口是函数式接口在向该接口增加抽象方法时会报错且javadoc中会标明这个接口是函数式接口 lambda表达式的捕获——无需像c一样写捕获列表直接捕获lambda表达式所在作用于变量即可值传递称为自由变量同时无法捕捉会变的变量
4.内部类
内部类——与c的内部类一样不过不同的是 java内部类初始化的时候会默认传入外部类的this指针使其可以访问创建它的外部类对象java内部类在外部类外面创建的话得加外部类的对象比如outClassObj.new InnerClass()而不能直接new OutClass.InnerClass 局部内部类——在函数内定义的类除了像一般内部类一样访问外部类的数据还可以访问函数的局部变量像lambda表达式一样捕获只能捕获事实不变量匿名内部类——如匿名接口实际也可以定义继承自普通非接口类的匿名子类匿名内部类没有构造函数可以通过初始化块来初始化数据–引申一个双括号初始化技巧静态内部类——加static标识
class OuterClass{public static class InnerClass{...}
}静态内部类才与c中的内部类相当;静态内部类不像一般内部类创建的时候不会传入外部类的对象指针;静态内部类也成为嵌套类构造时可以直接new OuterClass.InnerClass()构造与常规内部类不同静态内部类可以有静态字段和方法接口内部声明的内部类自动是static和public
5.服务加载器与代理
略。看不懂以后有机会再拜读