说实话啊,本来以为自己的匿名内部类学的还可以,可是在学习hashSet方法中重写了comparable函数式接口时,居然被这个匿名内部类,弄得自己一头雾水,真是恼火啊,自己又重新看了一遍,对它有了一定的理解了。
那就通过一个小例子来演示一遍吧,首先你得了解内部类,言简意赅就是在类之内再定义一个类,不同于子类。包含内部类的类被称为外部类。内部类有以下几个特点:
-》内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许通同一个包的其他类访问该类。
-》内部类成员可以直接访问外部类的私有数据。
-》***匿名内部类适合于创建那些仅需一次使用的类。也就是所谓的函数式接口。
-》外部类只能用public 或者包限制符,就是没有修饰符。而内部类可以使用private,protected,static修饰符。
匿名内部类的实现形式是:
new 接口()|父类构造器(实参列表){
//匿名内部类的类体部分
}
下面是一段程序,仿造买东西的过程。
package niming;
interface Food{
public double getPrice();
public String getName();
}
public class Buy {
public void say(Food f){
System.out.println(“购买了一个”+f.getName()+”,花掉了”+f.getPrice()+”块钱”);
}
public static void main(String[] args){
Buy buy=new Buy();
buy.say(new Food() {
@Override
public double getPrice() {
// TODO Auto-generated method stub
return 20;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "苹果";
}
});
}
}
这是一般的匿名内部类的编码方式,其实这个就很简单了,可是oracle就是觉得太麻烦了,于是在java8中又加入了lambda方法。这个lambda方法就是把带有函数式接口的接口,在实现其匿名内部类时,把能省的代码能省既省。所以你就会看到下面匿名内部类实现的部分变成下面这样(函数式接口:只有一个抽象方法的接口)下面通过一段程序来介绍lambda方法使用。
package Lambda;
interface Eatable{
void taste();//函数式接口
}
interface Flyable{
void fly(String wwather);
}
interface Addable{
int add(int a,int b);
}
public class LambdaQs {
public void eat(Eatable e){
System.out.println(e);
e.taste();
}
public void drive(Flyable f){
System.out.println(“我正在驾驶:”+f);
f.fly(“美好的晴天!”);
}
public void test(Addable add){
System.out.println(“5和3的和是:”+add.add(5, 3));
}
public static void main(String[] args) {
LambdaQs lQs=new LambdaQs();
lQs.eat(()->System.out.println(“苹果的味道不错!”));//1
lQs.drive(weather->{//2
System.out.println(“今天的天气是:”+weather);
System.out.println(“直升机飞行平稳!”);
lQs.test((a,b)->a+b);//3
});
}
}
1:在1处继承了Eatable接口的taste方法,方法体中没有形参,所以在lambda中就可以用()代替变成了()->,而且它省去重写方法这个步骤,让代码看起来更简便。
2:在2处有形参,故,这是就变成了(形参)->的形式。
3:在3处,省略了return语句,这是因为lambda表达式会在函数式接口中自己返回一个return语句。
其中就函数式接口,还有一些java自带的,主要就是Runnable,ActionListener,Function,以及Arrays方法。
例如java新增的paralleSort方法。
Arrays.parallelSort(arr1,(o1,o2)->o1.length()-o2.length());
这段代码的意思是返回字符串短的,就是排序,升序排序。