在java中将对象声明为final

Ric*_*vis 17 java oop final

有人可以澄清下面代码的重要性.

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

对象A被声明为final,但我可以更改此对象的实例变量的值,并还可以检索更新的值.那么将对象声明为final是什么意义.我知道将原始数据类型声明为final,这使得该变量保持不变.

Nim*_*sky 34

ob将无法引用任何其他对象:final关键字.

它无法重新分配.但你可以改变它的内部(它是可变的,如果它是最初的).这样可行:

  final A ob = new A();
  ob.setI(6)
Run Code Online (Sandbox Code Playgroud)

但这不是:

  final A ob = new A();
  ob = new A();
Run Code Online (Sandbox Code Playgroud)


Psy*_*nch 12

如果您指定任何变量为final,则表示您不希望它在内存中包含的值发生更改.在原始类型的情况下,由变量表示的值是实际值.对于对象类型,内存中的值是对对象的引用,而不是对实际对象的引用.

例如,你有:

final int x = 7;
final Object y = new Object();
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式考虑在内存中表示的数据:

+----------+----------+
|  block   |  value   |
+----------+----------+
|  1001    |    7     |
|  1002    |  2110    |
+----------+----------+
Run Code Online (Sandbox Code Playgroud)

为了便于讨论,让我们省略Java如何实际管理内存的细节(因为我对它也不太了解).因此,在上面的示例中,块1001由变量x表示,而1002由y表示.两者都是最终变量,这意味着它们所代表的值无法更改.在x的情况下,它是7,这是实际值,但是在y的情况下,2110只是对另一个存储器位置的引用.两者都不能改变,但原始类型变量成为常量的原因是它们代表实际值.但实际上,你可以对对象类型变量说同样的,只是它们所代表的常量是引用.因此,最终关键字在这方面非常一致.

因此,对于最终变量,如果它们是原始类型,它们将不断表示您设置它们的任何特定值.如果它们是对象/引用类型,它们将不断指向您指向它们的任何对象(无论对象的可变性如何).