第八章接口与Lambda表达式(甘琳凤)

一:课前学习与自测
(1)定义一个接口使用的关键字是 interface
(2)接口中抽象方法的默认修饰符为 publicabstract
(3)接口中常用的默认修饰符为 publicstaticfinal
(4)接口中可以包含常量和抽象方法的定义,还可以包含 静态方法default修饰的成员方法
(5)一个类实现一个接口使用的关键字是 implements 。类可同时实现多个接口吗? 可以,一个类可以实现多个接口,一个接口可以有多个实现
(6)一个接口继承另一个接口使用的关键字是 extends 。接口可以多继承吗? 可以,一个接口可以extends多个接口 。
在这里插入图片描述
(7)接口中定义的静态方法能被子接口或实现类继承吗? 不能 。默认方法能被子接口或实现类继承吗?
(8)若要使一个类的两个实例能够比较大小,这个类应该实现 Comparable 接口
(9)如果一个接口仅包含一个抽象方法,该接口称为 函数式接口(单抽象方法接口) 。
(10)有一个Lambda表达式,(a,b)->a.compareTo(b),它是实现哪个接口的匿名内部类的实例? Comparable接口
(11)给出函数式接口Predicate所定义的抽象方法的格式

@FunctionalInterface
public interface Predicate<T>{
boolean test(T t);

(12)方法引用使用的运算符是 双冒号(::)

编程题:
1、编写程序证明接口的静态方法不能被子接口继承,也不能被实现类继承。接口的默认方法可以被子接口和子类继承。
代码如下:

package ggllff;
public class TTest {
	    public static void main(String[] args) {
	        A_TestClass my_a_test = new A_TestClass();
	        my_a_test.A_method_a();
	        my_a_test.A_method_b();
//	        my_a_test.A_method_c();

	        B_TestClass my_b_test = new B_TestClass();
	        my_b_test.A_method_a();
	        my_b_test.A_method_b();
	        my_b_test.B_method_a();
	        my_b_test.B_method_b();
	    }
	    // A接口
	    public interface A {
	        // 空方法
	        void A_method_a();
	        // 默认方法
	        default void A_method_b() {
	            System.out.println("这是A接口的默认方法A_method_b");
	        }
	        // 静态方法
	        static void A_method_c() {
	            System.out.println("这是A接口的静态方法A_method_c");
	        }
	    }
	    // B接口,继承A接口
	    public interface B extends A {
	        // 空方法
	        void B_method_a();
	        // 默认方法
	        default void B_method_b() {
	            System.out.println("这是B接口的默认方法B_method_b");
	        }
	        // 静态方法
	        static void B_method_c() {
	            System.out.println("这是A接口的静态方法B_method_c");
	        }

	    }
	    // 实现A接口
	    public static class A_TestClass implements A {
	        @Override
	        public void A_method_a() {
	            System.out.println("这是继承A接口类的方法");
	        }
	    }
	    // 继承B接口类
	    public static class B_TestClass implements B {
	        @Override
	        public void A_method_a() {
	            System.out.println("这是继承B接口类的A_method_a方法");
	        }

	        @Override
	        public void B_method_a() {
	            System.out.println("这是继承B接口类的B_method_a方法");
	        }

//	        @Override
//	        public void B_method_c() {
	
//	        }
	    }
}

在这里插入图片描述在这里插入图片描述会出错
接口的静态方法不能被子接口继承,也不能被实现类继承。接口的默认方法可以被子接口和子类继承。

2、(1)定义一个函数式接口Calculator,它包含单一的calculate()抽象方法,另外还包含两个默认方法,定义如下:

@FunctionalInterface
public interface Calculator{
 public abstract double calculate(int a,int b);
 public default int subtract(int a, int b){
          return a –b ;
}
public default int add(int a,int b){
  return a + b;
}
}

编写程序,使用Lambda表达式实现calculate()方法,使该方法可以计算a^ 2+b^2
代码如下:

package ggllff;
@FunctionalInterface
public interface Calculator{
	    public abstract double calculate(int a,int b);
	    public default int subtract(int a, int b){
	          return a-b ;
	    }
	    public default int add(int a,int b){
	        return a + b;
	    }
	    public static int app(int a,int b) {
	    	return a*a+b*b;
	    }
	}
package ggllff;

public abstract class Lio implements Calculator {
	public static void main(String[] args) {
		 getProduct(7,5,(a,b)->a*a+b*b);
	}
	public static void getProduct(int a,int b,Calculator calculator){
		int product = Calculator.app(a,b);
        System.out.println(product);
   }
}

运行结果如下:
在这里插入图片描述
我个人觉得这一题的上面的方法比较好。下面是另外一种,只是有些代码不同。

package ggllff;

@FunctionalInterface
public interface Calculator{
      public abstract double calculate(int a,int b);
       public static int subtract(int a, int b){
          return a-b ;
}
public static int add(int a,int b){
  return a + b;
}
}
package ggllff;
public abstract class Animal implements Calculator{
	public static void main(String[] args) {
		getProduct(7,5);
	}
	public static void getProduct(int a,int b){
        int product = Calculator.subtract(a,b);
        int product2 = Calculator.add(a,b);
        int c=product+product2;
        int d=product2-product;
        System.out.println((c*product+d*product2)/2);}
}

运行结果还是一样的。

补充一些在Lambda表达式中的点:
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。
Lambda表达式的语法
基本语法:
(parameters) -> expression

(parameters) ->{ statements; }

下面是Java Lambda表达式的简单例子:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

使用 Lambda 表达式需要注意以下两点:
1:Lambda 表达式主要用来定义行内执行的方法类型接口。
2:Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值