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
)的对象(可以向其中添加元素),而如果您有一个不可变对象,如String
或Integer
,将无法更改它(所有类的操作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。