细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】
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();
} }
打印结果
细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】的更多相关文章
- 【细谈Java并发】谈谈LinkedBlockingQueue(转)
最近在看concurrent包的知识,看到LinkedBlockingQueue,发现一篇好文推荐给大家.原文地址:[细谈Java并发]谈谈LinkedBlockingQueue 1.简介 上篇我们介 ...
- 细谈Java
重载:相同函数名,不同参数. 重写(覆写):父类和子类之间的,子类重写了父类的方法. java的多态:重载+覆写 1. Main方法: 是public的,也是static,也是void的,参 ...
- 1)Java学习笔记:接口和抽象类的异同
Java接口和抽象类很像,他们有哪些相同点和异同点呢,下面我们做一个小结 相同 ① 都不能被实例化,都位于继承树的顶端,用于被实现或者继承 ② 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必 ...
- Java之集合(一)接口及抽象类
转载请注明源出处:http://www.cnblogs.com/lighten/p/7278655.html 1.前言 从本章开始介绍Java的集合类,这些类主要存在于java.util包下,该系列基 ...
- 学JAVA第十八天,接口与抽象类进一步加深
昨天老师讲了建网站,还要交钱买东西的,所以就没写,今天讲了接口与抽象类进一步加深 上完今天的课后,我才知道一个接口可以有多个实现类,一个实现类可以同时接多个接口. 现在就用代码来解释吧!!! 举例用人 ...
- Java学习笔记之接口和抽象类
接口(interface)1.interface创建一个接口,implements实现接口 interface jiekou{} class lie implements jiekou{}2.接口可以 ...
- C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较
由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...
- 【知了堂学习笔记】java 接口与抽象类
本次主角:抽象类 .接口. 对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题 ...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解
在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...
随机推荐
- python初探——pandas使用
一.简介 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.pandas提供了大量 ...
- libev I/O事件
libev是来实现reactor模式,主要包含三大部分: 1. watcher:watcher是Reactor中的Event Handler. 作用:1)向事件循环提供了统一的调用接口(按类型区分) ...
- Jenkins插件维护
目录 一.简介 二.插件安装 在线安装插件 上传安装插件 从其它jenkins复制插件 配置插件加速器 一.简介 除了在线安装,还可以官网插件下载地址中进行下载安装,如果访问缓慢可以用清华镜像站. 二 ...
- Firebug: Net Panel 使用详解
Introduction to Firebug: Net Panel Since there is not much user documentation related to Firebug fea ...
- [BUUCTF]PWN11——get_started_3dsctf_2016
[BUUCTF]PWN11--get_started_3dsctf_2016 题目网址:https://buuoj.cn/challenges#get_started_3dsctf_2016 步骤: ...
- 删除空行(嵌套)(Power Query 之 M 语言)
数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...
- 关于@Autowired和@Resource注解区别
区分一下@Autowired和@Resource两个注解的区别: 1.@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配 2.@A ...
- SQL Server中的函数
字符串函数 日期函数 数学函数 系统函数
- JAVA使用aspose实现word文档转pdf文件
引入jar包 下载地址:https://yvioo.lanzous.com/iezpdno3mob 然后打开下载的目录打开cmd执行 mvn install:install-file -Dfile=a ...
- JAVA获取访问者IP地址
pom <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomc ...