理解类的地图字段上的最终静态用法

时间:2013-12-24 20:55:04

标签: java encapsulation final static-members

我是c ++开发人员并且正在尝试熟悉Core Java概念。 我发现这个令人困惑的是我的最终静态是在构造对象后无法改变的东西。 (如果我错了,请纠正我)

我遇到了下面的实现,我发现这令人困惑,因为它似乎允许将值添加到Map中,即使它是最终的静态

public class MockUserServiceImpl implements UserService {

    private static final Map<String, User> userMap = new HashMap<String, User>();

    public static void addUserToCache(int userId, String userName) {
        if (!userMap.containsKey(userName)) {
            userMap.put(userName, new User(userId, userName));
        }
    } 
}

有人可以试着解释一下这里的静态决赛是什么意思

3 个答案:

答案 0 :(得分:5)

不要将Map视为数据结构。可以将其视为具有方法的任何其他类,例如put(..)。你是说如果你有

public class Foo {
    public void bar() {}
}

您无法在

上拨打bar()
final Foo foo = new Foo();

只是因为它是final?它会有什么用处?

final关键字仅阻止重新分配变量,而不是可以调用哪些方法或可以访问哪些字段。 It has a different meaning when used on on methods and classes.

至于static,请阅读:

What does the 'static' keyword do in a class?

答案 1 :(得分:0)

java中的所有对象都是引用。 final关键字表示引用是final,但对象本身可以是可变的。请看Java's final vs. C++'s const

静态关键字表示只有一个实例共享所有对象。

答案 2 :(得分:0)

Java中的

static通常表示静态上下文,类似于类。在这种情况下,静态字段可以看作是类的字段。静态字段也可以视为全局变量。

final与C ++中的const非常相似,这意味着无法重新分配引用或值。

当一起使用时,它们意味着具有全局可见性的恒定参考或值。

您可能还想阅读JLS §8.3.1 Field Modifiers