我似乎无法理解静态方法。我阅读了很多关于它的文章,并在教科书和Java文档中对它进行了研究。我知道你可以使用静态方法来访问静态变量。除了获取静态变量之外,除了类方法之外还有其他原因吗?如果还有其他原因我可以解释为什么?我也创建了这个帖子,因为我没有在SOF中找到任何关于此的内容。
以下是一个示例代码:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
public Bicycle(int startCadence,
int startSpeed,
int startGear){
gear = startGear;
cadence = startCadence;
speed = startSpeed;
id = ++numberOfBicycles;
}
public int getID() {
return id;
}
public static int getNumberOfBicycles() {
return numberOfBicycles;
}
public int getCadence(){
return cadence;
}
public void setCadence(int newValue){
cadence = newValue;
}
public int getGear(){
return gear;
}
public void setGear(int newValue){
gear = newValue;
}
public int getSpeed(){
return speed;
}
public void applyBrake(int decrement){
speed -= decrement;
}
public void speedUp(int increment){
speed += increment;
}
}
答案 0 :(得分:5)
实例方法也可以访问类变量。
一个很好的例子是实用程序类:当你需要快速完成时你会做什么,但创建一个对象会很麻烦?这是对的:静态方法。
public static class Utils {
public static void DoSomething(SomeClass x) { }
}
这样我们就可以拨打Utils.DoSomething(myObject);
而不是
Utils util = new Utils();
util.DoSomething(myObject);
或者,在您的示例中,它会计算总共创建多少辆自行车的数量。通过在类级别保存它,它将保持变量的状态在所有对象中同步。
答案 1 :(得分:3)
按类来说你的意思是静态我假设?您可以对实用程序类使用静态方法。它使您不必实例化类来访问方法。例如,我可以编写一个方法来计算一个名为getNumOfLetters的字符串中的字母数,并使用StringUtil.getNumOfLetters调用它,假设String utils是该类的名称。
答案 2 :(得分:2)
通常书籍会告诉你“类就像物体的蓝图”。但我喜欢将类视为对象的“工厂”。 (不要与“工厂模式”混淆,虽然有相似之处!)
通过这个例子,您可以将您的班级视为“自行车工厂”。您可能想要stopProducingBicycles()
或getTotalBicyclesCount()
。或者更奇特的东西:setNewBicycleColor(red)
。
按照setNewBicycleColor()
的想法 - 没有任何东西阻止你访问构造函数中的类静态属性,例如“颜色”,所以所有新的自行车都有默认颜色“红色”。
您可能希望在您的班级中保留每辆新自行车的参考(这将是一个静态属性)。然后在某些时候你可能会Bicycle.AllInstanciesSelfDestruct()
:)
答案 3 :(得分:2)
除了获取类变量之外,类方法还有其他原因吗?
假设“类方法”指的是静态方法,它们有多种用途。除了暴露全局常量或共享数据之外,它们可能最常用于不需要在对象实例的上下文中执行的实用程序函数。
例如:
与收集相关的操作,如排序,撤销等(参见:java.util.Collections
)
修正了数学函数(参见:java.lang.Math
)
对于具有明确定义的空参数行为的其他操作的包装器(请参阅:java.util.Objects::equals()
而不是java.lang.Object::equals()
)
工厂方法是另一种流行的用例。工厂方法对构造函数执行类似的任务,但允许一些额外的灵活性:
他们可能有更多描述性名称,可能会传达正在构建的对象的预期目的。
他们可以返回基类型,并根据作为参数传递的内部逻辑和/或选项/提示来决定实例化哪种具体类型。
许多具体类型的工厂方法可以在一个位置组合在一起,从而提高可发现性。有关示例,请参阅java.util.concurrent.Executors
。
答案 4 :(得分:1)
方法不仅适用于访问类的数据,还适用于manipulating data