好的,这可能是一个愚蠢的问题。然而,它真的让我困惑;
一个方法有什么区别:
toString()
和类似的方法
toString(String s)
?
我知道最后一个不存在,但让我说我做了这样的一个。
我为什么要选择制作一个可以这样调用的方法:object.method();
而不是:method(object j );
我希望我能解释一下自己。
答案 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)时,这意味着你需要提供一些参数来完成它的任务。