其实是在学习Lambda表达式过程中对于接口作为方法参数的使用产生了一些疑问,在这里记下:
1 /** 2 * Created by BoGummyYoung on 2017/2/20. 3 * 示范Lambda表达式的几种简化写法 4 */ 5 interface Eatable 6 { 7 void taste(); 8 } 9 interface Flyable 10 { 11 void fly(String weather); 12 } 13 interface Addable 14 { 15 int add(int a, int b); 16 } 17 public class LambdaQS 18 { 19 //调用该方法需要Eatable对象 20 public void eat(Eatable e) 21 { 22 System.out.println(e); 23 e.taste(); 24 } 25 //调用该方法需要Flyable对象 26 public void drive(Flyable f) 27 { 28 System.out.println("我正在驾驶:" + f); 29 f.fly("【碧空如洗的晴日】"); 30 } 31 //调用该方法需要Addable对象 32 public void test(Addable add) 33 { 34 System.out.println("5 与 3的和为:" + add.add(5,3)); 35 } 36 public static void main(String[] args) 37 { 38 LambdaQS lq = new LambdaQS(); 39 //Lambda表达式的代码块只有一条语句,可以省略花括号 40 lq.eat(() -> System.out.println("苹果的味道不错!")); 41 //Lambda表达式的形参列表只有一个形参,可以省略圆括号 42 lq.drive(weather -> 43 { 44 System.out.println("今天的天气是:" + weather); 45 System.out.println("直升机飞行平稳"); 46 }); 47 lq.drive(new Flyable(){ 48 49 @Override 50 public void fly(String weather) { 51 System.out.println("今天的天气是:" + weather); 52 System.out.println("直升机飞行平稳"); 53 } 54 }); 55 //Lambda表达式的代码块只有一条语句,可以省略花括号 56 //代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字 57 lq.test((a , b) -> a+b); 58 } 59 }
此处的运行结果:
Q:关于重写方法里面的weather和drive方法里的f.fly("【碧空如洗的晴日】");定义的weather关系。
A:首先,drive方法里面接受一个Flyable类型的参数f,然后执行的f.fly方法,但是这个fly方法具体要执行的内容,就是重写的内容。
还是直接贴图方便。
总结一下就是weather在drive中调用f.fly方法的时候已经定义,而这个fly方法要实现就要在调用drive方法的时候重写,此时的重写不会改变weather的值,默认即是在drive中定义的weather的值。
除非重新再调用drive的时候定义weather的值,才会改变weather的值,如下:
lq.drive(new Flyable(){ @Override public void fly(String weather) { weather = "我是改了的天气"; System.out.println("今天的天气是:" + weather); System.out.println("直升机飞行平稳"); } });
这时的运行结果为: