一:前言:
本篇文章讲解java的匿名内部类,匿名内部类,顾明思意,是一个没有显示名字的内部类,其实质是对内部类的简化写法,匿名内部类会隐式的实现一个接口或者继承一个类。
匿名内部类适合创建只使用一次的类,如果一个类只使用一次的话就无须使用平时常用的方法,如继承或者实现父类后,再去实例化对象,使用匿名内部类可以简化这个编程的过程,并且不会编译生成单独的.class文件。
二:匿名内部类的语法:
1:基础语法
new 类名/接口/抽象类(){
};
2:实现普通类的匿名内部类
public class TestAnonymous {
class FatherClass {
public void test(){
System.out.println("");
}
}
FatherClass fatherClass = new FatherClass (){
@Override
public void test(){
System.out.println("1234");
}
};
}
3:实现接口的匿名内部类
interface FatherInterface {
public void test();
}
FatherInterface fatherInterface = new FatherInterface() {
@Override
public void test() {
}
};
4:实现抽象类的匿名内部类
abstract class FatherAbstract {
public abstract void test();
}
FatherAbstract fatherAbstract = new FatherAbstract(){
@Override
public void test() {
}
};
三:匿名内部类和匿名对象
匿名内部类和匿名对象不是一回事,匿名对象是没有变量名的对象,语法如下所示:
new 类名(参数列表);
四:匿名内部类和Lambda表达式
java8 Lambdade表达式一个重要的功能就是与匿名内部类结合,简化匿名内部类的写法,但是不是所以后的匿名内部类都可以被Lambda所简化,符合要求的匿名内部类要符合函数接口的规定。
*函数式接口:使用@FunctionalInterface标识(非必须,建议使用,编译器会帮忙检查是否服务规范),表示有且只有一个抽象方法,但可以有多个非抽象方法
代码示例:
public class TestAnonymous {
/*
*/
public TestAnonymous(TestFunctionInterface testFunctionInterface, String a){
testFunctionInterface.doIt(a);
};
/*
*/
public TestAnonymous(TestFunctionInterface1 testFunctionInterface){
testFunctionInterface.doIt();
};
/*
java8 匿名内部类和函数接口的写法
*/
@FunctionalInterface
interface TestFunctionInterface{
void doIt(String a);
}
@FunctionalInterface
interface TestFunctionInterface1{
void doIt();
}
/*
java8 匿名内部类和函数接口的写法
*/
@FunctionalInterface
interface TestConsumer1{
void accept(String a);
}
public static void main (String[] args) {
//使用有参的函数接口
TestAnonymous testAnonymous = new TestAnonymous(
(x) -> {
System.out.println(x);
}
, "fdsfdsf53434334254");
//使用无参的函数接口
TestAnonymous testAnonymous1 = new TestAnonymous(
() -> {
System.out.println("");
});
}
}
示例中使用@FunctionalInterface标识的为两个函数式接口,main方法中使用两个接口的方式为java8Lambda使用函数接口的匿名内部类的简化写法。不使用java8Lambda的写法参考本文 二:匿名内部类的语法: