以前理解的java中的final关键字是这样的:
public static final int num = 2;
也就是说num的值只能是2,不可改变。意味着num是一个常量了。
现在忽然有了点疑惑:
public static final Person person = new Person();
这样定义了的话,意味着什么呢?我有两种理解,不知道对不对阿:
1-person只能指向上面new的Person实例,不可以再次person = new Person();
2-出了具有1的特征以外,person的状态也不可变。比如person里有个age属性,age的值一旦确定,也不能被随意更改。
1和2哪个理解的对阿?谁能指导一下阿?我看到有人这么写:
private final Vector tasks = new Vector();
tasks.addElement(task);
而且不出错,所以有了上面的疑惑。

解决方案 »

  1.   

    final修饰的对象不可变----这里说的是对象,与对象的属性无关,也就是对象在内存中的地址不能改变...
      

  2.   

    final所修饰的那个person只是一个引用,所以说1是对的
      

  3.   

    final所修饰的那个person只是一个引用,并不是一个实际的person对象,所以说1是对的
      

  4.   

    你的两种理解都错了  这里final不变是在整个Application不改变  不代表一定不变,例如可以将它写入配置文件改变配置文件是一样的效果,加上final就是因为有多处引用,只改一处就行了
    而你下面对一个对象进行final也只对当前new的对象有效,所有不用考虑到属性
    不知道这样说理解点不
      

  5.   

    应该跟c++中的const修饰一样吧。
      

  6.   

    这个地方要稍微解释一下......
    public static final int num = 2;
    这个东西是个常量,而
    public static final Person person = new Person();
    则不是一个常量,而是一个静态的不可更改的变量。
    为什么?why?同样的定义为什么结果会不同。
    因为很简单,这是因为编译器的问题。
    编译器在编译可以直接从代码中获得或者很简单的从代码中获得的值的static final修饰符变量的时候,它会编译成对应常量。当任何一个地方调研到num这个定义的时候,编译器不会把这里的调用变成引用这个变量,而是直接在代码中写入这个常数变成常量。
    但是为什么后面的不是常量?因为这个地方本身就是个引用,而且Person();对象的句柄在内存内部不是固定的,所以是不能直接从代码中获得的值,因此任何地方的调用编译器会翻译成这个对象的引用,因此它不是常量。
    再举一个例子:
    public static final int i=Math.power(5,7);
    这个就不是一个常量,因为编译器不能直接从代码中获得值,而是要通过计算动态获得,所以其它地方对这里的调研是对这个i的引用。
    但是:
    public static final int i=5+7;
    这个地方就是常量,这里编译器可以直接得到值12,所以任何地方对这里的调研都会被编译成常数12,而不是变量i。
    通过这里,你可以明白里面的区别了么?
      

  7.   

    我觉得代码有问题public static final Person person = new Person();这个显然是要搞一个单例出来然后如果是单例的话  应该变成private  
    然后再加一个public Person getInstance(){return person;}不过不是单例  那么这样写完全没有意义
      

  8.   

    final 表示不能(再)被继承;
    static 类:可以直接调用的.
      

  9.   

    对于基本数据类型,final表示变量的值不能再被修改
    对于对象,final表示对象的地址不能再次被修改(由于变量的值为对象内存地址,其实还是变量的值不变),但是对象的成员变量可以被修改。
      

  10.   

    1是对的。也就是说该引用指向的对象不可以再变,而对象的内容可以变化。
    就像c中的const指针,指针指向的地址簿可以变化,但是该地址中存储的内容可以变化。