Skip to content

匿名内部类

内部类 指的是在一个类的内部定义了另外的类结构,利用内部类可以方便地实现私有属性的互相访问,但是内部类需要明确地使用 class 进行定义。而匿名内部类的是没有名字的内部类,其必须在抽象类或接口基础上才可以定义。下面首先来为读者分析为什么需要有匿名内部类的定义。

java
interface Message {							// 定义接口
	public void print();
}
class MessageImpl implements Message {		// 定义实现子类
	public void print() {
		System.out.println("Hello World !");
	}
}
public class TestDemo {
	public static void main(String args[]) {
		fun(new MessageImpl());				// 传递子类实例化对象
	}
	public static void fun(Message msg) {		// 接收接口对象
		msg.print();
	}
}
interface Message {							// 定义接口
	public void print();
}
class MessageImpl implements Message {		// 定义实现子类
	public void print() {
		System.out.println("Hello World !");
	}
}
public class TestDemo {
	public static void main(String args[]) {
		fun(new MessageImpl());				// 传递子类实例化对象
	}
	public static void fun(Message msg) {		// 接收接口对象
		msg.print();
	}
}

本程序是一个标准的子类实例化接口操作的程序,首先在主方法中实例化 Messagelmpl 子类,然后将实例化对象传递到 fun() 方法中,在 fun() 方法中利用接口对象调用 print() 方法。但是现在有一个问题出现了,假设 Messagelmpl 这个子类只使用一次,那么还有必要将其定义为一个具体的类吗?很明显,答案一定是不将其定义为类,这时就可以 **利用匿名内部类的方式来进行简化 ** 。

java
interface Message {							// 定义接口
	public void print();
}
public class TestDemo {
	public static void main(String args[]) {
		fun(new Message() {					// 直接实例化接口对象
			public void print() {				// 匿名内部类中覆写print()方法
				System.out.println("Hello World !");
			}
		}); 									// 传递匿名内部类实例化
	}
	public static void fun(Message msg) {	// 接收接口对象
		msg.print();
	}
}
interface Message {							// 定义接口
	public void print();
}
public class TestDemo {
	public static void main(String args[]) {
		fun(new Message() {					// 直接实例化接口对象
			public void print() {				// 匿名内部类中覆写print()方法
				System.out.println("Hello World !");
			}
		}); 									// 传递匿名内部类实例化
	}
	public static void fun(Message msg) {	// 接收接口对象
		msg.print();
	}
}

本程序利用匿名内部类的的概念简化了 Message 接口子类的定义,在主方法调用 fun() 方法时,直接实例化了接口对象,但是由于接口中包含抽象方法,所以需要同时覆写接口中的抽象方法才可以正常完成,此时虽然节约了子类,但是带来的效果却是结构混乱。

关于 JDK1.8 及以前版本的问题

匿名内部类或者是普通内部类,在 JDK1.8 以前,如果要想访问方法中定义的参数或者是变量,就必须加上 final 关键字,而 JDK1.8 之后,为了便于 Lambda 表达式的操作,就没有严格要求。

用心去做高质量的编程学习内容网站,欢迎star ⭐让更多人发现!