最终实例变量的意义是什么?

时间:2012-10-31 12:04:13

标签: java static constants instance-variables class-variables

我在static final class variablefinal 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。

6 个答案:

答案 0 :(得分:12)

  

所以我的问题是,如果最终实例变量不能为每个不同的实例设置不同的值,那么有什么意义呢?

他们可以,但这些值无法在创建后更改。您只能将值分配给实例变量初始值设定项和构造函数中的最终实例字段,并且必须将值分配给所有实例字段。

请注意,在您的代码中:

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

...评论不正确。该任务应完全有效。

最终字段对于实现 immutability 非常有用 - 这有助于简化对象的推理。例如,String是不可变的,因此如果您验证字符串然后保留引用的副本,您就会知道稍后验证仍然是正确的。

将其与java.util.Date进行比较,如果您确实希望对验证有用,那么您需要创建Date值的防御性副本,而不是提供对任何其他代码的引用,以防它更改所表示的基础时刻。

答案 1 :(得分:2)

只要为其分配值,final就是最终版。你以后不能改变它。

答案 2 :(得分:1)

初始化声明或构造函数后,无法修改final变量。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

final个变量通常用于定义永远不会改变的事物。你可以写一次,然后永远设置它。

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

答案 5 :(得分:0)

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

静态变量每个类只创建一个实例,而不管您创建的该类的对象数量。