java笔记 -- 匿名内部类

接口到底能不能被实例化

首先,答案可定是不能的,想必大家在很多参考资料中都有看到。但是有时候我们能看到这样的代码如下:

Comparator<Integer> aComparator = new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				return o1.compareTo(o2);
			}
		};

使用过比较器的小伙伴可能知道,Comparator是一个我们常用的比较器用来对一个list 进行排序等。可是Comparator不是一个接口吗?为什么在这里实例化了呢?

事实上,这里并不是被实例化了,而是使用到了匿名内部类。那么下面我们来看看到底什么是匿名内部类,它有什么作用?

什么是匿名内部类

在说明什么是匿名内部类之前,我们先来看看局部内部类

局部内部类

当我们只在一个方法内部创建这个类型的对象时,我们可以将这个类定义在方法内部。

	public void function() {
		class innerClass{
			int a;
			int b;
			public innerClass() {
				a = 1;
				b = 2;
			}
			public void print() {
				System.out.println(a+" "+b);
			}
		}
		innerClass iClass = new innerClass();
		iClass.print();
	}

这样做的好处:

  1. 在外部类中不能创建局部类的实例,即对外部世界可以完全地隐藏起来。
  2. 外部类不能访问局部内部类,只能在方法体中访问局部内部类。
  3. 还有一个优点,他们不仅能够访问包含他们的外部类,还能访问局部变量。不过那些局部变量必须事实上为final。这说明,他们一旦赋值就绝对不会改变。

注意:局部类不能用public或private访问说明夫进行声明。他的作用域被限定在声明这个局部类的块中。

匿名内部类

我们将局部内部类在深入一步。假设只创建这个类的一个对象时,那就直接不命名了,这时这种类被称作匿名内部类。

我们就拿上面我们提到的Comparator接口来简单分析一下:

Comparator<Integer> aComparator = new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				return o1.compareTo(o2);
			}
		};

我们注意到声明和实例其实合成一个语句了,用“{}”括起来类的声明主体。因为匿名类的声明是一个表达式,是语句的一部分,因此要以分号“;”结尾。

匿名内部类与局部内部类对作用域内的变量拥有相同的访问权限。

  • 匿名内部类可以访问外部类带final修饰的变量
  • 匿名内部类中不能定义静态属性、方法
  • 匿名内部类可以有常量属性(即final修饰的属性)

引用:
Java核心技术 卷1 基础知识(第10版)
JAVA匿名内部类(Anonymous Classes)https://www.cnblogs.com/wuhenzhidu/p/anonymous.html
接口到底能不能实例化 https://blog.csdn.net/MaoDunTi/article/details/47804121

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值