public static final String mystring = ...
然后直接使用值。为什么他们要这样做?在使用之前为什么必须将值初始化为
final
?
更新
好的,谢谢大家的回答,我理解了这些关键字(public static final)的含义。但我不明白即使常量只会在同一类中的一个地方使用,为什么人们还要使用它。为什么要声明它?为什么我们不只是使用变量呢?final
表示变量的值不会改变,换句话说,它是一个常量,在声明后不能修改。
当您想创建一个String
满足以下条件时,请使用public final static String
:
static
:无需实例即可使用),final
),例如,当您想定义一个String
常量,该常量将对类的所有实例和使用该类的其他对象可用,并且示例:
public final static String MY_CONSTANT = "SomeValue";
// ... in some other code, possibly in another object, use the constant:
if (input.equals(MyClass.MY_CONSTANT))
public static final int ERROR_CODE = 127;
使用final
并非必需,但它可以防止在程序执行期间无意中更改常量,并且作为变量是常量的指示器。
即使常量只会在当前类和/或一个地方使用-读取-,将所有常量声明为final
也是一种良好的实践:这样更清晰,在代码的生命周期内,常量可能会在多个地方使用。
此外,使用final
还可以让实现执行一些优化,例如在使用常量的地方内联实际值。
最后请注意,final
只会将原始类型、不可变的String
或其他不可变类型真正变为常量值。将final
应用于对象(例如HashMap
)将使引用不可变,但不会使对象的状态不可变:例如,对象的数据成员可以更改,数组元素可以更改,集合可以被操作和更改。
final..这是一个关键字,用于使字符串常量。您无法更改该字符串的值。请参考以下示例:
public class StringTest {
static final String str = "Hello";
public static void main(String args[]) {
// str = "world"; // gives error
System.out.println(str); // called without the help of an object
System.out.println(StringTest.str);// called with class name
}
}
感谢
static
表示对象只会被创建一次,并且不具有包含它的实例对象。当您拥有适用于类的所有对象并永远不会更改的内容时,最好使用您编写的方式。甚至可以在不创建对象的情况下使用它。final
时使用final
,以便编译器强制执行该规则,您可以确定。 static
确保如果对于所有对象而言值相同,则不会浪费内存创建许多相同的内容。final
表示该值在设置后无法更改。 static
允许您设置该值,并且该值将对使用它的类的所有实例相同。此外,您可以在没有类实例的情况下访问 public static
字符串的值。
public 使其可以在其他类中访问。您可以在不实例化类或使用任何对象的情况下使用它。
static 使其在所有类实例中具有统一值。 如果对于所有对象而言,它们的值相同,则确保您不会浪费内存创建许多相同的内容。
final 使其成为不可修改的值。它是一个“常量”值,对于所有类实例都是相同的且不能被修改。
class Foo {
public static final String VERSION = "1.0";
}
class Bar {
public static void main(String[] args) {
System.out.println("I am using version " + Foo.VERSION);
}
}
编译并运行Bar
后,您将获得:
最初的回答:
I am using version 1.0
现在,你改进了Foo
并将版本更改为“1.1”。
重新编译Foo
后,运行Bar
并获得错误输出:
最初的回答:
I am using version 1.0
VERSION
被声明为final
,所以在第一次编译运行时,它的实际值已经内联到Bar
中。因此,要让一个public static final ...
字段的示例在实际更改被声明为final
的内容后正确传播,您需要重新编译使用它的每个类。(你撒谎了!;) 我已经看到过几次,这真的很难调试。final
是指在程序的后续版本中可能会更改的常量,那么更好的解决方案是:class Foo {
private static String version = "1.0";
public static final String getVersion() {
return version;
}
}
这种做法对性能的影响可以忽略不计,因为JIT代码生成器会在运行时将其内联。
为什么人们在类中使用常量而不是变量?
可读性和可维护性,
在代码中使用像40.023这样的数字并不能清楚地说明数字代表什么,因此我们用大写字母的单词(如“USER_AGE_YEARS”)替换它。以后查看代码时就清楚了该数字代表什么。
为什么我们不只使用变量?如果我们知道该数字会改变,那么我们会使用变量,但如果它是一个不会改变的数字,比如3.14159……,我们将其设置为final。
但如果它不是像String这样的数字呢?在这种情况下,主要是为了可维护性。如果您在代码中多次使用字符串(且它在运行时不会更改),则将其作为类顶部的final字符串很方便。这样,当您想要更改它时,只需更改一个地方,而不是许多地方。
例如,如果您的代码中有一个错误消息被多次打印出来,拥有最终字符串ERROR_MESSAGE =“Something went bad.”更易于维护。如果您想将其从“Something went bad.”更改为“It's too late jim he's already dead”,则只需要更改那一行而不是使用该注释的所有位置。我认为这些都是清晰的解释。但是,让我通过给出一个Java内置示例来澄清它。
在Java中,大多数人会使用System.out.println()
system是一个类,out是一个PrintStream类。
因此,Java所说的是,我将负责初始化out对象(PrintStream),并将初始化私有化到System类中。
public final class System {
public final static PrintStream out = null;
//Some initialization done by system class which cannot be changed as it is final.
}
public static final String TILDE_EQUAL = "~=";
这样的代码真的让我很不爽。什么时候“tilde-equal”会变成除了~=
以外的其他东西呢? - kgf3JfUtW