java final成员变量吗_阳光沙滩博客-为什么Java匿名内部内使用局部变量需要加final?而访问成员变量却不用加final呢?...
前置知识
内存数据区域(Java内存结构)
在解析这个问题之前,得先有一些前置知识。
比如说,要知道什么是堆,什么是栈,什么是方法区,这数据区域存放什么内容?
可以参考这篇文章:
栈里面存放方法内容
比如说以下代码:
public class App {
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
System.out.println("hello world");
sayBye();
}
private static void sayBye() {
System.out.println("good bye...");
doSum();
}
private static void doSum() {
int a = 10;
int b = 29;
int sum = a + b;
System.out.println("sum is -- > " + sum);
}
}
打个断点
第一个方法都压进栈里
这里每一个Item叫做栈帧,也就是frame
执行的时候就Pop出去,顶部的先出栈,执行完毕。
所以如果是递归的话,一直压栈,容易导致栈内存溢出。
final关键字
这个我相信大家都知道,因为面试常问
final 修饰的变量值不能被修改,一般定义常量用此修饰
final 修饰的类不能被继承,比如说String
final 修饰的方法不可以被覆写
提个问题
final User user = new User("zhangsan",18);
用final修饰了一个成员,这个成员是User,里面有名称和年龄的属性。我可经修改它的年龄吗?
可以,只是你的user不能再指向其他对象。这个对象里的值还是可以修改的。所以,final修饰的对象,对象的属性是可以修改的。
案例
给我们的RecyclerView的Item设置点击事件。
@Override
public void onBindViewHolder(@NonNull InnerHolder holder,int position) {
TextView itemTv = holder.itemView.findViewById(R.id.left_category_tv);
if(mCurrentSelectedPosition == position) {
itemTv.setBackgroundColor(itemTv.getResources().getColor(R.color.colorEEEEEE,null));
} else {
itemTv.setBackgroundColor(itemTv.getResources().getColor(R.color.white,null));
}
final SelectedPageCategory.DataBean dataBean = mData.get(position);
itemTv.setText(dataBean.getFavorites_title());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mItemClickListener != null && mCurrentSelectedPosition != position) {
//修改当前选中的位置
mCurrentSelectedPosition = position;
mItemClickListener.onLeftItemClick(dataBean);
notifyDataSetChanged();
}
}
});
}
我们给item设置了点击事件,而里面的匿名内部类使用到了方法里的局部变量
final SelectedPageCategory.DataBean dataBean = mData.get(position);
为什么要加final呢?
因为我们的方法调用时在栈里,出栈执行,就会释放掉了。
所以就没有dataBean 这个数据了。而创建的对象 ,在堆里,地址引用给了ItemView的onClickListener成员。
所以两者的声明周期不一样。dataBean 的声明周期在此方法执行完就释放了。
而匿名对象还在。为什么要加final呢?
前面我们说了,加了final修饰的变量则为常量,不可以改变其值。
而匿名内部类里用到的那个dataBean,是复制了一份到里面的方法里。这个打断点就知道了,可以看到当方法执行的时候,会在栈内存里有此变量。
有了final修饰,就是确保一致性。
为什么成员变量则不需要加final呢?
我们匿名内部类使用成员变量时,不需要加final,为什么呢?
我们的成员变量保存在哪里呢?我们创建对象的时候,会在堆内存里开新空间。堆内存什么时候回收,GC回收对吧。GC回收有一定的规则,对象没有被引用了才会去回收。
比如说标记-清除算法,标记-压缩算法,复制算法,分代收集算法。
所以确保了数据的一致性。
java final成员变量吗_阳光沙滩博客-为什么Java匿名内部内使用局部变量需要加final?而访问成员变量却不用加final呢?...相关推荐
- android 采集cpu温度,阳光沙滩博客-Android开发如何读取到CPU,内存等硬件温度信息?...
Android开发如何读取到CPU,内存,温度等硬件信息? 最近在玩跑跑卡丁车,有一个面板显示着电呀,CPU使用,内存等情况 于是就来写这篇文章啦 以前我也做过CPU温度,频率之类的数据读取,那时我做 ...
- android中串口转u口,阳光沙滩博客-Android——USB转COM口(CH340)与传感器进行通讯...
本人使用环境 CH340转接头 Android5.1,RK3188 Android6.0,RK3288 关于CH34官方的jar包与使用存在的问题(官方地址) 最大的问题是无法修改串口波特率,一直以1 ...
- linux用vim修改字符串,阳光沙滩博客-Linux下 vi/vim的使用
概述 vi编辑器是所有Unix及Linux系统下标准的编辑器,功能强大.这里只是简单地介绍一下它的用法和一小部分命令. vi基本可以分为三种状态,分别是命令模式(command mode).插入模式( ...
- 博客系统[Java]
目录 一.准备工作 二.实现数据库代码(JDBC) 1.创建数据库/表结构==>数据库设计 2.封装数据库(Model) 1>创建DBtil封装数据库连接操作 2>创建实体类--&g ...
- cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客
cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客 Cadence Allegro16.5详细安装具体的步骤 1.下载SPB16.5下来后,点setup.exe,先安装第一项 ...
- Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客
Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客 Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf (2009-07- ...
- 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf
深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf
- 邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客
邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客 邓文迪撑杆跳,甩开老公要独立? (2010-01-11 10:55:22) 转载▼
- 关于幂律分布的一个笔记_哈克_新浪博客
关于幂律分布的一个笔记_哈克_新浪博客 关于幂律分布的一个笔记 (2011-03-02 18:12:27) 转载▼ 标签: 幂律 二八法则 杂谈 ...
最新文章
- Ansible to install roles
- arcgis下的python编程-面向ArcGIS的Python脚本编程
- 道格拉斯-普克 Douglas-Peuker(DP算法) python java实现
- C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件
- [Python] L1-055 谁是赢家-PAT团体程序设计天梯赛GPLT
- 直播疑难杂症排查(1)— 播放失败
- mt6765和骁龙665哪个好_华为都把骁龙850用在了自家的win10设备上了,麒麟还会远吗?...
- LINUX内核内存管理kmalloc,vmalloc
- 现代通信原理A.3:随机信号的功率谱估计
- AD PCBlayout 总结
- Broker启动历史数据加载
- 依锥彻怕燎方跃涣牧叵邻牟辟岗俅
- 70个Python实用练手项目(附源码)
- 《5G NR标准:下一代无线通信技术》读书笔记——LTE概述
- 云端课堂未能连接到服务器,云端课堂如何登录?详细步骤、流程介绍
- Java 经典设计模式-- 05.并发型模式
- omv5没有MySQL插件_omv4通过插件安装的plex无法启动了
- Adobe Flash助手推荐广告关闭
- React项目-点餐后台管理系统-react框架实现后台管理系统(包含权限处理)--新手入坑必看!(一)
- 【UEFI实战】LinuxBoot
热门文章
- 震撼来袭!葡萄城商业智能报表软件Wyn Enterprise V5.0发布会前瞻,3大亮点抢先看
- python网络编程能用来做什么_python网络编程是什么意思
- mysql查询性别语句_MySQL查询语句简单操作示例
- echart各个柱体设置不同颜色
- PowerVM 高级功能——N_PIV
- 0110 - 给 iPhone 6 换了电池
- Spark集群中HA环境搭建
- NovAtel 板卡OEM617D配置步骤记录
- Android studio 报错Multiple annotations of type `dalvik.annotation.EnclosingClass`
- Windows 10:开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用 的解决方法