黑马程序员技术交流社区

标题: 关于final疑问 [打印本页]

作者: uu993    时间: 2014-6-10 19:05
标题: 关于final疑问
当利用final修饰一个属性(变量)的时候,此时的属性成为常量。  

举例:
Final int AGE=10;  
常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。

不知道这句话是什么意思,既然final定义了AGE为常量,AGE=10就应该不会再变化,
但是为什么说地址中保存的值会变化。
到底final定义了常量之后值还会不会变化呀?


作者: 赵洋洋    时间: 2014-6-10 19:10
就是说可以在此给AGE复另一个值吧原来的值覆盖掉
作者: axuan    时间: 2014-6-10 19:19
final修饰基本数据类型表示该属性不能被改写,修饰引用数据类型表示该应用不能再指向其他对象,但对象的内容可以发生变化。对象是引用!
作者: uu993    时间: 2014-6-10 19:20
axuan 发表于 2014-6-10 19:19
final修饰基本数据类型表示该属性不能被改写,修饰引用数据类型表示该应用不能再指向其他对象,但对象的内 ...

能给写段小代码,指点一下吗?
作者: 不去会死    时间: 2014-6-10 19:22
public class JavaTest {
public static void main(String[] args){
        for(int i = 0; i < 3; i++){
        final int t = i;//final变量被多次赋值
        System.out.print(t+" ");//输出结果:0 1 2 3
        }
}
这个应该能够说明一些问题

作者: uu993    时间: 2014-6-10 19:32
不去会死 发表于 2014-6-10 19:22
public class JavaTest {
public static void main(String[] args){
        for(int i = 0; i < 3; i++){

明白了好像~
作者: axuan    时间: 2014-6-10 19:32
uu993 发表于 2014-6-10 19:20
能给写段小代码,指点一下吗?

好,代码说明
package test;


class Student
{
        private String name;

        public String getName()
        {
                return name;
        }

        public void setName(String name)
        {
                this.name = name;
        }
       
}
public class test1
{
        private final static Student s=new Student();;
    public static void main(String[] args)
        {
                s.setName("张三");
                System.out.println(s.getName());//张三
                s.setName("李四");
                System.out.println(s.getName());
        }
}

作者: axuan    时间: 2014-6-10 19:33
附加图片
package test;


class Student
{
        private String name;

        public String getName()
        {
                return name;
        }

        public void setName(String name)
        {
                this.name = name;
        }
       
}
public class test1
{
        private final static Student s=new Student();;
    public static void main(String[] args)
        {
                s.setName("张三");
                System.out.println(s.getName());//张三
                s.setName("李四");
                System.out.println(s.getName());
        }
}

捕获.JPG (177.77 KB, 下载次数: 14)

捕获.JPG

作者: uu993    时间: 2014-6-10 19:39
axuan 发表于 2014-6-10 19:32
好,代码说明
package test;

嗯,明白了,修饰引用数据类型表示该应用不能再指向其他对象,但是可以修改对象的内容。不过貌似private和static都是系统默认添加final修饰符的~
作者: axuan    时间: 2014-6-10 19:42
uu993 发表于 2014-6-10 19:39
嗯,明白了,修饰引用数据类型表示该应用不能再指向其他对象,但是可以修改对象的内容。不过貌似private ...

给我点个支持呗
作者: liujie445012100    时间: 2014-6-10 21:49
基本数据类型的被final后值无法改变,否则编译报错,引用数据类型被final指向的地址无法改变
作者: 江祖贇    时间: 2014-6-11 01:05
final修饰的基本类型变量值不可变,,修饰的引用类型的值也就是地址,不可变,可变的是地址指向的内容是可变的。




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