采取参数的方法和不参数的方法之间的区别?

时间:2015-12-31 10:46:36

标签: java methods

好的,这可能是一个愚蠢的问题。然而,它真的让我困惑;
一个方法有什么区别:

 toString()  

和类似的方法     toString(String s)

我知道最后一个不存在,但让我说我做了这样的一个。
我为什么要选择制作一个可以这样调用的方法:object.method();而不是:method(object j );我希望我能解释一下自己。

3 个答案:

答案 0 :(得分:2)

这一切都取决于你想要的方法。

例如,.toString()用于提供对象的字符串表示。在这种情况下,该方法需要按预期运行的所有数据都存储在对象本身内,因此不需要外部输入。

举一个不同的例子,printToStream(Stream stream)(其中Stream将是所有流使用的一些接口,无论是文件流,控制台流,网络流等)。在这种情况下,方法需要知道它必须写入哪个流。

printToStream方法所属的类可以具有一个属性,该属性表示必须打印哪个流,从而允许我们将printToStream的签名更改为printToStream(),但是这将需要2行代码来设置,在这种情况下,这可能会引入问题,特别是如果您需要打印到不同的流,并且在某些时候,您忘记设置属性。因此,在这种情况下,使用该方法获取额外参数会产生更清晰的代码,这样更容易出错。

编辑:parseInt方法是一个静态方法,由Integer类提供,用于将项目从一种类型转换为整数。静态方法是需要自包含的方法,因此如果要使用静态方法将一个对象从一个表单转换为另一个表单,则将其作为参数传递即可。

你提出的建议会看起来像这样:int a = "123".ToInteger();。我想这可能是做同样事情的一种方法,但最终Java规范并没有设计出那种心态。

编辑2:我将尝试扩展@ user3284549提供的答案。请注意,我的答案绝不是最终的,应该在网上找到其他材料。在Java中,方法是:

  • 静态。静态方法是没有状态的方法(稍后会更多)并且是自包含的。如前所述,.parseInt类中的Integer方法就是这种方法的一个示例。另一个例子由Math类提供。

  • 非静态。非静态方法是一旦对象初始化(或实例化)就可用的方法。这些方法是作用于对象状态的方法,或者暴露对象提供的某些功能,这些功能可能反过来影响它的行为。

再次以你的骰子为例,你可以通过两种方式实现这一目标:

我们假设我们有一个名为Dice的类:

public class Dice {
    private int value;

    public int getValue() {
        return this.value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}
  

静态方法

public static void roll(Dice d) {
    //Rolling the dice entails a potential change in it's current value. Thus, you would need to access the dice itself and update the value.
    Random r = ...
    d.setValue(randomNumber);
}
  

非静态方法

我们只是增强Dice类,使其具有模仿掷骰子的新方法,如下所示:

public void roll() {
    Random r = ...;
    this.value = randomNumber;
}

如果你注意到,即使在静态方法中,我们仍然使用了一个接受参数的方法。特定的setXXX方法(及其对应的getXXX方法为我们提供了encapsulation)。这是因为我们需要更改Dice对象的状态。

答案 1 :(得分:1)

对于你问题的第二部分。想想封装。如果该方法需要访问对象专用的数据,那么object.method()将是正确的方法。而且它可能对处理任何其他类型的对象没有帮助。

对于第二种类型,它可以是许多不同对象上常用的静态方法或实用方法。方法实现逻辑不必与对象的内部实现紧密相关。

答案 2 :(得分:1)

让我们继续你的例子 -

object.method();
object.method(Object j);  

第一个对它的变量进行一些操作并返回/设置一些值(虽然可能有很多其他情况,但为了简单起见,只考虑这些)。当方法为toString()时,它实际上表示对象的一些重要属性的字符串表示。在这种情况下,toString()方法不需要从对象外部提供一些参数。

当你使用object.method(Object j)时,这意味着你需要提供一些参数来完成它的任务。