Java 静态变量/方法何时何地有用?
除非该类是私有的或是JavaAPI的一部分,否则我不认为使用静态作为OOP的一部分是有利的 我唯一看到使用static有用的时候是每次创建相同类型的新对象时都需要一个对象递增器 例如: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
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);