Java接口、lambda表达式与内部类
接口:
接口可以看成是没有实例域的抽象类。
定义接口的两个步骤:
1 将类声明为实现给定的接口
2 使用关键字implements
class Employee implements Comparable
某个类实现一个compareTo方法:通过对比薪酬来对比两个员工。这里要实现Comparable接口就必须要实现compareTo方法。
class Employee implements Comparable
{
public int compareTo(Employee other)
{
return Double.compare(salary,other.salary);
}
}
注意:
1 不能用new来实例化一个接口
2 可以使用instanceof检查一个对象是否属于一个类
if (anOther instanceof Comparable)
3 接口中的方法被自动设置为public,接口中的域被自动设为public static final
4 每个类只能拥有一个超类,但是可以实现多个接口
5 当接口命名与超类命名冲突时,优先考虑超类。
克隆
A a = new a();
A b = a;
此时b改变a也会改变(类似指针,地址相同)
A b = a.clone();此时b改变 a不会变。
上述为浅拷贝,深拷贝则需要对类中每一个域拷贝
lambda表达式
lambda表达式可以转换为接口,或者是进行方法引用
如:
Arrays.sort(words,(first,second) -> first.length() - second.length());
方法引用则:
Timer t = new Timer(1000,System.out::println)
等价于
Timer t = new Timer(1000, event -> System.out.println(event))
注意:
出于并发安全性的考虑,lambda表达式捕获的变量实际上是最终变量,就是不能:
for…{
i–
ActionListener listener = event ->
{
System.out.println(i + “:” + test);
};
}
对于lambda代码执行的各种要求,p240
构造器引用
就是方法名为new
Person [] people = stream.toArray(Person[]::new);
上面代表 用户希望得到一个Person引用数组
内部类
主要有三点原因:
内部类方法可以访问该类定义所在作用域的数据,包括私有
内部类可以对于同一个包中其他类隐藏
需要定义一个回调函数(回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。例如个程序员和一个项目经理,XX项目经理向程序员安排任务让程序员去完成,程序员获得任务并记下是XX项目经理安排的任务,程序员将任务完成后,获取通知XX项目经理的方式,发送一条信息通知项目经理任务已经完成。)且不想写大量代码
注意:
内部类可以直接访问外围类中的数据(外围类outer)
在外围类作用域之外,可以这样引用内部类:OuterClass.InnerClass
局部内部类
不用public跟private进行声明,作用域被限定在声明的局部类的块中
由于局部方法只能引用定义为final的局部变量
所以当变量需要改变的时候 可以定义一个长度为1的数组
匿名内部类:只创建这个类的一个对象,可以不命名。
如
其中两个大括号内的内容为匿名内部类
静态内部类:
只是把一个类隐藏在另一个类的内部,内部类并不需要引用外部类,为此将内部类定义为static,以取消产生的应用。