Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 如何用final实现静态?_Java_Oop - Fatal编程技术网

Java 如何用final实现静态?

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

我对final和static关键字的含义感到困惑。这是因为,据我所知,static在类中创建了一个单独的内存。静态字段只能从静态方法访问。那么,为什么在测试构造函数中声明列表时没有错误呢

第一个问题:

当我宣布

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();
}