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 匿名内部类 【分别 使用 接口 和 抽象类实现】的更多相关文章

  1. 【细谈Java并发】谈谈LinkedBlockingQueue(转)

    最近在看concurrent包的知识,看到LinkedBlockingQueue,发现一篇好文推荐给大家.原文地址:[细谈Java并发]谈谈LinkedBlockingQueue 1.简介 上篇我们介 ...

  2. 细谈Java

    重载:相同函数名,不同参数. 重写(覆写):父类和子类之间的,子类重写了父类的方法. java的多态:重载+覆写 1.      Main方法: 是public的,也是static,也是void的,参 ...

  3. 1)Java学习笔记:接口和抽象类的异同

    Java接口和抽象类很像,他们有哪些相同点和异同点呢,下面我们做一个小结 相同 ① 都不能被实例化,都位于继承树的顶端,用于被实现或者继承 ② 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必 ...

  4. Java之集合(一)接口及抽象类

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7278655.html 1.前言 从本章开始介绍Java的集合类,这些类主要存在于java.util包下,该系列基 ...

  5. 学JAVA第十八天,接口与抽象类进一步加深

    昨天老师讲了建网站,还要交钱买东西的,所以就没写,今天讲了接口与抽象类进一步加深 上完今天的课后,我才知道一个接口可以有多个实现类,一个实现类可以同时接多个接口. 现在就用代码来解释吧!!! 举例用人 ...

  6. Java学习笔记之接口和抽象类

    接口(interface)1.interface创建一个接口,implements实现接口 interface jiekou{} class lie implements jiekou{}2.接口可以 ...

  7. C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

    由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...

  8. 【知了堂学习笔记】java 接口与抽象类

    本次主角:抽象类 .接口. 对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题 ...

  9. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

随机推荐

  1. 十二. Go并发编程--sync/errGroup

    一.序 这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分区(partition)数,创建同等数量的 消费者( goroutine)从不同的分区中消费者消费数据,但是 ...

  2. 车载以太网第二弹|测试之实锤-1000BASE-T1物理层PMA测试实践

    背景 100BASE-T1方兴未艾,国内外OEM量产车型纷至沓来:为了满足高带宽的应用场景需求(如图像.雷达等数据传输),1000BASE-T1将至已至,如大众MEB平台采用1000BASE-T1总线 ...

  3. CF221A Little Elephant and Function 题解

    Content 小象有一个序列 \(a_1,a_2,a_3,...,a_n\) (其中 \(a_i=i\))和一个递归函数 \(f(x)\).\(f(x)\) 的操作如下: 初始时,\(x=n\). ...

  4. label标签利用jquery获取值得方式为$("#message").html()

    label标签利用jquery获取值的方式为$("#message").text(), 赋值的方式为:$("message").html("北京欢迎你 ...

  5. JS验证身份证是否符合规则

    调用isIdCardNo(num)  验证通过返回true 错误返回false function isIdCardNo(num) { var factorArr = new Array(7, 9, 1 ...

  6. Guava Retryer实现接口重试

    前言 小黑在开发中遇到个问题,我负责的模块需要调用某个三方服务接口查询信息,查询结果直接影响后续业务逻辑的处理: 这个接口偶尔会因网络问题出现超时,导致我的业务逻辑无法继续处理: 这个问题该如何解决呢 ...

  7. 【LeetCode】760. Find Anagram Mappings 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...

  8. 【LeetCode】915. Partition Array into Disjoint Intervals 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/partitio ...

  9. 【LeetCode】430. Flatten a Multilevel Doubly Linked List 解题报告(Python)

    [LeetCode]430. Flatten a Multilevel Doubly Linked List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: ...

  10. 【LeetCode】867. Transpose Matrix 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 先构建数组再遍历实现翻转 日期 题目地址:https ...