Java中的最终variables操作

任何人都可以告诉我什么是Java的上下文行的意义:

finalvariables仍然可以被操纵,除非它是不可变的

据我所知,通过声明任何variables为最终的,你不能再改变它,那么它们对于上面那行不可改变的单词意味着什么?

这意味着如果你的最终variables是一个引用types(即不是像int这样的原始types),那么它只是引用不能改变。 不能引用不同的对象,但是它引用的对象的字段仍然可以改变,如果类允许的话。 例如:

final StringBuffer s = new StringBuffer(); 

StringBuffer的内容仍然可以任意改变:

 s.append("something"); 

但是你不能说:

 s = null; 

要么

 s = anotherBuffer; 

另一方面:

 final String s = ""; 

string是不可变的 – 没有任何方法可以让你改变一个string(除非你使用reflection – 并去地狱)。

如果你有一个Java对象的最终引用,你仍然可以操作它,但是不能改变它的引用。 例如,这个代码是完全合法的:

 import javax.swing.JLabel; class Test1 { private final static JLabel l = new JLabel("Old text"); public static void main(String[] args) { System.err.println(l.getText()); l.setText("New Text"); System.err.println(l.getText()); } } 

但是你不能说:

 l = new JLabel("Newest Text"); 

在第一次分配给l之后。 请注意,您可以这样做:

 import javax.swing.JLabel; class Test1 { public static void main(String[] args) { final JLabel l; String s = getArbitaryString(); // Assume this method returns a string l = new JLabel(s); System.err.println(l.getText()); } } 

这可以做到这一点,因为当我声明它没有分配给任何甚至不是空。 所以你只能给它分配一次。

原始物也是一样的。 你可以像这样给它赋值:

 class Test1 { public static void main(String[] args) { final int i; i = 2; } } 

但是现在你不能进一步操纵它,因为你可以对基本types做的唯一事情就是给它们赋值。

你不能改变最终variables引用的对象或值。 您只能分配一次最终variables。

这对于是否可以更改对象的状态没有影响。 对象本身仍然可以被操纵,除非它被编码,这样的操作是被禁止的。 不可变的对象是一个状态不能改变的对象。

正如其他人所说,这意味着你可以操纵variables指向的对象,但是你不能改变引用(即把另一个对象赋给variables)。

可以更改devise(如List )的对象(可以向其中添加元素),而如果您有一个不可变对象,如StringInteger ,将无法更改它(所有类的操作String支持返回一个新的实例,不要修改实际的对象)。

总是杀我的那个?

如果你希望finalvariables像你想象的那样安全,你需要很多额外的代码来返回一个String []的副本。

即使方法可以更改引用指向的对象的状态,也可以调用其上的任何方法。 例如

 final MyClass myClass = new MyClass(); myClass.setVar(something); 

这很好,因为myClass本身没有改变,即你没有做myClass = myClass1;

你可以操作可变的最终variables,例如StringBuffertypes,但不能操作不可变types的最终variables。

在可变variables的情况下,每次更改值时都不会创build新对象。 但是对于不可变types的情况,每当你改变值的时候,新的对象就会被创build,所以当你完成它时,你不能修改它。

是的,最后的variables可以修改。

  final StringBuffer s = new StringBuffer(); // won't work s = new StringBuffer(); //this works s.append("hai"); 

您不能更改引用,但可以修改对象的字段。 更多细节

您仍然可以使用reflection来更改“最终”variables。