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而且以后维护它可能会很痛苦。因此,除非公开您的代码是有意义的,否则就可以了。将其作为最终变量使其稍微正常。