有人可以阐明下面的代码的意义。
class A
{
int i = 10;
public void setI(int b)
{
i = b;
}
public int getI()
{
return i;
}
}
class Test
{
public static void main(String args[]) throws Throwable
{
final A ob = new A();
ob.setI(10);
System.out.println(ob.getI());
}
}
对象A声明为final的,但我可以改变这个对象的实例变量的值,也retrive更新后的值。 那么,什么是声明一个对象作为最终的意义。 我知道有关声明原始数据类型作为最终,这使得该变量不变。
OB将不能引用任何其他对象: final关键字 。
它不能被重新分配。 但你可以改变它的内部(它是可变的,如果它原是)。 所以这工作原理:
final A ob = new A();
ob.setI(6)
但这并不:
final A ob = new A();
ob = new A();
如果您指明任何变量是最终的,这意味着你不希望它包含了改变存储器的值。 在基本类型的情况下,由变量表示该值是实际值。 在对象类型的情况下,在存储器中的值是和所述对象的引用不是实际的对象。
例如,您有:
final int x = 7;
final Object y = new Object();
您可以把内存中这种方式表示的数据:
+----------+----------+
| block | value |
+----------+----------+
| 1001 | 7 |
| 1002 | 2110 |
+----------+----------+
为了便于讨论,让我们省去了对Java实际上如何管理内存的细节(因为我不知道很多关于它要么)。 所以,在上面的例子中,块1001由变量x 1002由y表示,和。 两者都是最终的变量,这意味着它们所代表的价值不能被改变。 在x的情况下,它是7,其是实际值,但在y中的情况下,2110是只到另一个存储器位置的引用。 这两个无法改变,但原因基本类型的变量成为常量是他们所代表的实际价值。 但实际上,你可以说为对象类型变量一样也只是他们所代表的常量引用。 所以最终的关键字是在这方面几乎是一致的。
所以,用最后的变量,如果他们的基本类型,他们会不断地代表你将它们设置为任何特定值。 如果他们的对象/引用类型,他们会不断地指向您将其指向任何对象(不分对象的可变性)。
这意味着以下是不可能的:
final A ob = new A();
ob = new A(); // This is not possible
可变ob
也将引用类的实例A
这是第一分配给它。 这就是在final
关键字在这种情况下指。 这意味着你可以修改的属性ob
,因为它像任何其他实例的普通对象A
。
如果对象是final
,你可以调用完成内部变革和往常一样的任何方法,但你不能参考点重新分配给不同的对象。 试着这样做:
final A ob = new A();
ob = new A();
并注意代码不能编译。
可以把它看作一个恒定的参考。
那么,在对象的情况下,参考值是地址对象。 所以OB的值将是地址到由创建该对象new A();
这将是最终决定,您将无法改变它的值。 通过这意味着有,你不能一个新的对象分配给这个参考。
你可以不写这样。
final A ob = new A();
ob= new A(); // not allowed
在java中,而不是C ++,所有的对象都是指针,所以final
目标是可以改变的,它只是不能在任何地方点新的,那就是,你不能把它赋值运算符的左侧。
不会有在java中的任何常量(最终)对象。 对象在堆内存区域中创建。 我们可以修改对象随时随地。
有在Java只有常数(最终)的引用: - 意味着不能修改参考,并将其重新分配给任何其他对象,因为它是常数,并通过出最终参考的是指其中只有一个被分配的同时对象宣言。
因此:
final A objectA = new A();
objectA.setI(6);
是有效的,因为我们只改变对象的内容,而不是参考。
但:
final A objectA = new A();
objectA = new A();
是无效的,因为你要修改的参考。