2013-10-31 59 views
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; 
    } 
} 
+0

基本上它叫封装:http://gmoeck.github.io/2011/09/20/why-you-should-care-about-encapsulation.html和http://java.dzone.com /用品/为什么封装-事项 –

回答

5

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

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

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

这样,我们只需调用,而不是Utils.DoSomething(myObject);

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

或者,在你的榜样,它让多少自行车总数将创建一个计数。通过将它保存在类级别上,它将保持变量在所有对象之间同步的状态。

3

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

2

通常书籍告诉你像“班级就像对象的蓝图”。但我喜欢将课程视为物体的“工厂”。 (不要与“工厂模式”混淆,虽然有相似之处!)

在这个例子中,您可以将您的班级视为“自行车工厂”。您可能想要执行stopProducingBicycles()getTotalBicyclesCount()。或者更有趣的东西:setNewBicycleColor(red)

遵循setNewBicycleColor()的思想 - 没有什么能够阻止您在构造函数中访问类的静态属性,例如, “颜色”,以便所有新的自行车都有默认颜色“红色”。

您可能希望保留每个新自行车在您的班级(这将是一个静态属性)的参考。然后,在某些时候,你可能会做Bicycle.AllInstanciesSelfDestruct() :)

1

方法不只是访问类的数据,而且还manipulating data

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

相关问题