静态方法的用途是什么?

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;
    }
}

基本上它被称为封装:http://gmoeck.github.io/2011/09/20/why-you-should-care-about-encapsulation.html和http://java.dzone.com/articles/why-encapsulation-matters - Iłya Bursov
5个回答

5

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

一个很好的例子是一个实用工具类:当你需要快速完成一件事情,但创建一个对象会很麻烦时,你该怎么办?没错:使用静态方法。

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

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

而不是

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

或者以您的示例为例,它保留了创建的自行车总数的计数。将其保存在类级别上,将使该变量的状态在所有对象中同步。


3

你的意思是静态类吗?你可以使用静态方法来实现工具类。这样就不需要实例化一个类来访问方法


2
通常书籍会告诉你“类就像对象的蓝图”。但我喜欢把类看作是对象的“工厂”(不要与“工厂模式”混淆,虽然它们有相似之处!)。
以这个例子为例,你可以把你的类想象成“自行车工厂”。你可能想要执行stopProducingBicycles()getTotalBicyclesCount()。或者做一些更加花哨的事情:setNewBicycleColor(red)
setNewBicycleColor()的思路下,没有任何阻止你在构造函数中访问类静态属性,例如“color”,以便所有新自行车都具有默认颜色“red”。
您可能希望在您的类中保留每辆新自行车的引用(这将是一个静态属性)。然后,在某个时候,您可能会执行Bicycle.AllInstanciesSelfDestruct() :)。

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的示例。

1

方法不仅用于访问类的数据,还可以操作数据


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接