Java中的匿名内部类

news2024/11/23 15:54:45

一、什么是匿名内部类?

定义:巴拉巴拉巴拉,就不写了。

语法:

部分内容来源于:什么是匿名内部类,如何使用匿名内部类_Weihaom_的博客-CSDN博客_匿名内部类

二、为什么要有匿名内部类?

在开发过程中,我们经常会遇到某个类/接口中的方法在程序中只实现一次。如果用传统方式,为了使用该方法,我们需要新建一个实现类去extends/implements某个类/接口,然后实例化对象,再用对象去调用方法,很麻烦。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余

传统方式:很麻烦的,尤其是当method()方法,只使用一次的时候,为了这一次使用,去创建一个实现类,写这么多,太麻烦了!

package com.hspedu.innerClass;

public class AnonymousInnerClassMG {
    public static void main(String[] args) {
        B b = new B();
        b.method();
    }
}

interface A {
    public void method();
}

class B implements A{
    @Override
    public void method() {
        System.out.println("我是方法");
    }
}

匿名内部类方式:作用是简化上面的代码

package com.hspedu.innerClass;

public class AnonymousInnerClassMG {
    public static void main(String[] args) {
        A a = new A() {
            @Override
            public void method() {
                System.out.println("我是method");
            }
        };
        a.method();
    }
}

interface A {
    public void method();
}

另外,匿名内部类那块还可以这样写:

package com.hspedu.innerClass;

public class AnonymousInnerClassMG {
    public static void main(String[] args) {
        new A() {
            @Override
            public void method() {
                System.out.println("我是method");
            }
        }.method();
    }
}

interface A {
    public void method();
}

Tips:

1、我们也用匿名内部类的方式去创建并启动线程:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("我是一个线程");
    }
}).start();

2、安卓开发中button的监听事件,也是用了匿名内部类。

三、匿名内部类是怎么实现的

看下面代码的注释应该就明白了:

package com.hspedu.innerClass;
/*
演示匿名内部类的使用
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}

class Outer04{  //外部类
    private int n1 = 10;  //属性
    public void method(){  //方法
        //基于接口的匿名内部类
        //1.需求:想使用IA接口,并创建对象
        //2.传统方式:是写一个类,实现该接口,并创建对象
        //3.现在的需求是Tiger/Dog类是只使用一次,后面再也不使用了,按照传统的写法就比较麻烦和浪费
        //4.于是使用匿名内部类来简化开发
        //5.tiger的编译类型?是IA
        //6.tiger的运行类型?就是匿名内部类,名称就是外部类$1。即Outer04$1
        /*
            我们看底层:Outer04$1就是我们的匿名内部类名字,这个名字是底层分配的,其实底层是有这个implement的行为
            class Outer04$1 implements IA{
                @Override
                public void cry() {
                    System.out.println("老虎叫");
                }
            }
         */
        //7.jdk底层在创建匿名内部类Outer04$1,立即马上就创建了Outer04$1实例,
        //并把地址返回给了tiger
        //8.匿名内部类使用一次,就不能再使用了(不是tiger对象哦)
        IA tiger = new IA() {
            @Override
            public void cry() {
                System.out.println("老虎叫");
            }
        };
        System.out.println("tiger的运行类型= " + tiger.getClass());  //tiger.getClass()就是获得tiger对象的运行类型
        tiger.cry();
    }
}

interface IA{  //接口
    public void cry();
}

四、匿名内部类可以用在哪里

对接口、具体类、抽象类都可以使用匿名内部类,而且对方法的个数没有要求。

//具体类
public class Class01 {
    public void show(String s){
        System.out.println("啦啦啦");
    }
}

//抽象类
public abstract class AbstractClass01 {
    abstract void show(String s);
}

//接口
public interface Interface01 {
    void show(String s);
}

public class TestInner {
    public static void main(String[] args) {
        
        //重写具体类的方法
        new Class01(){
            @Override
            public void show(String s) {
                System.out.println("我是一个" + s);
            }
        }.show("具体类");

        //重写抽象类的抽象方法
        new AbstractClass01(){
            @Override
            void show(String s) {
                System.out.println("我是一个" + s);
            }
        }.show("抽象类");

        //实现接口的抽象方法
        new Interface01(){
            @Override
            public void show(String s) {
                System.out.println("我是一个" + s);
            }
        }.show("接口");

    }
}

运行结果

我是一个具体类
我是一个抽象类
我是一个接口

五、匿名内部类的细节

1、匿名内部类的语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,从语法上看,既有定义类的特征,也有创建对象的特征。

左图是因为匿名内部类new A(){}也是一个对象,因此是直接调用了cry方法。

右图是因为匿名内部类也是一个类,所以用实例化的对象a去调用cry方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据入门核心技术-Flume】(二)Flume安装部署

目录 一、准备工作 1、基本Hadoop环境安装 2、下载安装包 二、安装 1、解压 2、修改环境变量 3、修改并配置 flume-env.sh 文件 4、验证是否安装成功 一、准备工作 1、基本Hadoop环境安装 参考 Hadoop安装 【大数据入门核心技术-Hadoop】(五&#xff09…

Spring WebSocket通信应用

文章目录前言一、客户端-服务端双向通信交互图二、项目说明1.引入包2.项目各模块说明问题参考前言 本文章主要记录项目客户端-服务端双向通信解决方案,基于Spring WebSocket架构实现双向数据通信; 以及项目实际应用中的一些问题与解决手段。一、客户端-服务端双向通…

[附源码]Node.js计算机毕业设计高铁乘坐舒适性在线调查及评价系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

挑灯夜战800个小时,终从外包成功上岸字节!入职那一天我眼眶湿润了

P8Java导图笔记 主目录: Java基础篇: JAVA基础对应详细解析文档 Java多线程并发篇: Java多线程并发知识点对应详解解析文档 JVM篇: JVM脑图对应详细文档解析 Spring原理 Spring原理对应详细解析文档 数据库 数据库对应详细解析文档…

[附源码]计算机毕业设计的连锁药店销售管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

全面回顾2022年加密行业大事件:破后而立方能绝处逢生

2022年,加密领域以Luna/UST的崩溃为起点开启了漫长的加密寒冬,在严峻的宏观环境下以及一系列戏剧性事件中遭受了沉重打击。2022年初,加密货币生态系统的市值达到近3万亿美元,而截至年底已蒸发2万亿美元,随之消失的还有…

「秒杀购物商城业务服务」「分布式架构服务」盘点中间件服务

​ 秒杀购物商城业务服务-分布式架构介绍 基于MySQL数据库集群技术实现服务的高可用基于Tomcat的集群负载机制实现Tomcat服务器的高可用基于Nginx负载均衡机制实现负载均衡(介绍和配置)基于Redis缓存服务实现数据缓存控制相关介绍和技术点分析对未来的…

分布式系统(概念、时间、状态)

文章目录分布式系统基本概念设计目标时间基本概念时间同步同步系统异步系统网络时间协议(NTP)逻辑时钟 & 向量时钟发生在先逻辑时钟向量时钟状态 & 快照全局状态 & 割集快照算法分布式系统 基本概念 分布式计算:是利用分布在网…

第二证券|“抗病毒面料”接棒炒作 是噱头还是新转机?

疫情防控常态化之下,“抗病毒抗菌”面料赚足了商场眼球。 由于合资公司的电子束接枝改性面料具有“抗病毒抗菌”的作用,“童装榜首股”安奈儿(002875.SZ)创下了14天10个涨停板的记载,12月13日,股价上涨逾6%。 主营精纺呢绒面料及…

SpringMVC:SpringMVC简介快速入门案例(1)

SpringMVC简介&&快速入门1. SpringMVC概述2. SpringMVC快速入门案例2.1:创建web工程(Maven结构)2.2:导入坐标(SpringMVC,Servlet)2.2:设置tomcat服务器,加载web工程(tomcat插件)2.4 创建SpringMVC配置类2.5&am…

前缀和(C++)实现

每日一句:真正让人变好的选择过程都不会很舒服,所以人们明知道什么都不做,会比较轻松,但依旧选择追逐梦想。 前缀和前言一、一维前缀和1.前缀和是什么?2.暴力做法3.前缀和求区间大小3.1如何构成前缀和的形式&#xff1…

基于RS485组网的温湿度物联网监测系统

随着现代设备的高速发展,作为设备机械的“电子眼”,各类传感器越来越多的应用到我们的生活和工作中,食品行业、档案管理、温室大棚、动物养殖、药品存储、等行业都温湿度传感器的身影。通过连接传感器实现远程监测的物联网系统,极…

高并发编程之ThreadPool 线程池

10 ThreadPool 线程池 10.1 线程池简介 线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销, 进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理 者分配可并发执…

MATLAB添加多种噪声(在GUI中)

目录 1.添加椒盐噪声 2.添加高斯噪声 3.添加乘性噪声 4.添加泊松噪声 1.添加椒盐噪声 function button_jiaoyan_Callback(hObject, eventdata, handles)%添加椒盐噪声 axes(handles.show_proImg); global fpath; img_2imread(fpath); img_2rgb2gray(img_2); img_2imnoise(im…

[附源码]计算机毕业设计的手机电商网站Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

leetcode每天5题-Day56-动态规划2

目录1. 整数拆分2. 不同的二叉搜索树3.1. 整数拆分 343. 整数拆分-中等 讲解 动规 思路:拆分一个数 n 使之乘积最大,那么一定是拆分m个成近似相同的子数相乘才是最大的。 动规五部曲; ①确定dp数组(dp table)以及下标的含义 …

【数集项目之 MCDF】(五) 最终整合:MCDF顶层文件

根据前面几章的介绍,我们已经大致完成了MCDF的子模块设计和波形测试,分别是control_regisyer、slave_FIFO、arbiter、formatter。   当然,由于握手机制等一些信号检查在顶层模块中,更容易进行检查,也容易进行调整各个…

jsp+ssm计算机毕业设计 宠物医院管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

如何在加密市场中快人一步?

链上数据的透明度让任何人都能看到发生的关键事件,但行业内很少有人充分利用这一点,而大多数是在事件已经影响到他们的投资组合后才能做出反应。 然而,在这个行业中,一笔钱的转移就能把未知的项目变成独角兽,或者让价值…

【MATLAB教程案例61】使用matlab实现基于ResNet残差网络的数据分类仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.ResNet残差网络理论概述