Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类方法与实例方法_Java_Class_Instance_Object Oriented Analysis - Fatal编程技术网

Java 类方法与实例方法

Java 类方法与实例方法,java,class,instance,object-oriented-analysis,Java,Class,Instance,Object Oriented Analysis,嗨,类方法通常比实例方法快,因为它不需要加载实例吗?如果是这样,我们应该尽可能使用类方法吗? 谢谢我不知道一般情况,但我记得不久前测量某些应用,静态方法确实更快 从设计的角度来看,我认为任何方法都应该是静态的(也就是说,没有显式地将实例作为参数或类似的东西传递),而类方法可能更快,但您绝对不应该以这种方式编写代码。需要时,应该使用类方法。像数组这样的实用类就是一个很好的例子。返回单身的工厂。当您需要访问类的内部时,千万不要使用它们 如果一个方法不需要实例,它应该是一个类方法。由于类方法只有在不使

嗨,类方法通常比实例方法快,因为它不需要加载实例吗?如果是这样,我们应该尽可能使用类方法吗?
谢谢

我不知道一般情况,但我记得不久前测量某些应用,静态方法确实更快


从设计的角度来看,我认为任何方法都应该是静态的(也就是说,没有显式地将实例作为参数或类似的东西传递),而类方法可能更快,但您绝对不应该以这种方式编写代码。需要时,应该使用类方法。像数组这样的实用类就是一个很好的例子。返回单身的工厂。当您需要访问类的内部时,千万不要使用它们

如果一个方法不需要实例,它应该是一个类方法。由于类方法只有在不使用实例的情况下才可能出现,所以您的问题

我们应该使用类方法吗 可能的

他有一个肯定的答案


但绝对不是出于效率原因

类的每个实例都有“类方法”,而“实例方法”仅适用于当前实例。所以我不明白为什么一个类方法在应用于所有实体时会更快…

不,它们不是更快

然而,只要有可能,就使用类方法是一种很好的做法,因为这样可以表明方法内部的逻辑不需要访问任何成员变量


我是说-不要使用实例方法,它可能是静态的。

请查看链接


无论什么速度更快,速度有多快,您都需要记住一个主要区别:

  • 您不能@重写静态方法
这是非常重要的,因为您本质上说您不会也不能使用Java的一个主要优势,即重写子类对象中的方法。当您调用静态方法时,您将使用该静态方法,并且不能在子类对象中重写它


还要解决“哪个更快”的问题,然后构建一个真正的测试,而不仅仅是一个微基准来调查实际结果。使用多个JVM进行测量,因为JIT实现可能会影响这一点。

在比较类方法和实例方法时,尝试将实例方法视为具有名为this的额外参数的类方法(事实上,现在有些语言实现实例方法)

所以问题变成了,“如果我的方法少了一个参数,它会更快吗?”这个问题没有真正意义,因为参数列表与性能基本无关

尝试根据方法的性质和所需的数据来决定方法是静态的还是实例的,而不是基于一些过早的性能优势。是的,性能是一项功能,但它不是唯一的功能

最后一条绩效经验法则:衡量,衡量,衡量。仅仅因为一些书或文章说某些东西应该更快,并不意味着它对你有用。
根据我的经验,如果您需要初始化一个对象并以任何方式保留它,例如使用数组等。最好在该特定实例上调用实例方法。
调用一个类方法,然后将刚才初始化为参数的同一个实例传递给该类方法是没有意义的。 我不确定运行时的效果,但这样做似乎是一种浪费(名义上或不是)

我主要使用类方法处理不需要初始化的操作,只要有可能。例如,我的MathFunctions类包含我的三角函数方法的所有getter。初始化和创建MathFunctions对象,然后调用实例方法以从其中一个方法获得任意结果是没有意义的。简单地调用类方法更容易(更快)

因此,在任何一种情况下,都不存在“类方法>实例方法”,反之亦然。这完全取决于您的应用程序和您的需要。 首先使用常识,如果您发现自己为保存最少数据的类(如MathFunctions)初始化对象,则最好使用类方法。
但另一方面,如果您发现自己初始化了对象,然后将它们作为参数传递到类方法中,那么使用实例方法可能会更好


这是我的两分钱,我对编程还是比较陌生的,所以请记住这一点。

对我来说,这听起来像是过早的优化。为什么不测量差异呢?这对你来说是一个有用的练习。哇,有很多答案。看看这个问题和我给出的答案,处理同样的问题。一些评论指出,在某些情况下(Android),静态方法实际上比实例方法快@Bruno,可能是因为Android VM不够聪明,无法内联方法调用。这是一个非常积极的优化。需要记住的主要区别是+1。如果你做单元测试,在用静态方法设计应用程序之前要三思。@Andersen:我不同意你的观点。我们可以重写静态方法。但是有几件事需要记住:---重写的方法也必须是静态的。我们不能在那里使用覆盖批注。@Logan,您可以提供另一个具有相同签名的静态方法。这不是重写,因为它不会使现有代码调用旧的静态方法,而是神奇地调用新的静态方法。实际上,在字节码级别,差异不仅仅是调用前必须推送到堆栈上的“this”参数。用于进行调用的操作码也不同。(事实上,这是一些语言的实现。)