当前位置: 首页 > 编程笔记 >

Android源码中final关键字的用法及final,finally,finalize的区别

弘和同
2023-03-14
本文向大家介绍Android源码中final关键字的用法及final,finally,finalize的区别,包括了Android源码中final关键字的用法及final,finally,finalize的区别的使用技巧和注意事项,需要的朋友参考一下

hi 大家好,今日,天气剧变,非常冷,不想出门,于是给大家写了篇文章,关于android final关键字及final,finally,finalize的区别相关知识,具体详情如下所示:

先预告一下,下文中仅涉及java语法的讨论,和Android源码关系不大,请不要有阅读压力。

我发现在Android的源码中很多地方对final关键字的用法很是“别出心裁”,之所以这么说是因为我从没看过是这么使用final关键字的,一个典型的例子是View类中onScrollChanged方法(不妨将其成为方案一):

  protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    mBackgroundSizeChanged = true;
    final AttachInfo ai = mAttachInfo;
    if (ai != null) {
      ai.mViewScrollChanged = true;
    }
  }

看到了吗?此处mAttachInfo是View类的一个成员变量,而在这个方法中Android的程序员并没有直接操作mAttachInfo变量,而是先赋值给一个标明为final的局部变量ai,然后再操作这个ai。

这个写法我很是想不通,这不是多此一举吗?但是仔细想想又觉得没这么简单,身经百战的Android开发小组这么写应该不会是空穴来风,难道这种写法真的有其他的目的?

想了很久也猜了很久,有个念头突然蹦了出来,难道这种写法是因为多线程编程的需要?考虑下面这种写法(不妨将其成为方案二):

 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    mBackgroundSizeChanged = true;
 
    if (mAttachInfo != null) { // #1
      mAttachInfo.mViewScrollChanged = true; // #2
    }
  }

在上面这种写法中,取消了final的局部变量ai而直接操作mAttachInfo。考虑这样一种场景,假设线程A执行完#1将要执行#2时,突然有另外一个线程B在其他地方对mAttachInfo做了修改,将其指向了另外一个对象,那么线程A执行到#2时,操作的将是这个新的对象而不是原对象,而在方案一中,则可以避免这种现象。

Android开发的学习流程 final,finally,finalize的区别

Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖而出就显得十分必要,虽然Android开发行业薪资高,潜力大,但人往高处走,有更大的上升空间就一定要抓住机会,Android开发行业其实很简单,高技能行业行业唯一重要的要求就是技能,所以学好Android开发直接关系到未来的职业发展,千锋Android培训机构作为行业最具权威的Android研发和人才培训中心,是教育局教育管理信息中心认证的全国移动互联网人才实训基地,专业的教学和完善的系统培养了大批高技能Android开发人才,千锋重视学员的基础和后续发展,从Java开始魔鬼式高强度代码训练,Android应用开发和Android游戏开发让学员拥有拿到高薪的实力,项目实战把理论知识系统的与项目结合,增加学员的开发经验。

  Android初始阶段的学习在Java培训的过程中,final,finally,finalize是有区别的:

  Final:用于声明属性、方法和类。修饰的是基本类型,就表示这个变量被赋予的值是不可变的,即它是个常量;final修饰的方法不能被子类重写,但不影响子类的继承;final修饰的类不能被继承 。

  Finally:只用在try-catch-finally语句中,不论有异常还是没有异常,这段语句最终总被执行。

  Finalize:此方法是Object类中的一个方法(所有类都有这个方法),是GC(garbage collertor)运行机制的一部分,是在GC清理它所从属的对象时被调用的,如果执行它的过成中抛出了无法捕获的异常,GC将终止对该对象的清理,并且该异常会被忽略,知道下一次GC开始清理这个对象时,它的Finalize()会被再次调用,调用他们的作用只是建议GC启动,清理无用对象释放内存空间,但GC的启动并不是一定的,这由java虚拟机来决定,知道java虚拟机停止运行。

 类似资料:
  • 本文向大家介绍final、finally、finalize 的区别?相关面试题,主要包含被问及final、finally、finalize 的区别?时的应答技巧和注意事项,需要的朋友参考一下 final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。 finally:是 try{} catch{} finally{} 最后一部分,表示不论发生

  • 本文向大家介绍Java中Final,Finally和Finalize之间的区别,包括了Java中Final,Finally和Finalize之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解Java中“Final”、“Finally”和“Finalize”之间的区别。 Final 它是一个关键字。 它用于对类,方法和变量施加限制。 它不能被继承。 它不能被覆盖。 final方

  • 问题内容: 在Java中,目的是什么做的关键字,并履行? 问题答案: 可用于标记变量“不可更改” 也可以使方法“不可替代” 也可以使类不是“可继承的”。即该类不能被子类化。 最后 在try / catch语句中用于“始终”执行代码 Java 7有一个新的try with resources语句 ,可用于自动关闭显式或隐式实现java.io.Closeable或java.lang.AutoClose

  • 本文向大家介绍请说明一下final, finally, finalize的区别。相关面试题,主要包含被问及请说明一下final, finally, finalize的区别。时的应答技巧和注意事项,需要的朋友参考一下 考察点:声明 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Objec

  • 问题内容: 在尝试做一些尝试时,我遇到了一个在本页中描述的问题。 为什么可以使用这种功能?我不知道为什么仅通过覆盖方法就可以将最终参数设置为非最终参数。为什么在方法签名中忽略了final关键字?以及如何让子类在其方法中使用最终变量? 问题答案: Java通过值将参数传递给方法。 因此,对参数的任何更改都不能传播回调用方。由此可见,无论是否声明参数,对调用者而言绝对没有区别。因此,它是方法 实现 的

  • 问题内容: 我经常遇到如下所示的方法: 如果在未传递最终参数的情况下调用此方法会发生什么。例如,可以将稍后更改的Object1(因此未声明为final)传递给此方法 问题答案: Java总是在将参数发送给方法之前先对其进行复制。这意味着最终的调用代码没有任何区别。这仅意味着无法在方法内部重新分配变量。(请注意,如果你有最终对象,则仍然可以更改对象的属性)。

  • 本文向大家介绍举例讲解Java中final关键字的用法,包括了举例讲解Java中final关键字的用法的使用技巧和注意事项,需要的朋友参考一下 1. final variable final variable 就是一个常量,一旦被初始化就不可以被改变。 输出: (1)Blank final variable 在声明时未初始化的 final variable 被称作 blank final vari

  • Dart中的和关键字有什么区别?