Java内部类与final关键字详解

海康威视VS互联网大厂:薪资、福利、工作强度全方位对比 本文全面对比了海康威视与互联网大厂在薪资、福利和工作强度等方面的差异。海康威视提供稳定的薪资结构和较低的工作强度,适合追求专业深度的职场人;而互联网大厂则以高薪和快速成长吸引人才,但工作压力较大。文章还分析了职业发展路径和长期价值,帮助求职者做出明智选择。 阅读详情

详解Java内部类与final关键字

内部类的几种创建方法:

1、成员内部类
class Outer{
		private int i = 1;
		class Inner{
			public void fun() {System.out.println("Outer I=" + i)}
		}
	}
2、方法内部类
class Outer{
		public void fun() {
			final int i = 1; // 被方法内部类访问的局部变量必须被final修饰
			class Inner{ // 方法内部类 不能有访问修饰符,比如public 
				public void print() {System.out.println("Method I=" + i)}
			}
		}
	}
3、匿名内部类
interface USB {
		public abstract void start()
	}
	class Outer{
		public void fun() {
			final int i = 1; // 被匿名内部类访问的局部变量必须被final修饰
			new USB(){
				@Override
				public void start(){
					System.out.println("local_var_i=" + i);
				}
			}.start();
		}
	}
4、静态内部类
class Outer{
		private int i = 1;
		static class Inner{ // 不能访问外部类的非静态成员
			public void fun() {}
		}
	}
5、接口内部类
interface USB {
		class Inner { // 默认是public static,即可以直接new USB.Inner();
		}
	}

神马是内部类?

乍一看,好些创建方式,挺复杂的吧?首先内部类是个啥东西?
定义:创建在一个类内部的类型。根据创建位置的不同,分为成员的、方法的、匿名的。接口中的内部类叫做接口内部类。
理解:在类的内部创建,那就是类的一部分,跟属性、方法同级。这也就解释了为何能访问外部私有成员,我是你的一部分,我当然可以访问了。

问题的引出<理解内部类>:

那问题来了,我是你的一部分,别人继承了外部类,会不会也把内部类也继承过去呢?这得从内部类设计的初衷与面向对象来探讨了。
比如我们用Body类来描述人体。如果是描述人类的话,会去描述人类具有的属性跟功能。
那现在我们描述人体,人体内部有心肝脾胃肾,这些再用属性来描述就不合适了吧?那怎么办呢?我们可以用内部类去描述。
所以,无论内部类是公开的还是私有的,都不会被继承,因为他不是属性,也不是方法。而是一个内部事务的描述,我们称之为内部类。
内部类可以更好地对内部事务进行封装,看例子:

身体类中,有属于身体的各个器官,各个器官有自己的功能与属性,于是我们把它封装成一个内部类去单独描述。
用来描述器官的内部类是身体的一部分,所以可以去自由的访问身体的资源(属性与功能),各个器官与身体相互协调完成运作。
public class Body {
	private class Heart { // 心脏
		public void bloodSupply() {
			// 供血...
		}
	}
	private class Hepar { // 肝脏
		public void Metabolism() {
			// 代谢...
		}
	}
	private class Spleen { // 脾脏
		public void storageBlood() {
			// 储血...
		}
	}
	private class Stomach { //胃部
		public void digest() {
			// 消化...
		}
	}
	private class Kidney { // 肾脏
		public void dischargePoison() {
			// 排毒...
		}
	}
}
问题的引出<内部类访问外部类成员方式>:

因为可以访问外部私有成员,那问题也就诞生了,他是怎么访问的呢?

1:对于成员内部类来说,他会持有一份外部类当前对象的引用,Outer.this。
这样就可以调用外部类可见的方法跟成员变量,调用方法是通过持有的外部类引用去调用的。Outer.this.fun();
那对于private成员是如何去访问的呢?是通过编译器在外部类中生成的静态的access$0()方法来访问的。Outer.this.access$0(Outer);




2:对于方法内部类(匿名内部类)来说,因为内部类要访问所在方法中的局部变量,这时候用持有的外部类当前对象引用还能调用的到吗?
调不到了,那Java语言的设计者是这么来解决这个问题的:将局部变量复制一份给内部类使用,怎么复制的?在内部类初始化的时候通过构造方法传值的方式。
这样,内部类中会有一份复制的private修饰的成员变量。这样我就能访问了。但问题又来了,比如:
public void fun() {
	int i = 1;
	class Inner{
		// int i = 1; 由编译器生成
		public void print() { i++ }
	}
	System.out.println("i=" + i); 
	// 还是会输出i=1,我们明明在内部类方法中对此变量进行++了啊。抱歉,您++的是被复制的另一份。
}
问题的引出<保持两个不同变量的一致性>:

好,问题就这么无情的出现了,怎么解决?Java又说了,要不然给局部变量加上final吧,这样就会保持值得一致性了。
ok,问题解决,这就是为什么方法内部类访问的局部变量必须被final修饰的终极原因(为了约束两个不同变量的一致性)。设计问题,挺无奈的解决方案。


来看看另一种说法:
在Java中,方法的局部变量位于栈上,对象位于堆上。
因为局部变量的范围被限制在该方法内,当一个方法结束时,栈结构被删除,该变量消失。
但是,定义在这个类中的内部类对象仍然存活在堆上,所以内部类对象不能使用局部变量。除非这些局部变量被标识为最终的。 


这种说法是片面的,因为根本原因是内部类对象无法访问局部变量,才会去复制一份。
为了保证两个变量的一致性,才去使用final关键字修饰局部变量。而不是因为栈生命周期与堆生命周期不一致的问题。


最后来说说final关键字:
用final关键字修饰对象变量,只是不允许这个对象引用再指向其他的对象,但是这个引用所指向的对象的内容是可以改变的
比如一个经典的例子:
final StringBuffer sb = new StringBuffer("HelloWorld");
sb = new StringBuffer("Hello"); // 编译失败,不能修改sb引用的指向
sb.append("China"); // sb指向的对象可以被修改。

其实从final的位置就看出来了,他是在修饰引用类型变量sb,而不是在修饰堆中的实例对象(new StringBuffer("HelloWorld");)


原创文章,转载请注明出处:http://blog.youkuaiyun.com/thinking_in_android

注册GitHub时出现Unable to verify your captcha response.Please visit https://docs.github.com/解决方案(持续更新) 本文主要介绍了注册GitHub时出现Unable to verify your captcha response. Please visit https://docs.github.com/articles/troubleshooting-connectivity-problems/#troubleshooting-the-captcha for troubleshooting information.解决方案,希望能对学习使用GitHub的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

论文笔记--Spatial-Temporal Fusion Graph Neural Networks for Traffic Flow Forecasting

Summary 在交通预测问题上,现有的框架通常利用给定的空间邻接图和复杂的机制来建模空间和时间关联。作者认为使用给定的空间邻接图会限制模型的有效时空相关性学习,并且它们通常使用单独的模块来实现空间和时间相关性,或者只使用独立的组件来捕获局部或全局的异质依赖关系,割裂了时空依赖关系。为此作者提出一种时空融合图神经网络用于交通预测。提出一种数据驱动的“时间图”生成方法,以此来补偿空间图可能没有反映的相关性。提出一种新的交通预测方法。 Problem Definition 交通预测中的挑战 以上图为

chenxino的博客 1755

Java final类详解

1.什么是final类?Java中有一些类,如String,Math等,就是final类的典型例子。虽然在Java编程中并不经常使用final类和final方法,但它们有着与众不同的特点,即final类不能被继承,不能被覆盖,以及final类在执行速度方面比一般类快。2.为何不能继承final类?有时需要对继承加以限制。例如某些处理特殊运算和操作的类,为了安全理由,不允许被其他类所继承。final...

子航 2万+

Fluent Meshing边界层设置保姆级教程:从y+理论到实战避坑,看完就会

本文详细解析了Fluent Meshing边界层设置的全过程,从y+理论基础到实战避坑技巧,帮助用户精准计算第一层高度并优化参数配置。通过案例演示和常见问题诊断,指导读者掌握边界层网格生成的核心技术,提升CFD模拟精度。特别针对不同湍流模型的y+要求提供具体参数建议。

weixin_30576827的博客 783

java final class 性能_深入理解 Java 中的 final 关键字

final 是Java 中重要关键字之一,可以应用于类、方法以及变量上。这篇文章中将讲解什么是 final 关键字?将变量、方法和类声明为 final 代表了什么?使用 final 的好处是什么?final 关键字是什么?final 在 Java 中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作 final,你将不能改变这个引用了,编译器会检查代码,如果试图将变量再...

weixin_35747627的博客 2063

Sentinel-1 Burst数据处理避坑实录:从aria2c报错到wget脚本救场

本文详细介绍了Sentinel-1 Burst数据处理的完整解决方案,从下载困境到高效处理技巧。针对aria2c报错等常见问题,提供了增强版wget脚本和智能分组方法,显著提升下载成功率和处理效率,特别适合科研机构和企业级网络环境下的哨兵数据处理需求。

weixin_42641998的博客 283

ESP32S3学习——i2c,点亮0.96寸oled

ESP32S3学习——i2c,点亮0.96寸oled

HandBAI的博客 1万+

Java的final类

例如,Java标准库中的String类就是一个final类,这是因为String被设计为不可变的,所有的String操作都不会改变原来的String,而是创建一个新的String。总的来说,final类是一种特殊的类,它不能被继承。在设计final类时,应该确保类的行为和数据是不需要(也不应该)被改变的。由于FinalClass是一个final类,所以我们不能创建一个继承自FinalClass的类。在这个例子中,MyFinalClass是一个final类,没有其他的类可以继承MyFinalClass。

weixin_63490470的博客 310

【实战指南】Jaspersoft Studio + JasperReports:从零构建企业级PDF报表

本文详细介绍了如何使用Jaspersoft Studio和JasperReports从零构建企业级PDF报表。通过可视化设计、数据连接、模板设计到最终输出的全链路支持,这套组合方案显著降低了报表开发的维护成本。文章还提供了开发环境搭建、中文乱码解决方案、Java集成代码及性能优化技巧,适合需要高效生成复杂PDF报表的开发者。

weixin_42666036的博客 246

浅析Java类关键字:class、abstract、final、extends等

Java中的类关键字,如classabstractfinalstaticextendsimplements等,为开发者提供了强大的工具来定义类的结构和行为。这些关键字通过控制类的继承、实现、访问权限、实例化等方面,帮助开发者构建高效、灵活和可维护的应用程序。在Java编程中,合理使用这些关键字可以大大提高代码的质量和可扩展性。

m0_55399448的博客 1493

Trustzone/TEE/安全 面试100问-目录

关键词:cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频、FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资料、免费 周贺贺,baron,代码改变世界ctw,Arm精选, 资深安全架构专家,十年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计

baron-周贺贺-代码改变世界ctw 649

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 288

java final class 性能_java中final 与效率

关于final关键字,总是那么些疑惑,今天就总结一下。一、final的概念:在Java中, 可以使用final关键字修饰类、方法以及成员变量。1、final标记的类不能被继承;在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。2、final标记的方法不能被子类复写;如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final...

weixin_42298081的博客 769

【学习系列】SAP RAP 17:RAP应用部署集成至Fiori Launchpad 【S4HC Public Edition】

本文详细介绍了在SAP S/4HANA Cloud环境中部署RAP应用集成到Fiori Launchpad的两种方法:使用BAS(SAP Business Application Studio)和VSCode。主要步骤包括:1)在BTP中配置Destination连接ES环境;2)设置信任关系;3)创建BAS开发空间;4)通过Fiori应用生成器部署RAP应用;5)创建IAM App、Business Catalog和Business Role;6)配置Launchpad Space和Pages。文章还提供

DeveloperMrMeng的博客 959

java 内部类final_Java内部类与final关键字详解

1 interfaceUSB {2 public abstract voidstart()3 }4 classOuter{5 public voidfun() {6 final int i = 1; //被匿名内部类访问的局部变量必须被final修饰7 newUSB(){8 @Override9 public voidstart(){10 ...

weixin_31435039的博客 503

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java 内部类 final_Java内部类与final关键字详解

一、内部类的几种创建方法:1、成员内部类2、方法内部类3、匿名内部类4、静态内部类5、接口内部类二、神马是内部类?乍一看,好些创建方式,挺复杂的吧?首先内部类是个啥东西?定义:创建在一个类内部的类型。根据创建位置的不同,分为成员的、方法的、匿名的。接口中的内部类叫做接口内部类。理解:在类的内部创建,那就是类的一部分,跟属性、方法同级。这也就解释了为何能访问外部私有成员,我是你的一部分,我当然可以访...

weixin_29172201的博客 294

VC中sqlite的使用

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

java重点!Final+内部类+四种权限关键字详解

final基本都可以修饰自己定义的东西 第一点关于类,public final class P这个类他可有父类(Object),但是绝不能有子类,当然依然不能重写自己的方法,但他本身可以重写它父类的方法,类似太监,没有儿子,但有父亲 关于方法,abstract抽象方法表示必须被重写,而与final意义向矛盾,两者不可同时用在同一个方法中 对于基本类型变量值是不可以改变的,但是对于引用类型,f的地址不可以改变,但是它指向对象的值是可以变的 对于成员变量,final后必须直接赋值,默认值会来搅和的,对于fin.

Gfeiyv的博客 323

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 集合详解+内部类+jar包+队列+栈+final、static关键字

大纲 一、内部类 二、IDEA打包jar包和引入jar包 三、队列和栈 四、 final和static 五、集合

cqmfx的博客——Java那些事 851

java笔记(四)[java中的import关键词&java中的javadoc用法及注释说明&java中的final关键字&java中的内部类详解]

1、 • import关键词的使用除了导入包外还可以导入静态方法和静态成员变量 2、 • 关于使用/** */生成javadoc的方法,在commend window 中转移到java文件的目录下,使用javadoc -d [doc 的输出路径] [要产生doc文件的java文件]即可在选择的目录下生成javadoc文件,关于注释中的几个关键词的解释:@author 标志开发该类模块的作者 @v

HouZhipeng 的专栏 2896

内部类,关键字

super关键字 super表示调用父类的方法 1.调用父类构造方法 : super(参数列表) 子类中调用父类无参构造时,super()可写可不写;子类调用父类有参构造时,super(参数列表)必须写,告知编译器调用的是哪个父类有参构造。 super与this在构造方法中不能同时存在,即子类不存在构造方法的互相调用。 2.super调用父类普通方法 super.方法名(参数列表) super表...

weixin_43688527的博客 352
上一篇: Android Dalvik虚拟机初识
下一篇: Java异常处理机制
flowciyu
博客等级 码龄15年 65粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值