3

我似乎真的无法理解静态方法。我阅读了很多关于它的文章,并且在教科书和 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;
    }
}
4

5 回答 5

5

实例方法也可以访问类变量。

一个很好的例子是一个实用程序类:当您需要快速完成某件事,但创建一个对象会很麻烦时,您会怎么做?没错:静态方法。

public static class Utils {
 public static void DoSomething(SomeClass x) { }
}

这样我们就可以调用Utils.DoSomething(myObject);

代替

Utils util = new Utils();
util.DoSomething(myObject);

或者,在您的示例中,它会记录总共创建了多少辆自行车。通过将其保存在类级别,它将使变量的状态在所有对象之间保持同步。

于 2013-10-31T00:48:21.703 回答
3

所谓的类,你的意思是我假设的静态?您可以对实用程序类使用静态方法。它使您不必实例化一个类来访问一个方法。例如,我可以编写一个方法来计算名为 getNumOfLetters 的字符串中的字母数量,并使用 StringUtil.getNumOfLetters 调用它,假设 String utils 是类的名称。

于 2013-10-31T00:48:45.633 回答
2

除了获取类变量之外,类方法真的还有其他原因吗?

假设“类方法”指的是静态方法,它们的用途有很多。除了公开全局常量或共享数据之外,它们可能最常用于不需要在对象实例的上下文中执行的实用功能。

例如:

  1. 与集合相关的操作,如排序、反转等(参见java.util.Collections:)

  2. 固定数学函数(见java.lang.Math:)

  3. 其他操作的包装器,这些操作对空参数具有明确定义的行为(请参阅:java.util.Objects::equals()而不是java.lang.Object::equals()

工厂方法是另一个流行的用例。工厂方法执行与构造函数类似的职责,但允许一些额外的灵活性:

  1. 它们可能有更具描述性的名称,可能传达了正在构建的对象的预期目的。

  2. 他们可以返回一个基本类型,并根据内部逻辑和/或作为参数传递的选项/提示来决定要实例化哪个具体类型。

  3. 许多具体类型的工厂方法可以组合在一个位置,从而提高可发现性。例如,请参阅java.util.concurrent.Executors

于 2013-10-31T00:54:42.153 回答
2

通常书籍会告诉你“类就像对象的蓝图”。但我喜欢将类视为对象的“工厂”。(不要与“工厂模式”混淆,尽管有相似之处!)

通过这个例子,你可以把你的班级想象成一个“自行车工厂”。你可能想做一个stopProducingBicycles(), 或getTotalBicyclesCount(). 或者更花哨的东西:setNewBicycleColor(red).

考虑到setNewBicycleColor()这一点 - 没有什么可以阻止您访问构造函数中的类静态属性,例如“颜色”,因此所有新自行车都具有默认颜色“红色”。

您可能希望保留类中每辆新自行车的引用(这将是一个静态属性)。然后在某个时候你可能会这样做Bicycle.AllInstanciesSelfDestruct():)

于 2013-10-31T00:49:16.267 回答
1

方法不仅用于访问类的数据,还用于manipulating data

于 2013-10-31T00:49:59.300 回答