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();
} }

打印结果

最新文章

  1. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。
  2. AC自动机 HDU 2222
  3. PHP Java 设置cookie方法
  4. 01-事件处理简介/UIView拖拽
  5. 1.python的第一步
  6. js与C#之间相互调用的一些方法
  7. Find Successor & Predecessor in BST
  8. DOS窗口中文显示乱码
  9. 完美实现同时分享图片和文字(Intent.ACTION_SEND)
  10. Maven+struts2+spring4+hibernate4的环境搭建
  11. arttemplate函数摘录
  12. jQuery API 中文文档
  13. 团队作业4——第一次项目冲刺(ALpha版本)第三天
  14. Net知识图谱
  15. Firefox 多行标签的解决方案分享
  16. Google的java工具类Guava
  17. 洛谷P4588 [TJOI2018]数学计算(线段树)
  18. CF767C Garland--树形dp
  19. 前端面试题整理——javaScript部分
  20. MySql数据库基础笔记(一)

热门文章

  1. 关于UML类图方面的问题(连载)
  2. 转: 再谈select, iocp, epoll,kqueue及各种I/O复用机制
  3. mit6.830 - lab1 - 存储模型 - 题解
  4. 字符串函数(Excel函数集团)
  5. 资源日历关联(Project)
  6. Docker容器自动更新
  7. Linq中常用语法
  8. Django 中间件理解
  9. JAVA微信公众号网页开发——通过接收人的openid发送模板消息
  10. 【LeetCode】513. Find Bottom Left Tree Value 解题报告(Python & C++ & Java)