为什么内部类 可以访问外面不是final的变量。 下面是2个一模一样的代码 我朋友 是报错了

为什么内部类 可以访问外面不是final的变量。 下面是2个一模一样的代码 我朋友 是报错了 因为 int it315 不是final 这和书上说的一样。但是。为什么我这样写却没有报错?

局部内部类访问方法中的参数时,需要加上final修饰符,但是这个final并不是不可以覆盖,只是代表一种标识。你的没有报错是因为你的是在方法中调用一个内部类的属性,当然没问题


图片是我在学SE时做的笔记

追问

那为什么我朋友的报错了

而且 书上也说 要求写final

追答

之前看错了……
你确定你又运行了吗?
控制台的打印是之前的吧?

追问

我朋友的吗。还是我的?

我的是运行成功了

我朋友 一直报错。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-12-06
  你好。简单点说吧,没有代码。你使用的是JRE1.7,而你朋友是JRE1.8。Java8的特性我不多说,网上资料一大把。
  它的文档里有这么一句话:
  starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final(http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html
  我英文不好啊,大意就是在Java8里的局部类可以访问这个类里的变量和方法的参数,前提是它是个常量或者实际上就是个常量的变量。
  其作用就是简化代码,“实际上就是个常量的变量”(我这么理解的),它本身是类的成员变量或者方法内的变量或参数,但只要被内部类使用了,就会隐式的将它转换为内部类使用常量。

  你知道Java的值传递和引用传递,实际上像int、long这样的基本类型和String,传到给方法后,你在外部改变这个值是影响不到方法内部运行的。
  而其它类是传递给方法它所引用的对象,即使你在该方法外写obj = null;也只是改变了引用变量而不是对象,毕竟传递给方法的是对象,final obj和非final的obj操作起来其实就是毫无区别。
  以前在使用内部类调用外部类属性时要求转换为final 变量,这毫无意义啊,仅仅是标识它不可再被改变,然后用起来繁琐了。Java8做了改变,不管你的变量值和对象怎么变化,只要使用前的最终就好了。

  最后呢,学习两个版本还是挺好的,Java8还是不错的,它有语法上的改变,有必要学学。Java6和7虽然使用广泛一些,但毕竟过时了。另外还有Java9,等oracle正式发布了再去看看吧。追问

谢谢

本回答被提问者采纳
第2个回答  2015-05-03
这图片看不懂,电脑截图看一下吧追问

等等
我吧代码发给你看看吧

照理说 在打印it315 那里。应该报错的。因为 需要final

但是。为什么 我那个可以运行。并且不会报错?

追答

我这边看不到代码

追问

图片看不清?吗

因为我 电脑不在身边。这是刚才的截图

2个代码一模一样的 我朋友不能运行。我却可以

相似回答