黑马程序员技术交流社区

标题: 匿名内部类参数不需要final了? [打印本页]

作者: zlynnb2015    时间: 2015-5-13 21:53
标题: 匿名内部类参数不需要final了?
public class TestFinal
{
    //这样定义 User user 代码顺利运行了,不是需要final么
    public void test( User user)
    {
        (new Thread()
            {
                public void run()
                    {   
                        System.out.println("user.name-->"+user.name);
                    }
            }
        ).start();  
    }
    public static void main(String[] args)
    {
        User user=new User();
        user.setId(007);
        user.setName("zhaoyang");
         
        TestFinal testFinal=new TestFinal();
        testFinal.test(user);   
    }
}


class  User
{
    String name=null;
    int id;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
     
}

按照道理上面User user应该定义成final User user,但是没有final代码照样运行,不报错。


public class Parcel10 {

//这个地方不加final也照样不报错啊
public Destination destination(String dest, float price) {
return new Destination() {

private float cost;
{
cost =Math.round(price);
if(cost>100)
{
System.out.println("over budget");
}
}
private String label = dest;

@Override
public String readLabel() {
return label;
}

};
}

public static void main(String args[]) {
Parcel10 par = new Parcel10();
par.destination("taiwang", 109.4f).readLabel();
}


}


我记得是要final  , 但是上面不加final也照样运行,求解!
作者: 灞波儿奔    时间: 2015-5-17 23:06
          1.8版本以后就不用了。
作者: iamnoten    时间: 2015-5-17 23:09
灞波儿奔 发表于 2015-5-17 23:06
1.8版本以后就不用了。

这的吗?还不知道有这功能
作者: 1017161726    时间: 2015-5-17 23:29
我的也是。我理解为现在改进了,可以不加final了。
作者: 沐沐远去    时间: 2015-5-18 00:03
大多数都没用到1.8  现在学习最好加上,并且知道为什么要加。可以百度【 内部类 final 生命周期】得到答案
作者: zlynnb2015    时间: 2015-5-18 00:14
灞波儿奔 发表于 2015-5-17 23:06
1.8版本以后就不用了。

谢谢 ,我知道了
作者: rick1991chen    时间: 2015-5-19 23:24
这题目有点没看懂,难道不是因为线程一直在跑 所以匿名对象不会消亡?
作者: hzhzhen    时间: 2015-5-20 12:24
新版本就不用了吧。。。。。
作者: pvbj0314    时间: 2015-5-20 21:43
1.8以后,并非不用是final的,而是在编译期间要求值不发生变化。在你的代码中,如果user的值变化了,就会出错。
编译如下代码:
  1. public class TestFinal
  2. {
  3.     //这样代码就不能通过编译了
  4.     public void test( User user)
  5.     {
  6.         user = new User();
  7.         user.setName("zhaoyang");
  8.         (new Thread()
  9.             {
  10.                 public void run()
  11.                     {   
  12.                         System.out.println("user.name-->"+user.name);
  13.                     }
  14.             }
  15.         ).start();  
  16.     }
  17.     public static void main(String[] args)
  18.     {
  19.         User user=new User();
  20.         user.setId(007);
  21.         user.setName("zhaoyang");
  22.          
  23.         TestFinal testFinal=new TestFinal();
  24.         testFinal.test(user);   
  25.     }
  26. }


  27. class  User
  28. {
  29.     String name=null;
  30.     int id;
  31.     public String getName() {
  32.         return name;
  33.     }
  34.     public void setName(String name) {
  35.         this.name = name;
  36.     }
  37.     public int getId() {
  38.         return id;
  39.     }
  40.     public void setId(int id) {
  41.         this.id = id;
  42.     }
  43.      
  44. }
复制代码

你会得到类似下面的错误:
TestFinal.java:12: 错误: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
                        System.out.println("user.name-->"+user.name);
作者: zhangjnia    时间: 2015-5-20 22:09
好高级,学习了
作者: 18463730277    时间: 2015-5-20 22:23
iamnoten 发表于 2015-5-17 23:09
这的吗?还不知道有这功能

有很大的改动么




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