为什么我的代码没有给出编译错误?

时间:2013-03-02 16:17:43

标签: java

在下面的代码中,我将数据分配给最终对象。但是没有得到编译错误。

class Name {
    private String name;

    public Name (String s) {
        this.name = s;
    }

    public void setName(String s) {
        this.name = s;
    }
}

private void test (final Name n) {
    n.setName("test");//here exception coming but not giving compile error
}

2 个答案:

答案 0 :(得分:6)

因为final适用于引用n,而不是n引用的对象。

所以你不能做到这一点:

n = new Name("test");

答案 1 :(得分:5)

来自Java Language Specification

  

一旦指定了最终变量,它总是包含相同的值。 如果最终变量包含对象的引用,则对象的状态可能会被对象上的操作更改,但变量将始终引用同一对象。

因此可以操纵n

指向的对象状态
private void test(final Name n) {
    n.setName("test");
}

但你不能让n存储另一个对象

private void test(final Name n) {
    n = new Name("test"); //Can't do this
}