Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最终实例变量的意义是什么?_Java_Static_Constants_Instance Variables_Class Variables - Fatal编程技术网

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

Java 最终实例变量的意义是什么?,java,static,constants,instance-variables,class-variables,Java,Static,Constants,Instance Variables,Class Variables,我对静态最终类变量和最终实例变量有一些混淆 以下是示例代码:- 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.

我对
静态最终类变量
最终实例变量
有一些混淆

以下是示例代码:-

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

A
final
在您向其赋值后即为final。你以后不能改变它

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

它们可以,但这些值在创建后不能更改。只能在实例变量初始值设定项和构造函数中为最终实例字段赋值,并且必须以这种方式为所有实例字段赋值

请注意,在这里的代码中:

Foof()
{
    whuffie=42;  //compile time error
}
。。。评论是不正确的。这个任务应该是完全有效的

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


将其与
java.util.Date
进行比较,如果您真的希望验证有用,则需要创建
Date
值的防御性副本,并且不提供对任何其他代码的引用,在声明或构造函数中初始化后,您不能修改
final
变量


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

final
变量通常用于定义不应更改的内容。你可以给它写一次,然后它就永远被设置好了


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

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


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

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

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

您的评论声称存在三个编译时错误。只有两个。@Jon,我假设构造函数代码也会生成一个错误;但事实并非如此。
如果最终实例变量不能为每个不同的实例提供不同的值,那么拥有最终实例变量有什么意义呢。您可以在所述对象的构造函数中设置它,或者从某些逻辑获取它,或者将其作为参数接收。。。这与Jon Skeet提到的完全相同:构造函数设置不会给出编译错误。@Ankit:为什么不在发布问题之前测试假设?问问题之前一定要做研究,而不是事后…@Jon,我以后会注意的。编辑了我的问题,只显示了2个编译时错误。我试图在构造函数中将大小的值(当前为3)更改为23,但仍然收到错误。@Ankit:然后需要删除初始值设定项表达式。基本上,您只能设置一次最终变量;但是将变量设为静态不是很好吗?因为我的代码不必处理对象创建(节省内存)。哈哈,这不是一个很好的理由:)如果你想要更多内存,那么就购买它,不像以前那样昂贵:P而且以后维护它可能会很痛苦。因此,除非公开您的代码是有意义的,否则就可以了。将其作为最终变量使其稍微正常。