Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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 - Fatal编程技术网

Java 原语重新初始化不允许但对象允许创建多次

Java 原语重新初始化不允许但对象允许创建多次,java,Java,我有点怀疑什么时候该宣布这门课为期末考试。当我在谷歌上搜索它的时候,我开始知道,出于安全原因,它将帮助full,就像在SO POST的帮助下字符串不可变一样 据我所知,最终变量初始化一次。举个例子: 最终积分i=10 i=11//给出编译时错误 因为无法指定最终的局部变量i。它必须为空且不使用复合赋值 但是当我多次创建最后一个类变量时。它允许我这样做。如果它允许我创建多个final类实例,那么我怎么能说它是final类呢 您能给出一些最终类的例子,通过它来满足一些业务逻辑需求吗 若我并没有错,那

我有点怀疑什么时候该宣布这门课为期末考试。当我在谷歌上搜索它的时候,我开始知道,出于安全原因,它将帮助full,就像在SO POST的帮助下字符串不可变一样

据我所知,最终变量初始化一次。举个例子:

最终积分i=10

i=11//给出编译时错误

因为
无法指定最终的局部变量i。它必须为空且不使用复合赋值

但是当我多次创建最后一个类变量时。它允许我这样做。如果它允许我创建多个final类实例,那么我怎么能说它是final类呢

您能给出一些最终类的例子,通过它来满足一些业务逻辑需求吗


若我并没有错,那个么原语重新初始化是不允许的,但对象允许多次创建

使一门课成为最终课程只会阻止人们扩展它。您仍然可以创建任意数量的实例。
例如,当您想确保类是不可变的,比如字符串是不可变的时,这非常有用。如果可以扩展字符串,则可以添加改变字符串的行为,从而打破不变性。

对于类实例变量,规则与原语相同,如果它们声明为final,则不能重新分配。但是,您仍然可以更改实例的成员

final表示该类不能扩展。您仍然可以创建该类的多个实例。例如:

class ImmutableInt {
  int value;
  public ImmutableInt( int val ) {
    this.value = val;
  }
  public int getValue() {
    return value;
  }
  // no setter because I don't want people to change it!
}
在上面的例子中,我可以创建许多ImmutableInt实例

ImmutableInt int1 = new ImmutableInt( 10 );
ImmutableInt int2 = new ImmutableInt( 100 );
这两个实例将始终设置为10和100的值

现在让我们假设有人决定能够更改ImmutableInt的值,所以他们
扩展
ImmutableInt并提供一个setter。好吧,对于那些被认为是不可变的东西来说,这真的没有意义

因此,我向类中添加了
final
,表示“没有人可以扩展这个类来打破我的不变性契约。”我还向字段中添加了
final
,以便它只能在构造函数中初始化,以后不能更改

final class ImmutableInt {
  final int value; // no default value here means it must be set in the constructor

  public ImmutableInt( int val ) {
    this.value = val;
  }

  public int getValue() {
    return value;
  }
  // no setter because I don't want people to change it!
}

final在不同地方使用时有不同的含义,因此不要混淆此处提到的概念:

期末课程

最后一个类不能被子类化。这样做是出于以下原因: 安全和效率。因此,许多Java标准 库类是最终类,例如java.lang.System和 java.lang.String

最终变量

最终变量只能初始化一次,可以通过 初始值设定项或赋值语句。不需要这样做 在声明点初始化:这称为“空白” 最后一个“变量”。类的空最终实例变量必须为 在中类的每个构造函数的末尾明确指定 它是被宣布的;同样,必须输入一个空白的最终静态变量 在其所在类的静态初始值设定项中明确指定 被宣布;否则,在这两种情况下都会发生编译时错误


您似乎混淆了final类和final变量。若你们能举一个简短但完整的例子来说明你们的行为,这会很有帮助。@JonSkeet谢谢,我当然会的。我想问一下。你能详细解释一下“令人惊讶的行为”吗?对不起,我不理解你的评论,而且听起来这可能是一个相当模糊的问题。@TBM你能提供不符合你预期的代码吗?谢谢。如果我阻止某个类不可扩展,通过它我实现了什么?我能做些什么来控制?对不起,如果这是一个愚蠢的问题,但我从来没有这样的要求。你能给一些例子或任何参考链接。添加了更多的解释。谢谢。太好了!!非常感谢:)