黑马程序员——分析匿名内部类使用外部定义的对象

黑马程序员入学Java知识——精华总结 黑马程序员入学Java知识——精华总结   J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结!   一、黑马程序员—java概述与基础知识 6 1、何为编程? 6 2、Java语言概述,历史、特点 6 3、什么是跨平台性?原理是什么?JVM 7 4、Jre和Jdk的区别? 7 5、java虚拟机JVM 8 6、 Java程序运行机制 8 7 阅读详情
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

         在分析之前,首先说一下内部类定义在局部的特点。

        内部类被定义在局部时:

       1. 不可以被成员修饰符修饰;

       2. 可以直接访问外部类中的成员,因为还持有外部类中的引用;

       3. 但是不可以访问它所在局部中的变量,只能访问被final修饰的局部变量。

    其中,匿名内部类其实就是一条特殊的语句,被定义在方法中,所以,匿名内部类也属于被定义在局部的内部类,符合上述特点。

   在《Java编程思想》中有这样 一句话,“如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的”。

这里所说的“外部定义的对象”,指的是所有外来的对象,包括外部方法的形参、局部变量、基本类型或自定义类型等。

   这里之所以只能用final修饰的参数,是变量作用域的原因。虽然匿名内部类被定义在方法内部,但匿名内部类是单独的个体,编译时随外部类一起被编译成为Outer$1.class文件,并不是方法被调用时才会被执行。方法中的局部变量只是在方法被调用时被创建在栈内存中,调用完毕会自动清空栈,所以,匿名内部类要想使用方法内部的变量,只能将该变量用final修饰,即定义为常量。

interface Destination{
	String readLabel();
}
public class Parcel{
	public Destination destination(final String dest){
		return new Destination(){
			private String label = dest;
			public String readLabel(){
				return label;
			}
		};
	}
	public static void main(String[] args){
		Parcel p = new Parcel();
		Destination d = p.destination("hello");
	}
}

如上例所示,匿名内部类中用到了函数destination中的参数,就必须将该参数用final修饰,否则,编译会提示错误。

但是,如果你使用的JDK为1.8版本,就算局部变量不用final修饰,编译也会通过,而且可以正常运行。但编译器会默认该变量为final类型。这也许是新版本的一个bug吧。


黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(6)解散部门 指路(1)(2)(3)(4)(5)👇黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(1)准备工作、部门管理_tlias智能学习辅助系统的需求分析-优快云博客黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(2)员工管理|分页查询、分页查询(带条件)-优快云博客黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(3)员工管理|新增员工、文件上传-优快云博客。 阅读详情

相关推荐

黑马程序员————C语言_练习题解题思路分析(一)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 第一题:输入一英文句子,将其中所有单词首字符转换成大写后输出。 输入一英文句子,将其中所有单词首字符转换成大写后输出。

whqkgd55的专栏 1334

Java 局部匿名内部类是否会持有外部类的引用

5:调用Demo$DemoRunnable类的init方法(即参数为Demo的构造方法),将Demo对象作为了参数传递进来。发现生成的类只有一个构造器,参数就是Demo类型,而且保存到内部类本身的this$0字段中。4:aload_0指令将外部类Demo的this对象压栈。用javac命令生成字节码文件,根目录下生成两个文件。以下的分析方法和上面类似,这里给出简化过程。,查看反编译后的代码,根目录下生成两个文件。根目录下生成两个文件。根目录下生成两个文件。

说码解字 2173

【黑马程序员】第三章:面向对象(上)

------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------    Java 是一种面向对象的程序设计语言,了解面向对象的编程思想对于学习 Java 开发相对重要,接下来将讲解如何使用面向对象的思想开发。 一、面向对象的概念    面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态的不同的事物,这些事务之间存在各种各样

u010975449的专栏 1071

java外部类,内部类,匿名内部类

内部类分为:非静态内部类、静态类内部类、匿名内部类和局部内部类。 内部类可以直接访问外部类的私有属性       1、非静态内部类对象会持有外部类的对象。其实是,非静态内部类对象依赖于外部类对象而存在,没有外部类就没有内部类,有外部类不一定有内部类。这一点从内部类的使用语法上面可以看出:[java] view plain copy    public class Outer {      int ...

wang1253的博客 655

BPMN-JS :修改节点“Change Type”事件类型

修改路径:node_modules\bpmn-js\lib\features\replace\ReplaceOptions.js。

TaylorY的博客 679

哨兵一号burst数据的下载和处理

在Sentinel - 1数据处理领域,其基本流程起始于从(ASF)下载原始压缩文件。这些文件规模颇为可观,常规大小约4GB,而部分数据的原文件甚至已攀升至7GB,对存储空间提出了严苛要求。从影像构成来看,每景Sentinel - 1影像由三个干涉宽幅(IW)模式子带组成,每个IW一般包含9个脉冲串(burst)。然而,在实际研究中,我们所关注的研究区域往往仅占据其中寥寥几个burst。

kangkangluoluo的博客 1965

为什么匿名内部类会持有外部类对象?

发现了吗,java编译器构建了一个名为Outer$1的类去实现、继承匿名内部类对应的类,并构建了一个有参构造器,入参规则是:外部类对象 + 匿名内部类使用到的外部类中的成员变量(上面用到了外部类的字符串,构造的有参构造器就会增加这个String的参数)答案是延时任务对象是通过匿名内部类构建的,其拥有外部类对象,这就让Activity退出后,GC释放不了Activity对象所占用的内存块,引发内存泄漏。可以看到,我们在构建Inner对象时,是通过无参构造器构建的,不会将外部类对象传入静态内部类的情况。

Is_Poson的博客 1716

ADS新手必看:ICCAP数据导入与导出CSV的完整流程(附常见问题解决)

本文为ADS新手详细讲解了如何将ICCAP测试数据导入ADS进行仿真分析,并导出为通用CSV格式的完整流程。内容涵盖文件格式解析、导入设置、数据验证、处理技巧及常见问题排查,重点解决了数据文件导入过程中的兼容性与单位映射等核心难点,帮助射频工程师高效连接测量与仿真环节。

peace的博客 558

面试:内部类为什么会持有外部类的引用

问题1:内部类为什么会持有外部类的引用 这是因为内部类虽然和外部类写在同一个文件中,但是编译后还是会生成不同的class文件,其中内部类的构造函数中会传入外部类的实例,然后就可以通过this$0访问外部类的成员。 其实也挺好理解的吧,因为在内部类中可以调用外部类的方法,变量等等,所以肯定会持有外部类的引用的。 贴一段内部类在编译后用JD-GUI查看的class代码,也许你能更好的理解: //原代码 class InnerClassOutClass{ class InnerUser {

王温暖的博客 4056

CE 7.4中文版实战:如何用自动汇编功能快速生成游戏修改器(附CT表保存技巧)

本文详细介绍了CE 7.4中文版中自动汇编功能的使用方法,帮助用户快速生成游戏修改器。从环境配置、内存地址定位到自动汇编代码注入,再到CT表保存和独立EXE生成,提供全流程实战指南,适合逆向工程爱好者和游戏修改器开发者。

keras9composer的博客 357

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

liang007dudu的博客 1万+

kotlin匿名内部类持有外部对象,掌握这个提升路径,

Http报文结构,一次网络请求的过程是怎样的?4.SingleInstance:这个是SingleTask加强本,系统会为要启动的Activity单独开一个栈,这个栈里只有它,适用新开Activity和app能独立开的,如系统闹钟,微信的视频聊天界面不知道是不是,知道的同学告诉我下,在此谢过!RxJava、RxBus、RxAndroid,这个在面试想去的公司时,可以反编译下他们的包,看下是不是用到,如果用到了,面试过程难免会问道,如果没有,也可以忽略,但学习心强的同学可以看下,比较是比较火的框架。

m0_61331407的博客 704

llama.cpp 参数调优大全(4060 最优配置)

本文针对NVIDIA RTX 4060(8GB显存)显卡,提供了llama.cpp参数调优的实战指南。核心策略是采用小模型(7B/8B)配合Q4_K_M量化,通过合理设置GPU层数(-ngl 28)、上下文长度(-c 2048)和批量大小(-b 512)来平衡性能和显存占用。重点推荐启用flash-attn加速和mlock内存锁定,并给出标准、高性能和保守三种配置方案。调优优先级为:GPU利用率>吞吐量>显存>线程数,同时警示避免常见错误如过大上下文或GPU层数设置。最终推荐4060最佳配置为7B Q4_

刘一说的IT专栏 3403

黑马程序员Python从入门到精通代码汇总

本帖子是本人于2023年暑假期间在B站观看《黑马程序员python教程,8天python从入门到精通》通过基于web的Jupyternotebook实时编译交互环境整理的Python学习笔记,大家可以根据黑马原视频对照学习。

Mickey的博客 7478

我用GPT-5.5十分钟就搞定了论文创新点!全靠这三个提示词

各位同仁好,我是七哥。一个在高校里从事人工智能 相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude 等大模型 学术实操相关问题,多多交流,相互成就,共同进步。多数研究者一写创新点就总觉得只有提出了全新的理论、颠覆了整个领域,才算真正的创新。但学术研究里的创新,有一半不是从零创造的,是在前人工作的基础上,准确找到还没人解决、或者没解决好的问题,而且真正能立住的创新通常都离不开以下这三个问题。第一,前人到底缺了什么。

智能AI让学术科研更容易 707

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

604

黑马程序员与优快云的商业角度分析

从商业角度来看,黑马程序员与优快云在市场定位、商业模式、竞争策略和未来发展潜力等方面各具特色。黑马程序员专注于IT职业教育,通过高质量的课程满足市场需求,而优快云则通过丰富的内容生态和多元化的盈利模式,巩固其在技术社区的领导地位。理解这些商业动态,有助于把握中国技术教育和社区发展的脉络,为未来的商业决策提供指导。

2501_91107759的博客 581

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【黑马程序员-注册安全分析报告】

黑马程序员主要做技术培训为主要业务的网站,应该有不少技术专家, 对机器识别应该有所了解, 但采用的是通俗的滑动验证产品, 该产品稳定并且市场占有率很高, 在一定程度上提高了用户体验, 但安全性在机器学习的今天, 已经无法应对攻击了,并且正是由于该产品通俗, 所以在网上破解的文章和教学视频也是大量存在,并且经过验证滑动产品很容易被破解, 所以除了滑动验证方式, 花样百出的产品层出不穷,但本质就是牺牲用户体验来提高安全。很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。

weixin_46641057的博客 1857

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

黑马程序员_QQ群讨论问题分析1

---------------------- android培训、java培训、期待与您交流! ---------------------- 今天在黑马群里看到同学问的问题很有意思,我就想把它记在日记里,以后有机会再看看…… 程序: new Thread(new

3870

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

黑马程序员——面对对象之类的定义和使用

---------------------- ASP.Net+Unity开发、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训、期待与您交流! ---------------------- 1 为什么要使用类?   在编程中我们使用对象来模拟现实中的对象,用属性模拟特征,方法模拟能力。每次使用都会创建对象,定义属性,方法。这样比较

起飞的地方 821

黑马程序员 Java 最新教程:开启你的编程之旅

黑马程序员 Java 最新教程:开启你的编程之旅 【下载地址】黑马程序员Java最新教程 黑马程序员 Java 最新教程欢迎来到黑马程序员的 Java 最新教程资源页面 项目地址: https://gitcode.com/Reso...

gitblog_06512的博客 617

黑马程序员 Java面向对象——(匿名)内部类

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 面向对象 内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。 简单的说就是类中还有一个类,就是内部类。 字节码文件名:外部类名

u014434956的专栏 439

【1024程序员节特辑】:揭秘黑马程序员逆袭的5大核心技术栈

auto-generated

ProceShoal的博客 1167

黑马程序员 GUI

dg

h 719

了解“黑马程序员”有感

我没有任何兴趣对“黑马程序员"做任何广告,只是抒发与其理念的认同! 黑马:黑马原来是指在赛马场上本来不被看好的马匹,却能在比赛中让决大多数人跌破眼镜,成为出乎意料的获胜者。 程序员:程序员(英文Programmer)是从事程序开发、维护的专业人员。 http://edu.youkuaiyun.com/是他们的网站,一看是挂在优快云上,我吓尿了,这个域名就表示了他不坑爹。

来自幻想 1089
上一篇: 黑马程序员——数组笔记
下一篇: 黑马程序员——单例设计模式
codeting
博客等级 码龄12年 2粉丝 11原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值