栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java语法糖--匿名内部类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java语法糖--匿名内部类

1. 前言

匿名内部类,有的朋友觉得不好理解,其实顾名思义就可以了。

匿名,表示这个类没有名称。

内部类,表示不是一个独立的类,而是在一个类或方法内部的类。

2. 传统方式

首先我们需要面向接口编程,这个是很自然,面向接口编程提供了对现实社会模型的抽象,可以提供更高的灵活性。

传统方式下,我们通过类来实现接口,然后通过类对象来进行调用。

2.1 定义接口

举个例子,打仗需要使用武器,武器需要准备,然后发射,所以定义武器接口:


public interface Weapon {
	
	public void prepare();

	
	public void launch();
}
2.2 使用接口

当军队发起战役时,需要使用武器进行战斗:


public class Battle {
	
	public void fight(Weapon w) {
		w.prepare();
		w.launch();
	}
}
2.3 使用实现类

OK,此时如果是现代军队,武器种类很多,有坦克、大炮、航母、飞机等等,我们可以实现各种武器,然后进行战斗。
如下示例,就是最常用的,定义类实现接口,然后通过类对象进行调用。


public class Tank implements Weapon {
	@Override
	public void prepare() {
		System.out.println("坦克装填炮弹");
	}

	@Override
	public void launch() {
		System.out.println("坦克开火");
	}
	
	public static void main(String[] args) {
		Battle battle=new Battle();
		Tank tank=new Tank();
		battle.fight(tank);
	}
}
3. 使用匿名内部类

但是如果接口的实现类只使用一次,我们来定义类,并通过类对象来进行操作是比较繁琐的。

具体到上面的场景中,就是说根本没啥高科技武器,就是一群原始人用扔石头战斗。此时如果单独定义一个石头类意义不大,而且比较麻烦,所以可以直接用匿名内部类解决。


public class Battle {
	
	public void fight(Weapon w) {
		w.prepare();
		w.launch();
	}
	public static void main(String[] args) {
		Battle battle = new Battle();
		// 使用匿名内部类
		battle.fight(new Weapon() {
			@Override
			public void prepare() {
				System.out.println("拿起石头");
			}
			@Override
			public void launch() {
				System.out.println("扔石头");
			}
		});
	}
}

注意在上面的例子中,我们并未定义Weapon接口的实现类,而是直接创建了Weapon类型的对象,同时定义了一个实现Weapon接口的匿名内部类。

注意匿名内部类同时定义了类的方法,而且接着就生成了该类型的对象,然后接着就调用了,非常简洁而方便。

如果上面的例子还不好理解的话,可以参考:


public class Battle {
	
	public void fight(Weapon w) {
		w.prepare();
		w.launch();
	}

	public static void main(String[] args) {
		Battle battle = new Battle();
		// 使用匿名内部类
		Weapon weapon = new Weapon() {
			@Override
			public void prepare() {
				System.out.println("拿起石头");
			}

			@Override
			public void launch() {
				System.out.println("扔石头");
			}
		};
		battle.fight(weapon);
	}
}
4. 使用场景

大部分情况下,还是使用接口–实现类这样的结构。

如果仅仅是在调用时临时使用,可以不定义实现类,借助匿名内部类来快速开发。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号