细谈 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调用库,并讲解一下它的基 ...
随机推荐
- kubernetes list/watch设计原理
overview kubernetes的设计里面大致上分为3部分: API驱动型的特点 (API-driven) 控制循环(control loops)与 条件触发 (Level Trigger) A ...
- C# VS 断点进不去,显示红色空心右下角黄色感叹号图标
今天开发同事遇到了一个诡异的问题,使用 Visual Studio 调式 C# 代码时,断电位置一直显示红色空心右下角有黄色感叹号的图标(下图所示),断点调试死活进不去. 几个同事过去看了下,都隐约感 ...
- oracle11gR2、client及plsql完整安装与配置
本文主要介绍Oracle11g,client及PLSQL的安装过程 一,oracle安装 安装环境:虚拟机win7 64 1.点击目录中 setup.exe文件 2.配置安全更新中,取消通过my or ...
- grep的时候Binary file matches **.log 怎么解决
操作 grep "hello world" test.log 结果 Binary file test.log matches 原因:grep认为test.log是二进制文件 解决方 ...
- 卸载zabbix
1.首先停止zabbix运行 可以用官方命令 systemctl stop zabbix-server zabbix-agent httpd rh-php72-php-fpm 也可以直接kill -9 ...
- java 图形化工具Swing 颜色文件选择器 ;JColorChooser;JFileChoose
使用JColorChooser: JColorChooser用于创建颜色选择器对话框,该类的用法非常简单,该类主要提供了如下两个静态方法: (1),showDialog(Component compo ...
- Python的 垃圾回收机制
垃圾回收 1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257) 这些整 ...
- python进程管理工具Supervisor
一.Supervisor简单介绍 supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序.supervisor与lau ...
- RPA账户和密码管理方案
如何将登录业务系统的账户和密码"更好的,更合适"地交给RPA? 相信很多小伙伴们在做RPA的时候, 都会或多或少的遇到类似的问题. 正常情况下IT管理人员都会给真实的业务人员分配业 ...
- 【九度OJ】题目1203:IP地址 解题报告
[九度OJ]题目1203:IP地址 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1203 题目描述: 输入一个ip地址串,判断是否合 ...