在 Java 中除了内部类之外,还有一种称为匿名内部类的概念,匿名内部类顾名思义就是指没有一个具体名称的类。
实例 1 代码:一个简单的操作
package self.learn.noinnerclass;
public interface A { // 定义接口 A
public void printInfo(); // 定义抽象方法
}
package self.learn.noinnerclass;
public interface A { // 定义接口 A
public void printInfo(); // 定义抽象方法
}
package self.learn.noinnerclass;
public class X { // 定义 X 类
public void fun1() { // 定义 fun1()方法
this.fun2(new B()); // 传递子类实例
}
public void fun2(A a) { // 定义 fun2()方法
a.printInfo(); // 调用接口方法
}
}
package self.learn.noinnerclass;
public class NoInnerClassDemo01 {
public static void main(String args[]) {
new X().fun1(); // 实例化 X 对象并调用 fun1() 方法
}
}
运行结果截图:
本程序应该很容易懂,但是现在如果接口实现类只使用一次的话,那么还有必要单独定义一个子类 B 吗?很明显是没有必要的,所以此时就可以使用匿名内部类完成,代码如下:
实例 2 代码:匿名内部类
package self.learn.noinnerclass;
public interface A { // 定义接口 A
public void printInfo(); // 定义抽象方法
}
package self.learn.noinnerclass;
public class X { // 定义 X 类
public void fun1() { // 定义 fun1()方法
this.fun2(new A() { // 匿名内部类
public void printInfo() { // 实现接口中的抽象方法
System.out.println("Java is interesting!");
}
});
}
public void fun2(A a) { // 定义 fun2()方法
a.printInfo(); // 调用接口方法
}
}
package self.learn.noinnerclass;
public class NoInnerClassDemo01 {
public static void main(String args[]) {
new X().fun1(); // 实例化 X 对象并调用 fun1() 方法
}
}
运行结果截图:
(1)直接实例化接口对象,代码如下:
new A(){}
此时,是直接为接口实例化的,根据接口概念可知道,接口本身是不能实例化的,所以在接口实例化之后要有一个大括号,用于实现接口中的抽象方法。
(2)实现抽象方法,代码如下:
new A() { // 匿名内部类
public void printInfo() { // 实现接口中的抽象方法
System.out.println("Java is interesting!");
}
整个代码编写完成之后,实际上就是一个接口的实例化对象,里面的抽象方法也实现了。