lamda表达式与匿名内部类

三楚雄风 2015-06-26 09:05:17
public interface Runnable {
public abstract void run();
}
这是一个函数式接口,可以用lamda表达式创建一个对象
Runnable r = () -> {
for(int i = 0 ; i < 100 ; i ++)
{
System.out.println();
}
};
那么,在for循环前面能定义一个变量 private int a=10;吗?
函数式接口用lamda表达式除了能实现其抽象方法,能不能定义一个变量。

同理在匿名内部类实现一个接口或继承一个类。匿名内部类除了实现父类的抽象方法外,可以重写父类非抽象方法吗?
...全文
178 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
finemi 2015-06-27
  • 打赏
  • 举报
回复
引用 4 楼 Jutland 的回复:
对。 ()->{ //这是实现了某接口或继承某类的一个类的一个方法体 } new Runnable(){ //这是实现了Runnable接口的一个类 }
三楚雄风 2015-06-27
  • 打赏
  • 举报
回复
引用 2 楼 finemi 的回复:
用匿名内部类时都可以了,匿名内部类就相当于继承类或者实现接口没区别,只不过不能定义构造方法,因为该类没名字~
可以这么理解吗,由于匿名内部类可以写出类体部分(里面的方法都是有名的),因此可以定义实例变量以类变量。但是lamda表达式是一个匿名方法,所以定义的变量都是方法局部变量。 例如:ta.test(new Product() { public double getPrice() { return 567.8; } public String getName() { return "AGP显卡"; } }); 这里用到匿名内部类,父类的抽象方法getPrice(), getName()在这里重写了,可以清楚的看到方法体。因此可以在这个匿名内部类里面定义实例变量:在public double getPrice()方法前可以定义private int i=1; 但是lamda表达式()->{}则整个是一个方法体,因此定义的变量就是方法的局部变量。
三楚雄风 2015-06-27
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
那么,在for循环前面能定义一个变量 private int a=10;吗? 不可以,因为这里就是一个函数的实现,函数里不能用 private 等定义变量。
就是说用lamda表达式创建一个函数式接口的子类对象,在子类里面只能重写接口的方法,不能在子类里面定义一个实例变量或者类变量?
finemi 2015-06-26
  • 打赏
  • 举报
回复
用匿名内部类时都可以了,匿名内部类就相当于继承类或者实现接口没区别,只不过不能定义构造方法,因为该类没名字~
Inhibitory 2015-06-26
  • 打赏
  • 举报
回复
那么,在for循环前面能定义一个变量 private int a=10;吗? 不可以,因为这里就是一个函数的实现,函数里不能用 private 等定义变量。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧