Java中静态变量的含义是什么?

Java中静态变量的含义是什么?,java,Java,创建或不创建静态变量的意义是什么?为什么不能从静态方法访问非静态变量?如果它是静态的,就不会被垃圾收集。此外,如果它是一个局部变量,其他方法不应该访问它 既然字符串总是一样的,我应该把它设为静态的吗 对。具体地说,如下所示: public class A implements ActionListener { public static final String MY_STRING = "This is a string"; // can be private also @O

创建或不创建静态变量的意义是什么?为什么不能从静态方法访问非静态变量?

如果它是静态的,就不会被垃圾收集。此外,如果它是一个局部变量,其他方法不应该访问它

既然字符串总是一样的,我应该把它设为静态的吗

对。具体地说,如下所示:

public class A implements ActionListener {

    public static final String MY_STRING = "This is a string"; // can be private also

    @Override
    public void actionPerformed(ActionEvent e){
        System.out.println(MY_STRING);
    }
}
感谢您的反馈,我看到Tom的评论有一个很好的观点:


提取所有内容并不是一种编程惯例和做法 有些事情必须有意义,而不仅仅是“不造成伤害——汤姆”



我想澄清的是,这个答案只针对OP的情况。但是,它可能不像Andy之前提到的那样好:
使代码更难理解。如果值没有“语义”意义
。总之,这个答案可能不适合大多数类似的情况。

JVM垃圾收集器可以缓存(或重复数据消除)字符串,所以您不必太担心这个问题。

是的,但是如果它是从字符串文字赋值的,它也不会被垃圾收集,因为值在字符串池中。您确定吗?即使字符串不再使用,在方法的末尾?是的,非常确定。为什么不干脆
System.out.println(“this…”)因为这是一个例子。我需要更多的代码来制作一个现实的例子,然后可能会展示一个你不应该这么做的例子:)我不认为这是错误的useful@Galgo你发布的答案是Andy的答案:你甚至不需要变量。因为我们不知道你的实际情况是什么,我们不能推荐任何东西。我使用了字符串,但代码只是一个示例。我需要编写一些更无用的代码来实现它realistic@Tom这不是新闻,我读到了很久以前。@Patrick垃圾收集器不缓存任何东西。在以前的Java版本中有一个选项UseStringCache。我没有发明任何东西。Patrick,你能告诉我们你的陈述的来源吗?通过
interning
进行的字符串重复数据消除与GC无关,只是在JDK<1中,interned字符串不可由GC收集.7(存储在permgen中)-这是你很久以前读到的吗?以防OP盲目相信这个答案:不,答案不是“是”,而是“视情况而定”“。将字符串定义为常量并不总是正确的做法。我不认为遵循某些编程约定会造成伤害。提取所有内容不是编程约定,做一些事情必须有意义,而不仅仅是“不造成伤害”。这不适合OP的情况。”。没有理由将单个位置使用的文本提取为常量(或变量),甚至更不用说提取为公共文本。它只会使代码更难阅读,不会带来任何好处,也不会造成任何伤害:添加常量会引入间接寻址,使代码更难阅读。如果该值没有“语义”含义(如中所示,如果它的含义仅限于“我将在代码中的某个点打印的日志消息”),则不要提取常量,甚至变量。