coreJava 接口-lambda-内部类

接口(interface)

接口中的所有方法自动地属于public,接口绝不能含有实例域,在JavaSE8之前,也不能在接口中实现方法

Arrays类中的sort方法承诺可以对对象数组进行排序,但要求满足下列前提:对象所属的类必须实现了Comparable接口
这不符合“反对称”的规则。如果x是一个Employee对象,y是一个Manager对象,调用x.compareTo(y)不会抛出异常,它只是将x和y都作为雇员进行比较。但是反过来,y.compareTo(x)将会抛出一个ClassCastException:这种情况与第5章中讨论的equals方法一样,(双方都不满足).如果子类之间的比较含义不一样,那就属于不同类对象的非法比较。每个compareTo方法都应该在开始时进行下列检测:if(getClassO!=other.getClass())thrownewClassCastExceptionO;

接口的特性
接口不是类,尤其不能使用new运算符实例化一个接口,但可以声明接口的变量
可以使用instanceof检查一个对象是否实现了某个特定的接口:if(anObjectinstanceofComparable){...}
与可以建立类的继承关系一样,接口也可以被扩展。public interface Powered extends Moveable
虽然在接口中不能包含实例域或静态方法,但却可以包含常量。

在JavaSE8中,允许在接口中增加静态方法。理论上讲,没有任何理由认为这是不合法的。只是这有违于将接口作为抽象规范的初衷。目前为止,通常的做法都是将静态方法放在伴随类中。在标准库中,你会看到成对出现的接口和实用工具类,如Collection/Collections或Path/Paths。

可以为接口方法提供一个默认实现。必须用default修饰符标记这样一个方法。(主要是用在接口方法的扩张)

解决默认方法冲突
1)超类优先。如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。
2)接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突。

Cloneable

在Object类中,clone方法被声明为protected.
protected关键字的深入理解
1.protected访问控制符能被用于方法和成员变量。
2.声明为protected的方法和成员变量能被同一个包里的所有类所访问,就像默认修饰符package一样。
3.能被该类的子类所访问,子类可以和父类不在一个包中。
protected是可以再子孙类用,但是不能跨包。你类b是类a的子类,那么可以引用K,但是MainTest跟a毫无关系可以言,所以肯定就不能引用k,甚至编译肯定不通过(其实就是调用跟超类不在同一包).可参考:https://blog.csdn.net/yeohcooller/article/details/7376722

Cloneable接口是Java提供的一组标记接口(tagging interface 标记接口不包含任何方法;它唯一的作用就是允许在类型查询中使用instance of)之一。对象对于克隆很“偏执”,如果一个对象请求克隆,但没有implements Cloneable个接口,就会生成一个受査异常java.lang.CloneNotSupportedException

Comparator

对一个对象数组排序,前提是这些对象是实现了Comparable接口的类的实例,例如可以对一个字符串数组排序,因为String类实现了Comparable<String>,而且String.compareTo方法可以按字典顺序比较字符串。现在假设我们希望按长度递增的顺序对字符串进行排序,而不是按字典顺序进行排序。肯定不能让String类用两种不同的方式实现compareTo方法,更何况,String类也不应由我们来修改。要处理这种情况,ArrayS.Sort方法还有第二个版本,有一个数组和一个比较器(comparator)作为参数,比较器是实现了Comparator接口的类的实例。
public interface Comparators
{
intcompare(T first,T second);
}
要按长度比较字符串,可以如下定义一个实现Comparator<String>的类:
Class LengthComparator implements Comparator<String>
{
public int compare(Stringfirst,Stringsecond){
return first.length()-second.length();
}
}
具体完成比较时,需要建立一个实例(也可以建立匿名内部类的方式):
Comparator<String> comp = new LengthComparator();
if(conp.compare(words[i],words[j])>0)...
将这个调用与words[i].compareTo(words[j])做比较。这个compare方法要在比较器对象上调用,而不是在字符串本身上调用。
String[]friends={"Peter","Paul","Mary"};
Arrays,sort(friends,new LengthComparator()):
Comparable与Comparator比较:https://blog.csdn.net/bitcarmanlee/article/details/73381705

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

 

lambda(希腊字母λ)表达式

这是这些年来Java语言最让人激动的一个变化.lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。(参数,箭头(->)以及一个表达式)

即使lambda表达式没有参数,仍然要提供空括号就像无参数方法一样
如果可以推导出一个lambda表达式的参数类型,则可以忽略其类型。
如果方法只有一参数,而且这个参数的类型可以推导得出,那么甚至还可以省略小括号:
如果一个lambda表达式只在某些分支返回一个值,而在另外一些分支不返回值,这是不合法的。例如,(intx)->{if(x>=0)return1;}就不合法

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口(functional interface 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口)。在JavaSE8中,接口可以声明非抽象方法

函数式接口可以被隐式转换为lambda表达式

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值