Java 静态变量/方法何时何地有用?

Java 静态变量/方法何时何地有用?,java,Java,除非该类是私有的或是JavaAPI的一部分,否则我不认为使用静态作为OOP的一部分是有利的 我唯一看到使用static有用的时候是每次创建相同类型的新对象时都需要一个对象递增器 例如: public class Duck { static int duckCount = 0; private String name; public Duck(String name) { this.name = name; duckCount++; } } public

除非该类是私有的或是JavaAPI的一部分,否则我不认为使用静态作为OOP的一部分是有利的

我唯一看到使用static有用的时候是每次创建相同类型的新对象时都需要一个对象递增器

例如:

public class Duck {
    static int duckCount = 0;
    private String name;

public Duck(String name) {
    this.name = name;
    duckCount++;
    }
}

public class DuckTesting {
public static void main(String[] args) {
    System.out.println(Duck.duckCount);
    Duck one = new Duck("Barbie");
    System.out.println(Duck.duckCount);
    Duck two = new Duck("Ken");
    System.out.println(Duck.duckCount);
  }
}
输出:
0
1
二,


更新:在

中找到有用的答案-第一次使用: 这里有一个小例子: 假设我们需要创建人员配置文件,所以我们将创建一个名为profile的类 我们需要每个配置文件都有一个id

public class Profile{
int id;
String name;

public Profile(String name,int id)
{this.name=name;
this.id=id;}
}
这里的问题是:如何创建默认id,每次我们创建一个配置文件时,它都会增加并拥有自己的个人id??如下所示:

profile 1 :id=1
profile 2 : id=2 
profile 3: id=3 
没有手动创建它

要做到这一点,我们需要一个静态变量,这意味着这个变量将由来自同一类的所有对象共享:如果这个变量等于1,这意味着在所有其他具有相同类的对象中,它将等于1

让我们写一封信给我们的班级

public class Profile{
int id;
String name;
//here is it! the first time it will have 1
static int idIncreaser=1;


public Profile(String name)
{this.id=this.idIncreaser; //so the first time the object will have id=1
this.idIncreaser++; //we'll increase it so the next created object will 
                    // have id=2
this.name=name;
}
}
关于静态方法,如果我们在 主类,或者我们希望它像我们的增量器一样做同样的工作

-第二种用法:如果您有一个静态变量或静态方法,您可以在不创建对象的情况下访问它,这意味着您可以执行以下操作:

int a=Profile.idIncreaser; //note that the 'p' is in uppercase to be able to acces the class !

一般情况下:请注意,静态变量/方法由此类的所有对象共享,无需实例化或创建任何对象即可访问该静态变量/方法

当您不喜欢新关键字时,OOP中的静态方法应仅用于“构建器”:

public class ABC {
    private final int a;
    private final int b;

    public ABC(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public static ABC with(int a, int b) {
        return new ABC(a,b);
    }
} 
您可以将ABC类实例化为:

ABC abc = new ABC(1, 2);

你喜欢什么款式。 OOP中不再有静态方法的位置。 而且每个私有方法都是新类的候选方法,因为每个私有方法都不可重用。
静态常量对于内存节约也很有用,当您创建许多内部数据相同的对象时,可以加快速度。

静态方法在需要阻止类的实例(对象)时非常有用从在类中同时使用某些方法开始,您需要通过类本身以相反的方向使用这些方法

-如果对象的每个实例都应该具有相同值的相同变量,那么为什么反复创建相同的变量会有用?静态修饰符不是OOP的有利部分。这是一种有意义的权衡。为什么非特定于类实例的内容应该存储在类的每个对象中?这是误导,没有效率和无用的。可能重复阅读的张贴。我现在明白多了。对不起,如果我的问题听起来太宽泛了。
ABC abc1 = ABC.with(1, 2);