细谈 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调用库,并讲解一下它的基 ...
随机推荐
- idea集成开发工具快捷键大全
1 执行(run) alt+r 2 提示补全 (Class Name Completion) ...
- 强化学习实战 | 表格型Q-Learning玩井子棋(三)优化,优化
在 强化学习实战 | 表格型Q-Learning玩井字棋(二)开始训练!中,我们让agent"简陋地"训练了起来,经过了耗费时间的10万局游戏过后,却效果平平,尤其是初始状态的数值 ...
- php常用的数组排序函数
sort() 函数用于对数组单元从低到高进行排序.rsort() 函数用于对数组单元从高到低进行排序.asort() 函数用于对数组单元从低到高进行排序并保持索引关系.arsort() 函数用于对数组 ...
- Log4j2又爆雷!2.16.0存在DOS风险,升级2.17.0可解决
本以为,经过上周的2.16.0版本升级,Log4j2的漏洞修复工作,大家基本都要告一段落了. 万万没想到,就在周末,Log4j官方又发布了新版本:2.17.0 该版本主要修复安全漏洞:CVE-2021 ...
- CF1092B Teams Forming 题解
Content 有 \(n\) 个学生,每个学生有一个能力值 \(a_i\).现在想把学生两两分成一组,但是不能让每个组里面的学生能力值不相同,因此可以通过刷题来提升自己的能力值,每次解出一道题,能力 ...
- AcWing429. 奖学金
题目: 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金. 期末,每个学生都有3门课的成绩:语文.数学.英语. 先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从 ...
- 利用免费二维码API自动生成网址图片二维码
调用第三方接口生成二维码 官方地址:http://goqr.me/api/ 示例 https://api.qrserver.com/v1/create-qr-code/?size=180x180&am ...
- VS2013 or up version +常用插件
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 下载地址: https://github.com/mohistH/vs2013_extens ...
- 【LeetCode】1222. Queens That Can Attack the King 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- 【LeetCode】1134. Armstrong Number 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接计算 日期 题目地址:https://leetco ...