2017-04-14 53 views
-1

我对finalstatic关键字的含义感到困惑。这是因为,据我所知,static在课堂上创建了一个单独的记忆。一个static字段只能从static方法访问。那么,为什么当我在Test构造函数中声明list时没有错误?如何使用final来实现静态?

首先问

public Test() { 
    list = new ArrayList(); 
    list.add("foo"); 
} 

当我宣布

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

它工作正常。但是当我加finalstatic,它不起作用。

第二个问题:

public class Test { 
    private static final 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); 
    } 
} 

请解释它是如何工作的内部。

+0

你能细说正是你想在你的第二个问题已经解释? – bleistift2

+0

之前加入最后的工作。在工作最后它不工作。第二个问题为什么它不工作和内部机制?@ bleistift2 –

+1

你从哪里得到“一个静态字段只能从静态方法访问”。这是不正确的。事实是,您无法从静态方法访问非静态字段。所有其他组合都是允许的。 – Henry

回答

0

至于你的第一个问题,关键字static表示即使你没有实例化类,变量也是可用的。例如,在您的示例中,即使您从未拨打new yourClass()yourClass.list也会引用列表。如果您忽略了static关键字,则yourClass.list在安装该类之前还不存在

final关键字是用于声明常量。即,变量被初始化(具有分配给它的第一次的值),要么在构造后

public Test(){ 
    list = new ArrayList(); 
} 

或声明它,private final List list = new ArrayList();后立即,它是不可变的。任何改变它的尝试都会导致错误,例如使用另一个list = …语句。

+1

这是不正确的。该列表不是不可改变的,参考是。 – sschrass

+0

@sschrass谢谢你指出。我纠正了我的答案。 – bleistift2

0

检查下面的代码和附加的评论。

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没有静态类的概念。如果你想让你的类的行为类似于静态类,那么你可以将你的构造函数标记为私有的。

注意:编写静态字段时还要考虑代码将被使用的上下文并适当地记录代码。例如,您的代码可能在多线程场景中使用。

注意:写静态字段时还要考虑你的代码将如何测试。静态可能会造成模拟相应代码的困难。

+1

您也可以在声明它们时初始化最终的静态变量。例如,'final static ArrayList list = new ArrayList();'是有效的。 – bleistift2

+0

为true,编辑后添加这一点 – andreim

0

由于最终变量可以,这就是为什么构造函数允许初始化变量启动时初始化一次。在这里,我们还得到了static这意味着您必须在类加载期间初始化该变量。这可以使用静态初始化块来完成。

static { list = new ArrayList(); }

0

使用静态块

public class timehelper { 
    public static final Map<String,String> timeType = new HashMap<String, String>(); 
    static { 
     timeType.put("Minute","60"); 
     timeType.put("Hour","24"); 
    } 
} 

你认为正确的是静态,并最终只意味着你创建后,你可以修改它。

1

问题-1

使用静态关键字与物体能够共享一个和穿过容器类的所有对象的相同副本。因此,如果初始化,重新分配该静态对象,则该对象的所有对象都会更改。 您可以使用静态引用来创建新对象,也可以重复指定它多次,但它会反映到容器类的所有现有对象和新对象中。您无法为特定的容器类对象分配不同的值。 静态变量可以从任何地方访问,即使实例化容器类,使用类名称后面是变量名前任何时间。 关于访问静态变量,您可以从任何静态或非静态访问它的方法。但在静态方法,你只能使用静态变量或仅在该方法中声明的变量。

问题-2

使用最终关键字与对象告诉编译器应该有只有一个和单个对象/值应与基准被声明为最终相关联。 最终对象/变量应该仅在其声明的时间进行一次初始化。其值/引用对象不能进一步更改/重新分配。这个我们称之为常量变量在C++中;

希望它有帮助。

干杯.. !!

相关问题