黑马程序员技术交流社区

标题: 一个关于局部内部类的问题 [打印本页]

作者: 左建飞    时间: 2012-8-14 21:06
标题: 一个关于局部内部类的问题
  1. class Outer
  2. {

  3.         void method()
  4.         {
  5.                 final StringBuffer a=new StringBuffer("immutable");
  6.                 final Integer b=5;
  7.                 class Inner
  8.                 {
  9.                         void funnction()
  10.                         {
  11.                                 a.append(" broken!");
  12.                                 b=b+1;
  13.                         }
  14.                 }
  15.                 new Inner().funnction();
  16.         }
  17. }
复制代码
为什么a所指的对象在a被final修饰后可以改变,而b就不行呢?
还有既然a所指的对象的值可以改变,那么,局部内部类要访问的变量要被final修饰这个规则还能起作用么?求解释。

作者: 杨彪    时间: 2012-8-14 21:12
本帖最后由 杨彪 于 2012-8-14 21:15 编辑

final 修饰 a 修饰的是对像  修饰的对象不能被重写 而参数可以改变
final 修饰 b修饰的是变量,而final修饰的变量的值不能被改变。其实就是一个常量
final关键字
        (1)最终的意思,可以用于修饰类,方法,变量。
        (2)final修饰的类不能被继承。
           final修饰的方法不能被重写。
          final修饰的变量的值不能被改变。其实就是一个常量。
作者: 方志亮    时间: 2012-8-14 21:18
final是修饰变量的,不是修饰对象本身的
String,StringBuffer一个是在堆上建的,一个是在栈上建的

举例说明:
final String s = "hello";
这里final是修饰变量s的,而不是修饰"hello"
至于说String不能修改,是因为String类是immutable的,就是不能修改的意思,immutable也是一个修饰符

final StringBuffer sb = new StringBuffer("hello");
这里final修饰了sb,sb就不能指向其它对象了
比如sb = new StringBuffer("hi");这样是不允许的
但是sb所指向的那个对象本身还是可以改变的
比如sb.append(" world");是允许的,因为sb并没有变,sb仍然指向的是那个对象,变化的是对象本身
作者: 杨健yj    时间: 2012-8-14 22:38
本帖最后由 杨健yj 于 2012-8-14 22:44 编辑

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的
我们之所以会产生问题是因为我们通常会想到赋值变量如final a =5;我们就会认为a的值不可以改变了就
是5这是对的。但当变量a变成引用型变量时,我们可能就会纳闷了。如final b = new Person()
  1. class Person
  2. {
  3.         public String name="wang";
  4. }
复制代码
然后我们就会认为b所代表的这个Person对象不能改变(改变名字b.name="li"),实际上这样理解是错误的。
这样的知识我们可以敲一下代码实验下就会知道当我们做b.name="li"编译没有错误,那是怎么回事呢。
问题就是final修饰的是b,b此刻的值为一个地址值,只要b的值没有改变就符合final,和他所指的对象是否
改变没有关系。然而b=new Person(),这样就会报错,因为改变了b的值,所以final修饰的是变量本身的值不变就
可以,与其他无关。
对于内部类当然适用啊
  1. class Outer
  2. {

  3. void method()
  4. {
  5. final StringBuffer a=new StringBuffer("immutable");
  6. final Integer b=5;
  7. class Inner
  8. {
  9. void funnction()
  10. {
  11. a.append(" broken!");//这里a所指的对象的内容变了,但a所指对象的地址没改变,正确
  12. b=b+1;//这里b的值改变了所以会报错的
  13. }
  14. }
  15. new Inner().funnction();
  16. }
  17. }
复制代码

作者: 左建飞    时间: 2012-8-14 23:35
哦了,已解决!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2