6.1.1 接口概念
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。
类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口绝不能含有实例域, 在 JavaSE 8之前, 也不能在接口中实现方法。
6.1.2 接口的特性
不能new实例化一个接口,但可以声明接口的变量:x = new Comparable(...);
接口变量必须印用实现了接口的类的对象x = new Employee(...);
接口中不能包含实例域或静态方法,但可以包含常量。
与接口中的方法都自动地被设置为 public—样,接口中的域将被自动设为 public static final。
6.1.3 接口与抽象类
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
注:JDK 1.8 以后,接口里可以有静态方法和方法体了
6.3.1 为何引入lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
6.3.2 labmda表达式的语法
一种形式:参数, 箭头(->) 以及一个表达式。如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,把这些代码放在 {}中, 并包含显式的 return语句。例如:
(String first, String second) ->
{
if (first.length() < second.length()) return -1 ;
else if (first.lengthO()> second.length()) return 1 ;
else return 0;
}
即使 lambda 表达式没有参数, 仍然要提供空括号,就像无参数方法一样:
() -> { for (inti = 100;i >= 0;i ) System.out.println(i); }
如果可以推导出一个 lambda 表达式的参数类型,则可以忽略其类型。例如:
Comparator<String> comp = (first, second) // Same as (String first, String second)
->first.length() - second.length();
如果方法只有一 参数, 而且这个参数的类型可以推导得出,那么甚至还可以省略小括号:
ActionListener listener = event
-> System.out.println("The time is " + new Date()");
// Instead of (event) -> . .. or (ActionEvent event) -> ...
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class LambdaTest {
public static void main(String[] args){
String[] planets = new String[]{"M","VU", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"};
System.out.println(Arrays.toString(planets));
Arrays.sort(planets);
System.out.println(Arrays.toString(planets));
Arrays.sort(planets, (f,s) -> f.length()-s.length());
System.out.println(Arrays.toString(planets));
Arrays.sort(planets, 0,7);
System.out.println(Arrays.toString(planets));
Timer t = new Timer(1000,event ->System.out.println(new Date()));
t.start();
JOptionPane.showMessageDialog(null,"quit");
System.exit(0);
}
}
6.4.1 内部类
在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
成员内部类
最普通的,一个类位于另一个类内部。成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
局部内部类
定义在一个方法或者一个作用域里面的类。访问仅限于方法内/作用域内。
匿名内部类
假如只创建这个类的一个对象,就不必命名了。这种类被称为匿名内部类。
public void start(int interval, boolean beep) {
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println("At the tone, the time is " + new Date());
if (beep) Toolkit.getDefaultToolkit().beep();
}
} ;
Timer t = new Timer(interval, listener);
t.start();
}
它的含义是:创建一个实现 ActionListener 接口的类的新对象,需要实现的方法 actionPerformed定义在括号{}内。
静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。