查看: 324|回复: 0

关于java的几个问题


19-2-15 20:40:42 | [复制链接]

1

主题

2

帖子

8

积分

菜鸟

Rank: 1

发表于 19-2-15 20:40:42 | 显示全部楼层 |阅读模式
  • Java 局部内部类访问局部变量为什么必须加final关键字

    • 生命周期不同
      • 因为局部变量直接存储在栈中,当方法执行结束,非final的局部变量就被销毁,而局部内部类对局部变量的引用依然存在,当局部内部类要调用局部变量时,就会出错,出现非法引用。
    • 数据不同步
      • 内部类并不是直接使用传递进来的参数,而是将传递进来的参数通过自己的构造器备份到自己内部,表面看是同一个变量,实际调用的是自己的属性而不是外部类方法的参数,如果在内部类中,修改了这些参数,并不会对外部变量产生影响,仅仅改变局部内部类中备份的参数。但是在外部调用时发现值并没有被修改,这种问题就会很尴尬,造成数据不同步。所以使用final避免数据不同步的问题
      • 注意
        • 在Java8 中,被局部内部类引用的局部变量,默认添加final,所以不需要添加final关键词

    • 原理
      • 那为什么添加final修饰的局部变量,就可以被局部内部类引用呢?
        • 若定义为final,则java编译器则会在内部类内生成一个外部变量的拷贝,而且可以既可以保证内部类可以引用外部属性,又能保证值的唯一性

    • 结论
      • 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final保证数据不可修改

  • 整数缓冲区
    • 与自动装箱和拆箱有点关系的,代码如下所示
    • 如果不明就里很容易认为两个输出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象引用,所以下面的==运算比较的不是值而是引用。装箱的本质是什么呢?当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf的源代码就知道发生了什么。

    • IntegerCache是Integer的内部类,其代码如下所示
    • 结论
      • 如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。

  • java异常中的finally

    • 含有return语句的情况:
      • try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:
      • 情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。
      • 情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。
      • 情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:
        • 1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
        • 2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

    • 如果try和finally语句里面都有return,会执行哪一个呢?
      • 首先,在程序没有异常的情况下,首先执行到try里面的语句,但是只执行到了return里面的expression,expression首先存放在操作数栈顶,然后复制到局部变量区,并没有执行返回语句return(执行返回语句通常意味着程序执行结束)。然后执行finally,当执行到finally里面的return时候,会将return语句执行完整,此时程序已经有了返回值,因为,执行结束。
    • 结论
      • 执行try块,执行到return语句时,先执行return的语句,但是不返回到main 方法,接下来执行finally块,遇到finally块中的return语句,执行,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

最新活动

  • 1024程序员节刚过 千锋教育设计学院万圣节海报设计决赛开启

千锋教育公众号

订阅|小黑屋|手机版|千锋教育论坛 ( 京ICP备12003911号-3 )

GMT+8, 20-2-24 16:54 , Processed in 0.282797 second(s), 38 queries .

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表