在包含main方法的类中,将该类的所有成员声明为static是不好的做法?如果是这样,为什么?在main方法中,创建一个封闭类的新实例,并从构造函数运行程序可以说更好吗?
编辑:(澄清) 我知道关于静态和单身的概念以及通常何时使用它。但这个问题特别关注程序的主要类别。 @Andrew Tobilko(显然已经删除了他的答案......)似乎从他的回答中判断出我的问题。在我的情况下,我的主类是大约200 LOC,它使用另外两个小类(每个<100 LOC),所以这是一个小程序。 main-class包含创建一个Swing GUI和一些运行逻辑,没有什么需要有几个实例,所以我想我可能只是让一切都是静态的,以便能够使用静态main方法中的所有东西。这是有动力的吗?一个用C#编码的朋友告诉我,使用大量的静态意味着C#中的死刑。它可能会有一些内存问题吗?
答案 0 :(得分:1)
这不是'更好' - 这取决于你需要做什么。 将类的所有成员声明为静态(包括方法)只是将类转换为单例。如果这是你的用例,那么是的。
将属性声明为静态意味着该属性的只有一个副本由该类的所有实例共享。
如果您的用例需要创建多个实例,并且这些对象中的每一个都应该拥有自己的属性“私有副本”,那么不应该将该属性声明为静态。
在继续实施之前,建议read more关于该主题。
答案 1 :(得分:0)
静态变量:
static
关键字用于创建独立于为类创建的任何实例而存在的变量。无论类的实例数是多少,都只存在一个静态变量副本。
静态变量也称为类变量。局部变量不能声明为静态。
静态方法:
static
关键字用于创建独立于为类创建的任何实例而存在的方法。
静态方法不使用它们所定义的类的任何对象的任何实例变量。静态方法从参数中获取所有数据并从这些参数计算某些内容,而不引用变量。
可以使用类名后跟一个点以及变量或方法的名称来访问类变量和方法。
static
修饰符适用于类成员。它应该仅在您想要通过程序获取实例的单个副本时使用。
下面是解释它的例子,
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}
private static void addInstance() {
numInstances++;
}
InstanceCounter() {
InstanceCounter.addInstance();
}
public static void main(String[] arguments) {
System.out.println("Starting with " +
InstanceCounter.getCount() + " instances");
for (int i = 0; i < 500; ++i){
new InstanceCounter();
}
System.out.println("Created " +
InstanceCounter.getCount() + " instances");
}
}
这会产生以下结果:
Started with 0 instances
Created 500 instances
答案 2 :(得分:0)
静态实体可以调用静态实体或与静态实体交互,即静态方法只能调用静态方法或与静态变量交互。这是静态方法的属性。 java中的主类大多被声明为“public static void main”,这使得main成为一个静态方法。因此,它调用的函数是静态的。
答案 3 :(得分:0)