前置知识

内存数据区域(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呢?...相关推荐

  1. android 采集cpu温度,阳光沙滩博客-Android开发如何读取到CPU,内存等硬件温度信息?...

    Android开发如何读取到CPU,内存,温度等硬件信息? 最近在玩跑跑卡丁车,有一个面板显示着电呀,CPU使用,内存等情况 于是就来写这篇文章啦 以前我也做过CPU温度,频率之类的数据读取,那时我做 ...

  2. android中串口转u口,阳光沙滩博客-Android——USB转COM口(CH340)与传感器进行通讯...

    本人使用环境 CH340转接头 Android5.1,RK3188 Android6.0,RK3288 关于CH34官方的jar包与使用存在的问题(官方地址) 最大的问题是无法修改串口波特率,一直以1 ...

  3. linux用vim修改字符串,阳光沙滩博客-Linux下 vi/vim的使用

    概述 vi编辑器是所有Unix及Linux系统下标准的编辑器,功能强大.这里只是简单地介绍一下它的用法和一小部分命令. vi基本可以分为三种状态,分别是命令模式(command mode).插入模式( ...

  4. 博客系统[Java]

    目录 一.准备工作 二.实现数据库代码(JDBC) 1.创建数据库/表结构==>数据库设计 2.封装数据库(Model) 1>创建DBtil封装数据库连接操作 2>创建实体类--&g ...

  5. cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客

    cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客 Cadence Allegro16.5详细安装具体的步骤 1.下载SPB16.5下来后,点setup.exe,先安装第一项 ...

  6. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客

    Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客 Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf     (2009-07- ...

  7. 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

    深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

  8. 邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客

    邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客 邓文迪撑杆跳,甩开老公要独立? (2010-01-11 10:55:22) 转载▼

  9. 关于幂律分布的一个笔记_哈克_新浪博客

    关于幂律分布的一个笔记_哈克_新浪博客 关于幂律分布的一个笔记     (2011-03-02 18:12:27)     转载▼     标签:     幂律     二八法则     杂谈     ...

最新文章

  1. Ansible to install roles
  2. arcgis下的python编程-面向ArcGIS的Python脚本编程
  3. 道格拉斯-普克 Douglas-Peuker(DP算法) python java实现
  4. C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件
  5. [Python] L1-055 谁是赢家-PAT团体程序设计天梯赛GPLT
  6. 直播疑难杂症排查(1)— 播放失败
  7. mt6765和骁龙665哪个好_华为都把骁龙850用在了自家的win10设备上了,麒麟还会远吗?...
  8. LINUX内核内存管理kmalloc,vmalloc
  9. 现代通信原理A.3:随机信号的功率谱估计
  10. AD PCBlayout 总结
  11. Broker启动历史数据加载
  12. 依锥彻怕燎方跃涣牧叵邻牟辟岗俅
  13. 70个Python实用练手项目(附源码)
  14. 《5G NR标准:下一代无线通信技术》读书笔记——LTE概述
  15. 云端课堂未能连接到服务器,云端课堂如何登录?详细步骤、流程介绍
  16. Java 经典设计模式-- 05.并发型模式
  17. omv5没有MySQL插件_omv4通过插件安装的plex无法启动了
  18. Adobe Flash助手推荐广告关闭
  19. React项目-点餐后台管理系统-react框架实现后台管理系统(包含权限处理)--新手入坑必看!(一)
  20. 【UEFI实战】LinuxBoot

热门文章

  1. 震撼来袭!葡萄城商业智能报表软件Wyn Enterprise V5.0发布会前瞻,3大亮点抢先看
  2. python网络编程能用来做什么_python网络编程是什么意思
  3. mysql查询性别语句_MySQL查询语句简单操作示例
  4. echart各个柱体设置不同颜色
  5. PowerVM 高级功能——N_PIV
  6. 0110 - 给 iPhone 6 换了电池
  7. Spark集群中HA环境搭建
  8. NovAtel 板卡OEM617D配置步骤记录
  9. Android studio 报错Multiple annotations of type `dalvik.annotation.EnclosingClass`
  10. Windows 10:开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用 的解决方法