声明对象为final的java(Declaring object as final in java)

2019-07-30 03:58发布

有人可以阐明下面的代码的意义。

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更新后的值。 那么,什么是声明一个对象作为最终的意义。 我知道有关声明原始数据类型作为最终,这使得该变量不变。

Answer 1:

OB将不能引用任何其他对象: final关键字 。

它不能被重新分配。 但你可以改变它的内部(它是可变的,如果它原是)。 所以这工作原理:

  final A ob = new A();
  ob.setI(6)

但这并不:

  final A ob = new A();
  ob = new A();


Answer 2:

如果您指明任何变量是最终的,这意味着你不希望它包含了改变存储器的值。 在基本类型的情况下,由变量表示该值是实际值。 在对象类型的情况下,在存储器中的值是和所述对象的引用不是实际的对象。

例如,您有:

final int x = 7;
final Object y = new Object();

您可以把内存中这种方式表示的数据:

+----------+----------+
|  block   |  value   |
+----------+----------+
|  1001    |    7     |
|  1002    |  2110    |
+----------+----------+

为了便于讨论,让我们省去了对Java实际上如何管理内存的细节(因为我不知道很多关于它要么)。 所以,在上面的例子中,块1001由变量x 1002由y表示,和。 两者都是最终的变量,这意味着它们所代表的价值不能被改变。 在x的情况下,它是7,其是实际值,但在y中的情况下,2110是只到另一个存储器位置的引用。 这两个无法改变,但原因基本类型的变量成为常量是他们所代表的实际价值。 但实际上,你可以说为对象类型变量一样也只是他们所代表的常量引用。 所以最终的关键字是在这方面几乎是一致的。

所以,用最后的变量,如果他们的基本类型,他们会不断地代表你将它们设置为任何特定值。 如果他们的对象/引用类型,他们会不断地指向您将其指向任何对象(不分对象的可变性)。



Answer 3:

这意味着以下是不可能的:

final A ob = new A();
ob = new A(); // This is not possible

可变ob也将引用类的实例A这是第一分配给它。 这就是在final关键字在这种情况下指。 这意味着你可以修改的属性ob ,因为它像任何其他实例的普通对象A



Answer 4:

如果对象是final ,你可以调用完成内部变革和往常一样的任何方法,但你不能参考点重新分配给不同的对象。 试着这样做:

final A ob = new A();
ob = new A();

并注意代码不能编译。

可以把它看作一个恒定的参考。



Answer 5:

那么,在对象的情况下,参考值是地址对象。 所以OB的值将是地址到由创建该对象new A(); 这将是最终决定,您将无法改变它的值。 通过这意味着有,你不能一个新的对象分配给这个参考。

你可以不写这样。

final A ob = new A();

ob= new A(); // not allowed


Answer 6:

在java中,而不是C ++,所有的对象都是指针,所以final目标是可以改变的,它只是不能在任何地方点新的,那就是,你不能把它赋值运算符的左侧。



Answer 7:

不会有在java中的任何常量(最终)对象。 对象在堆内存区域中创建。 我们可以修改对象随时随地。
有在Java只有常数(最终)的引用: - 意味着不能修改参考,并将其重新分配给任何其他对象,因为它是常数,并通过出最终参考的是指其中只有一个被分配的同时对象宣言。

因此:

 final A objectA = new A();
 objectA.setI(6);  

是有效的,因为我们只改变对象的内容,而不是参考。

但:

   final A objectA = new A();
   objectA = new A();  

是无效的,因为你要修改的参考。



文章来源: Declaring object as final in java
标签: java oop final