匿名内部类:
- 匿名内部类:是一种特殊的局部内部类
- 特点:
(1) 匿名内部类的定义必须继承一个父类或是实现一个接口
(2) 匿名内部类的定义和对象的创建一起完成;并且基于一个匿名内部类只能创建该类的一个对象 - 语法:
interface IA{
void m1();
void m2();
}
// 匿名内部类实现一个接口
IA ia = new IA(){
public void m1(){ // 方法实现的部分 }
public void m2(){ // 方法实现的部分 }
};
- 匿名内部类的优缺点:
(1) 缺点:可读性不高
(2) 优点:减少代码量,提高编码效率
public class TestAnonymousInner {
public static void main(String[] args) {
// 匿名内部类
IA ia=new IA() {
public void m1() {
System.out.println("匿名内部类覆盖了m1方法");
}
};
ia.m1();
ia.m1();
// 继承一个父类定义一个匿名内部类
ClassD cd = new ClassD() {
public void m1() {
System.out.println("子类覆盖了m1方法.....");
}
};
cd.m1();
cd.m2();
test(new IA(){
public void m1(){
System.out.println("实现部分...");
}
});
}
public static void test(IA ia){
ia.m1();
}
}
interface IA{
void m1();
}
class ClassD{
public void m1() {
System.out.println("父类中m1方法");
}
public void m2() {
System.out.println("父类中m2方法....");
}
}
Lambda 表达式(JDK8.0开始有的应用)
1.Lambda表达式:实现函数式接口并完成对象的创建,是匿
名内部类的简化形式。
2. 应用场景:当接口中只有一个抽象方法时(静态方法、默认方法不在其中)
- 语法
(1) 无参数、没有返回值
a. 语法结构:接口名 引用 = () -> {// 方法实现部分};
b. 注意:当 {}中只有一行语句时,{}可以省略,但是不建议。
public class TestAnonymousInner3 {
public static void main(String[] args) {
IC ic = () -> {
System.out.println("这是方法实现部分...");
};
ic.mc();
}
}
interface IC{
void mc();
}
(2) 带有参数、没有返回值
a. 语法结构:接口名 引用 = (数据类型 变量名,数据类型 变
量) ->{// 方法实现部分 };
b. 注意:Lambda表达式形参列表的数据类型可以省略,
编译器自行推断。
public class TestAnonymousInner3 {
public static void main(String[] args) {
ID id = (a, s) ->{
System.out.println("a="+a);
System.out.println("s="+s);
};
id.md(2, "小龙");
}
}
interface ID{
void md(int a,String str);
}
(3) 带有返回值:
a. 语法结构:接口名 引用名 = (形参列表)->{ returnxxx; };
b. 注意:如果{}中只有一条 return 语句,return语句和{}
可以一起省略。
public class TestAnonymousInner3 {
public static void main(String[] args) {
IE ie = (int a,int b) -> {
return a+b;
};
System.out.println(ie.me(3, 5));
// 如果Lambda{}实现中只有 return 语句
IE ie2 = (int a,int b) -> a+b;
System.out.println(ie2.me(3, 5));
}
}
interface IE{
int me(int a,int b);
}