细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】
2024-09-07 19:29:17
1.前言
匿名内部类是什么东西?
没有名字的内部类就是匿名内部类。
什么场景使用?
匿名内部类适合创建那种只需要一次使用的类。
这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的类岂不是需要单独做个文件存放?文件多起来,连名字都不好起,
这算是 给 起名字困难人群 巨大的福利啊!!!直接不要名字啦,哈哈哈哈哈
匿名内部类的使用需要接口或抽象类的使用,而使用抽象类又有点像Java多态知识点用法,当然区别还是有的。
2.操作
(1)使用接口实现匿名内部类
创建一个接口
package com.example.javabaisc.anonymous; public interface InterFood {
public void eat();
public void count();
}
创建一个测试类
package com.example.javabaisc.anonymous; import org.junit.jupiter.api.Test; public class AnoTest { /**
* 使用接口实现匿名内部类
*/
@Test
public void t1(){
//方法一:实例接口后直接配置内部方法来实现逻辑
InterFood interFood = new InterFood() {
@Override
public void eat() {
System.out.println("吃苹果");
} @Override
public void count() {
System.out.println("100个");
}
};
interFood.eat();
interFood.count();
//=================================
System.out.println("==============================================");
//方法二:以接口实现的匿名内部类作为对象参数,直接传入方法内使用
AnoTest anoTest = new AnoTest();
anoTest.ano(new InterFood() {
@Override
public void eat() {
System.out.println("这次要吃桃子。");
} @Override
public void count() {
System.out.println("500个桃子够吗");
}
}); } public void ano(InterFood interFood){
interFood.eat();
interFood.count();
} }
打印结果
【注意:
使用接口实现匿名内部类有个明显的缺点,无法传入参数,只能在内部类里面定义死,
但是可以 引入外部的常量,jdk8以下的需要使用final
package com.example.javabaisc.anonymous; import org.junit.jupiter.api.Test; public class AnoTest { /**
* 使用接口实现匿名内部类
*/
@Test
public void t1(){
//jdk8以下的需要使用final
// final int kk = 666;
int kk = 666; //方法一:实例接口后直接配置内部方法来实现逻辑
InterFood interFood = new InterFood() {
@Override
public void eat() {
System.out.println("吃苹果");
} @Override
public void count() {
System.out.println("100个");
}
};
interFood.eat();
interFood.count();
//=================================
System.out.println("==============================================");
//方法二:以接口实现的匿名内部类作为对象参数,直接传入方法内使用
AnoTest anoTest = new AnoTest();
anoTest.ano(new InterFood() {
@Override
public void eat() {
System.out.println("这次要吃桃子。"+kk);
} @Override
public void count() {
System.out.println("500个桃子够吗");
}
}); } public void ano(InterFood interFood){
interFood.eat();
interFood.count();
} }
打印结果
】
(2)使用抽象类实现匿名内部类
创建一个抽象类
package com.example.javabaisc.anonymous; //抽象类
abstract public class AbstractFood {
//抽象方法
abstract void getCount(); //无参构造函数方法
public AbstractFood() {
} //有参构造函数方法
public AbstractFood(String name) {
this.name = name;
} //变量属性
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
测试类
package com.example.javabaisc.anonymous; import org.junit.jupiter.api.Test; public class AnoTest { /**
* 使用抽象类实现匿名内部类
*/
@Test
public void t2() {
//方法一:传入参数
AbstractFood abstractFood = new AbstractFood("苹果") {
// 初始化块
{
System.out.println("匿名内部类的初始化块...");
}
@Override
void getCount() {
System.out.println("200个");
}
};
System.out.println(abstractFood.getName());
abstractFood.getCount();
System.out.println("==============================================");
//
//方法二: 引用外部参数变量
String mname = "樱桃";
AbstractFood abstractFood2 = new AbstractFood() {
// 初始化块
{
System.out.println("匿名内部类的初始化块...");
}
@Override
void getCount() {
System.out.println("50个");
}
//即便不是抽象方法,也可以覆写类里面的普通方法
@Override
public String getName() {
return mname;
}
};
System.out.println(abstractFood2.getName());
abstractFood2.getCount();
System.out.println("==============================================");
//
//方法三:匿名内部类作为参数传入方法中
AnoTest anoTest = new AnoTest();
anoTest.abs(new AbstractFood("火龙果") {
// 初始化块
{
System.out.println("匿名内部类的初始化块...");
}
@Override
void getCount() {
System.out.println("10个");
}
});
} public void abs(AbstractFood abstractFood) {
System.out.println(abstractFood.getName());
abstractFood.getCount();
} }
打印结果
最新文章
- 四种比较简单的图像显著性区域特征提取方法原理及实现----->; AC/HC/LC/FT。
- AC自动机 HDU 2222
- PHP Java 设置cookie方法
- 01-事件处理简介/UIView拖拽
- 1.python的第一步
- js与C#之间相互调用的一些方法
- Find Successor &; Predecessor in BST
- DOS窗口中文显示乱码
- 完美实现同时分享图片和文字(Intent.ACTION_SEND)
- Maven+struts2+spring4+hibernate4的环境搭建
- arttemplate函数摘录
- jQuery API 中文文档
- 团队作业4——第一次项目冲刺(ALpha版本)第三天
- Net知识图谱
- Firefox 多行标签的解决方案分享
- Google的java工具类Guava
- 洛谷P4588 [TJOI2018]数学计算(线段树)
- CF767C Garland--树形dp
- 前端面试题整理——javaScript部分
- MySql数据库基础笔记(一)
热门文章
- 关于UML类图方面的问题(连载)
- 转: 再谈select, iocp, epoll,kqueue及各种I/O复用机制
- mit6.830 - lab1 - 存储模型 - 题解
- 字符串函数(Excel函数集团)
- 资源日历关联(Project)
- Docker容器自动更新
- Linq中常用语法
- Django 中间件理解
- JAVA微信公众号网页开发——通过接收人的openid发送模板消息
- 【LeetCode】513. Find Bottom Left Tree Value 解题报告(Python & C++ & Java)