5

我在static final class variable和之间有一些混淆final instance variable

这是示例代码:-

class Foof{
final int size=3;
final int whuffie;

    Foof()
    {
        whuffie=42; 
    }

    public static void main(String [] args){
        Foof obj1 = new Foof();
        Foof obj2 = new Foof();

        obj1.size=53;    //compile time error
        System.out.println(obj1.size);
        obj2.whuffie=45; //compile time error
        System.out.println(obj2.whuffie);
    }
}

错误:-

ankit@stream:/home/Data/JAVA/practice/src/test.com/test-20121031_static_demystified$ javac Foof.java 
Foof.java:14: error: cannot assign a value to final variable size
obj1.size=53;    //compile time error
    ^
Foof.java:16: error: cannot assign a value to final variable whuffie
obj2.whuffie=45;
    ^
2 errors

所以我的问题是,如果每个不同的实例不能有不同的值,那么拥有最终实例变量的意义何在。我的意思是,如果它们对每个实例都具有相同的值,那么我们为什么不将它们声明为类变量(静态最终类变量),因为这将达到相同的目的,而且我们不需要创建对象来访问它们。


编辑-1:-

class Foof{
    final int size=3;
    final int whuffie;

    Foof()
    {
        whuffie=42;
        size = 23;  //compile-time error.
    }

    public static void main(String [] args){
        Foof obj1 = new Foof();
        Foof obj2 = new Foof();

        //obj1.size=53;    
        System.out.println(obj1.size);
        //obj2.whuffie=45; 
        System.out.println(obj2.whuffie);
    }
}

错误:-

Foof.java:8: cannot assign a value to final variable size
size = 23;
^
1 error

根据错误,我可以确定在对象创建期间为第一个大小分配了一个值 =3。

4

6 回答 6

12

所以我的问题是,如果每个不同的实例不能有不同的值,那么拥有最终实例变量的意义何在。

它们可以,但这些值在创建后无法更改。您只能将值分配给实例变量初始化器和构造器中的最终实例字段,并且您必须以这种方式为所有实例字段分配值。

请注意,在您的代码中:

Foof()
{
    whuffie=42;  //compile time error
}

...评论不正确。该分配应该是完全有效的。

最终字段对于实现不变性很有用——这有助于简化对对象的推理。例如,String它是不可变的,因此如果您验证一个字符串,然后保留引用的副本,您就知道验证在以后仍然是正确的。

与 相比java.util.Date,如果您真的希望验证有用,您需要创建该Date值的防御性副本,并且不提供对任何其他代码的引用,以防它更改所表示的底层瞬间。

于 2012-10-31T12:08:05.180 回答
2

final只要您为其赋值,A就是最终的。你以后不能改变它。

于 2012-10-31T12:07:51.440 回答
1

在声明或构造函数中初始化后,您不能修改final变量。

使用static关键字不会使其变得可修改。它只是意味着final可以通过类名或实例变量访问该变量,该变量仍然是不可变的。

于 2012-10-31T12:08:23.027 回答
1

实际上,当我们将任何变量创建为特定于类的变量时,需要静态和非静态最终变量,然后将其声明为静态,如果是对象级别,则将其声明为非静态变量。

例如,我们有一个国家作为一个类,并且将有该类的两个数据成员,如时区和重力。我们将它们都声明为最终的,但时区是特定于对象的(每个国家的时区不同但在全国范围内相同)并且重力是特定于类的(每个国家的重力与地球重力相同)所以我们被宣布为静态最终重力.

于 2012-10-31T14:24:47.253 回答
0

final变量通常用于定义永远不应该改变的事物。您可以写入一次,然后将其永久设置。

您可以在构造函数中使用它来设置对象的 ID 或类似的东西。

于 2012-10-31T12:10:13.110 回答
0

对于最终变量,您只能赋值一次。它通常用于您不希望稍后在程序中更改变量值的情况。

静态变量每个类只创建一个实例,与您创建的该类的对象数量无关。

于 2012-10-31T12:10:33.233 回答