Java 如何用final实现静态?
我对final和static关键字的含义感到困惑。这是因为,据我所知,static在类中创建了一个单独的内存。静态字段只能从静态方法访问。那么,为什么在测试构造函数中声明列表时没有错误呢 第一个问题: 当我宣布Java 如何用final实现静态?,java,oop,Java,Oop,我对final和static关键字的含义感到困惑。这是因为,据我所知,static在类中创建了一个单独的内存。静态字段只能从静态方法访问。那么,为什么在测试构造函数中声明列表时没有错误呢 第一个问题: 当我宣布 public class Test { private static List list; public Test() { list = new ArrayList(); list.add("foo"); } p
public class Test {
private static List list;
public Test() {
list = new ArrayList();
list.add("foo");
}
public static void main(String [] args) throws IOException{
list = new ArrayList();
Test t = new Test();
t.list.add("add");
System.out.print("Hello " + t.list);
}
}
它很好用。但当我用static添加final时,它就不起作用了
第二个问题:
请解释它是如何在内部工作的。至于您的第一个问题,static关键字意味着即使您没有实例化该类,该变量也将可用。例如,在您的示例中,yourClass.list确实引用了一个列表,即使您从未调用新的yourClass。如果您遗漏了static关键字,那么在安装类之前,yourClass.list还不存在 最后一个关键字用于声明常量。也就是说,在初始化变量后,在构造函数中或
public Test(){
list = new ArrayList();
}
或者在声明之后,private final List List=new ArrayList;,它是不变的。任何更改它的尝试,例如使用另一个list=…语句,都会导致错误。请检查以下代码和附加的注释
public class Test {
// this can be set only once and only from the static block
private static final List listStaticFinal;
// this is initialized when declared
private static final List listStaticFinalInitialized = new ArrayList();
// this can be set many times from multiple places
private static List listStatic;
// this is initialized when declared
private static List listStaticInitialized = new ArrayList();
static {
// can set only once from here
listStaticFinal = new ArrayList();
// can be set also from here
listStatic = new ArrayList();
}
public Test() {
// can be set also from here
listStatic = new ArrayList();
}
public static void main(String[] args) {
// can be set also from here
listStatic = new ArrayList();
}
}
注意:只能在静态块中设置静态最终字段
注意:Java没有静态类的概念。如果希望类的行为类似于静态类,那么可以将构造函数标记为private
注意:当编写静态字段时,还要考虑使用代码的上下文,并适当地记录代码。例如,您的代码可能用于多线程场景
注意:当编写静态字段时,还要考虑如何测试代码。静态可能会造成模拟相应代码的困难。因为最终变量在启动过程中只能初始化一次,所以允许构造函数初始化变量。这里我们还有静态变量,这意味着您必须在类加载期间初始化变量。这可以使用静态初始值设定项块来完成
静止的{
列表=新的ArrayList;
}
问题1
对对象使用static关键字可以跨容器类的所有对象共享一个相同的副本。因此,如果您初始化、重新分配该静态对象,则该类的所有对象都会发生更改。
您可以使用该静态引用创建新对象,也可以根据需要多次重新分配它,但它将反映到容器类的所有现有对象和新对象。不能为特定容器类对象指定不同的值。
静态变量可以随时随地访问,甚至在实例化容器类之前,使用类名后跟变量名。
关于访问静态变量,您可以从任何静态或非静态方法访问它。但在静态方法中,只能使用静态变量或仅在该方法中声明的变量
问题2
对对象使用final关键字告诉编译器应该只有一个对象,并且单个对象/值应该与声明为final的引用相关联。最终对象/变量只能在声明时初始化一次。无法进一步更改/重新分配其值/引用对象。这就是我们所说的C++中的常数变量;p>
希望能有帮助
干杯 你能详细说明你想在第二个问题中解释什么吗?在添加final之前,它工作。在工作final之后,它不工作。我的第二个问题为什么它不工作和内部机制?@bleistift2你从哪里得到的静态字段只能从静态方法访问。这根本不是事实。事实上,您不能从静态方法访问非静态字段。所有其他组合都是允许的。这是不正确的。列表不是一成不变的,引用是。@sschras感谢您指出这一点。我更正了我的答案。您也可以在声明最终静态变量时初始化它们。例如,final static ArrayList list=new ArrayList;这是有效的。
public Test(){
list = new ArrayList();
}
public class Test {
// this can be set only once and only from the static block
private static final List listStaticFinal;
// this is initialized when declared
private static final List listStaticFinalInitialized = new ArrayList();
// this can be set many times from multiple places
private static List listStatic;
// this is initialized when declared
private static List listStaticInitialized = new ArrayList();
static {
// can set only once from here
listStaticFinal = new ArrayList();
// can be set also from here
listStatic = new ArrayList();
}
public Test() {
// can be set also from here
listStatic = new ArrayList();
}
public static void main(String[] args) {
// can be set also from here
listStatic = new ArrayList();
}