Java学习之匿名内部类(非常重要)

news/2024/11/15 3:53:19/

目录

一、匿名内部类介绍

基本语法

 二、举例说明

1.传统方式实现接口

 2.使用匿名内部类进行简化


一、匿名内部类介绍

1.匿名内部类也是类

2.匿名内部类也是内部类

3.匿名内部类没有名字(名字存在于JVM中,不会显示出来)

4.匿名内部类同时还是一个对象

基本语法

 二、举例说明


1.传统方式实现接口

package com.hspedu.innerclass;/*** 演示匿名内部类的使用*/
public class AnonymousInnerClass01 {public static void main(String[] args) {Outer04 outer04 = new Outer04();outer04.method();}
}class Outer04 { //外部类private int n1 = 10;//属性public void method() {//方法//基于接口的匿名内部类//1.需求:想使用接口IA,并创建对象//2.传统方式:,实现该接口,并创建对象实例IA tiger = new Tiger();//接口的多态tiger.cry();}}interface IA {//接口public void cry();
}
class Tiger implements IA{@Overridepublic void cry() {System.out.println("老虎叫唤...");}
}

同理,如果Dog类实现了接口IA,那么也是同样的流程

 2.使用匿名内部类进行简化

package com.hspedu.innerclass;/*** 演示匿名内部类的使用*/
public class AnonymousInnerClass01 {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.使用匿名内部类简化开发
//        IA tiger = new Tiger();//接口的多态
//        tiger.cry();IA tiger = new IA(){@Overridepublic void cry() {System.out.println("老虎叫唤...");}};tiger.cry();}}interface IA {//接口public void cry();
}
    IA tiger =  new IA(){@Overridepublic void cry() {System.out.println("老虎叫唤...");}};

上述代码是一个对象实例,是实现了IA接口的匿名内部类的对象实例

而真正的匿名内部类的内容是

        {@Overridepublic void cry() {System.out.println("老虎叫唤...");}}

这个类是没有名字的,即匿名的

对象tiger的编译类型和运行类型

5.编译类型:IA

6.运行类型:匿名内部类,可以通过getClass()方法得到匿名内部类在JVM中的名字

运行结果

Outer04$1:即外部类+ $ + 序号

也就是说匿名内部类在底层的代码是

            class Outer04$1 implements IA {@Overridepublic void cry() {System.out.println("老虎叫唤...");}}

7. jdk 底层在创建匿名内部类 Outer04$1,立即马上就创建了 Outer04$1 实例, 并且把地址
返回给 tiger
8. 匿名内部类使用一次, 就不能再使用,但是创建的对象可以多次使用


http://www.ppmy.cn/news/49028.html

相关文章

当我把chatGPT作为Java面试官,它问了我这些问题

向chatGPT提问 面试官:你好,欢迎参加我们的Java面试。请先自我介绍一下。 面试者:非常感谢,我是一名资深Java开发工程师,具有丰富的Java开发经验。我在过去的五年里,主要从事了企业级Java应用的设计、开发…

8. 优先队列

8. 优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级…

设计模式-结构型模式之代理模式

6. 代理模式 6.1. 模式动机 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内…

Linux --- 软件安装、项目部署

一、软件安装 1.1、软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 1.2、安装JDK 上述我们介绍了Linux系统软件安装的四种形式,接下来我们就通过第一种(二进制发布包)形式来安装 JDK。 JDK…

最短路径Floyd与区间DP

floyd算法是求最短路径的算法,算法复杂度为n(o^3),其优点在于能够一次求解所有点到其他点的最短路径,不需要其他运算,使用二维数组存储。其三层循环自外向内分别为:中间点,起始点和终点。状态方程为: num[…

leetcode 879. Profitable Schemes(有利润的计划)

有几个工程,每个工程需要group[ i ]个人去做,做完了可以得到profit[ i ]的利润。 现有2个限制条件: 人数上限是n, 且参加了一个工程的人不能再参加其他工程。 利润下限minProfit, 至少要获得minProfit的利润。 问有多少种工程的选法&#xff…

C语言-字符串

sizeof和strlen 的区别: 区别1: 1.sizeof计算整个数组大小, 2.strlen 计算有效的数组大小 新建字符数组”hello“ char cdata[128]"hello"; printf("sizeof--cdata的长度:%d\n",sizeof(cdata)); pri…

shell编程入门 第一章 基本语法

shell编程的语法主要分为五个环节,分别是变量,字符串,运算符,流程控制,函数五大部分 shell编程的基础语法 一 变量1.1 shell变量名1.2 使用shell变量1.3只读变量1.4 删除变量 二 字符串2.1 定义时最好用双引号2.2获取字…