静态和最终

时间:2017-07-29 15:32:44

标签: java

我正在尝试编译此代码

public class Foo {
    static final int x = 18;

    public void go(final int y){
        System.out.println(x);
    }
}

public class Mixed2 {
    public static void main(String[] args){

         Foo f = new Foo();
        f.go(11);
    }
}

它被编译。甚至给出结果(18) 但这不是必须的。为什么会这样? 我用这个主意 谢谢

2 个答案:

答案 0 :(得分:0)

据我所知,您想知道为什么代码在以下情况下有效,当您预期它会抛出错误时。

在这种情况下,您不是要更改字段x,而只是添加一个具有相同名称的新变量,以覆盖(阴影)字段x

public class Foo {
    static final int x = 18; // field x

    // This creates a new variable x which hides the field x above
    public void go(final int x /* variable x */) {
        System.out.println(x);
    }
}

在接下来的两种情况下,您尝试更改x,这将导致错误:

public class Foo {
    static final int x = 18; // field x

    // The field x is final and cannot be changed.
    public void go() {
        x += 1;
    }
}

public class Foo {
    static final int x = 18; // field x

    // The variable x is final and cannot be changed.
    public void go(final int x /* variable x */) {
        x += 1;
    }
}

旧答案:如果您尝试打印11,则应拨打System.out.println(y)而不是x

尝试使用一些Java教程,仔细查看代码和变量名称。

答案 1 :(得分:0)

事实是,你不能改变最终的值 ...但是,你没有改变任何最终数字,如果你是,你会得到编译器错误,而不是例外。< / p>

了解静态和最终之间的差异非常重要:

  • 静态使所有类之间的变量相同 - 将process()更改为静态仍然允许您访问它,但使process()静态并从go()中删除静态将阻止您引用go(),因为x函数不知道要查找x的{​​{1}}个类。
  • 最终使变量不可更改 - 我不知道任何性能原因,但主要是常量。
    • 例如,您不希望能够将Boolean.TRUE的值设置为false
go()