黑马程序员技术交流社区

标题: final修饰的数据会改变在内存中的存储位置么? [打印本页]

作者: L.I.F.E    时间: 2013-6-25 19:06
标题: final修饰的数据会改变在内存中的存储位置么?
本帖最后由 孙百鑫 于 2013-6-27 07:41 编辑

求详解,个人感觉不会!
作者: 贾永长    时间: 2013-6-25 19:14
final修饰的数据对数据在内存中的存储位置没有任何影响的。
作者: 万琪    时间: 2013-6-25 19:20
只是终态的话,,没有静态,,
是会的,,因为在方法栈里

  final关键字无非修饰两种变量,一是全局变量,当修饰全局变量的时候,作用域自然是全局,另一种是修饰局部变量,这里要注意,java中不同于c语言中,即时使用final修饰了局部变量,并没有改变该变量的作用域,当这个方法执行完毕之后,就会释放掉这个方法的帧内存。变量就被销毁了,堆里的对象等待gc回收。

第一种情况:作为全局常量来使用,定义的时候就要进行显示初始化,如果定义的时候不进行显示初始化,则必须在构造函数里进行初始化。

class Student {
    String name;
    int age;
    final Teacher tc;
    public void study(){
    }
    public Student(String name,int age){
        tc = new Teacher();
    }
    public Student(){
        this(null, 0);
    }
}
class Teacher{
    int num;
    String name;
    int age;
}


第二种情况,在函数中使用,

public void startThread(){
        final Student stumain = new Student();
        final Teacher teacher;
        new Thread(new Runnable(){
            @Override
            public void run() {
                stumain.study();
teacher = new Teacher();//这行代码是报错的
            }
        }).start();
    }




作者: ︶ㄣ紫藤ㄜ︵    时间: 2013-6-25 19:39
是终态的,定义为final 将无法修改,一般为了安全会这样用,或者写死一些东西,比如说男女。
作者: HM张博文    时间: 2013-6-25 23:02
常量,肯定不会啦
作者: 刘_鑫    时间: 2013-6-25 23:22
final关键字对于变量的存储区域是没有任何影响的。jvm规范中,类的静态变量存储在方法区,实例变量存储在堆区。也就是说static关键字才对变量的存储区域造成影响。
final关键字来修饰变量表明了该变量一旦赋值就无法更改。同时编译器必须保证该变量在使用前被初始化赋值。
作者: 孙百鑫    时间: 2013-6-27 07:41
楼主您好。我已将您的帖子改成已解决。如果帖子发布长时间没加分。及时联系我。以免漏分的情况发生{:soso_e100:}




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