【笔记】Java核心技术卷1-第六章_接口、lambda表达式与内部类

6.1.1 接口概念

在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。

类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口绝不能含有实例域, 在 JavaSE 8之前, 也不能在接口中实现方法。

6.1.2 接口的特性

不能new实例化一个接口,但可以声明接口的变量:x = new Comparable(...);接口变量必须印用实现了接口的类的对象x = new Employee(...);

接口中不能包含实例域或静态方法,但可以包含常量。
与接口中的方法都自动地被设置为 public—样,接口中的域将被自动设为 public static final。

6.1.3 接口与抽象类

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

注: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成员变量或者方法。

猜你喜欢

转载自blog.csdn.net/Ethan_997/article/details/108431740