从官方文档中描述:Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.理解:
1、首先匿名内部存在的目的是为了让代码简洁
2、你可以在声明一个类的时候同时实力化这个类
3、他与局部类一样但是没有类名
4、如果某个局部类只需要使用一次,那么你可以使用匿名内部类
使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
Show me the code ,如下代码来说明匿名内部类:
(1)通常没有使用匿名内部类的方式,这里用一个局部类实现了接口,然后实例化这个类,从而调用这个类
public class HelloWorldAnonymousClasses {
//定义了一个接口
interface IHello {
public void say();
}
public void sayHello() {
//实现这个接口
class HelloWorld implements IHello {
String name = "world";
public void say() {
System.out.println("Hello " + name);
}
}
IHello helloWorld = new HelloWorld();
helloWorld.say();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp =
new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
结果:
Hello world
Process finished with exit code 0
(2)使用匿名内部类的方式,这里匿名类实现了IHello接口,同时做了一个实例化了
public class HelloWorldAnonymousClasses {
//定义了一个接口
interface IHello {
public void say();
}
public void sayHello() {
IHello helloWorld = new IHello() {
String name = "world";
@Override
public void say() {
System.out.println("Hello " + name);
}
};
helloWorld.say();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp =
new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
结果一样:
Hello world
Process finished with exit code 0
这样书写是否很干净简洁!
(3)注意这里匿名内部类同样也可以实例化一个抽象类的抽象方法
public class HelloWorldAnonymousClasses {
//定义了一个接口
abstract class IHello {
public abstract void say();
}
public void sayHello() {
IHello helloWorld = new IHello() {
String name = "world";
@Override
public void say() {
System.out.println("Hello " + name);
}
};
helloWorld.say();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp =
new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
结果一样:
Hello world
Process finished with exit code 0
(4)最后需要注意的一点就是:如果函数接口只有一个抽象方法的接口,可以用作Lambda表达式类型。采用Lambda表达式更加简洁!
Show me the code:
public class HelloWorldAnonymousClasses {
//定义了一个接口
interface IHello {
public void say();
}
public void sayHello() {
IHello helloWorld =()-> {
String name = "world";
System.out.println("Hello " + name);
};
helloWorld.say();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp =
new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
结果:
Hello world
Process finished with exit code 0