我有静态变量的概念,但什么是在类中的静态方法的好处。我曾参与过一些项目,但我没有使静态的方法。每当我需要调用一个类的方法时,我都会创建该类的一个对象并调用所需的方法。什么时候应该在一个类中使用静态方法,并且有什么好处?
问:方法中的静态变量即使在执行方法时也保存它的值,但只能在其包含的方法中访问,但什么是静态方法的最佳定义?
问:是否调用静态方法而不创建该类的对象是静态方法的唯一好处?
问:什么是静态方法的可访问范围?
谢谢
我有静态变量的概念,但什么是在类中的静态方法的好处。我曾参与过一些项目,但我没有使静态的方法。每当我需要调用一个类的方法时,我都会创建该类的一个对象并调用所需的方法。什么时候应该在一个类中使用静态方法,并且有什么好处?
问:方法中的静态变量即使在执行方法时也保存它的值,但只能在其包含的方法中访问,但什么是静态方法的最佳定义?
问:是否调用静态方法而不创建该类的对象是静态方法的唯一好处?
问:什么是静态方法的可访问范围?
谢谢
您对静态变量的描述更适合于在C中找到的内容。面向对象术语中的静态变量的概念在概念上是不同的。我从这里借鉴了Java的经验。静态方法和字段在概念上不属于某个事物的实例时非常有用。
考虑一个Math类,它包含一些常见的值,如Pi或e,以及一些有用的函数,如sin和cos。这真的没有意义创建单独的实例来使用这种功能,因此它们的静好:
// This makes little sense
Math m = new Math();
float answer = m.sin(45);
// This would make more sense
float answer = Math.sin(45);
在面向对象的语言(再次,从Java透视图)的功能,或更好地称为方法,不能有静态局部变量。只有类可以有静态成员,正如我所说,与C中的静态想法相比很少。
我不确定我是否同意这样的说法:“创建单独的实例来使用这种功能是没有意义的,因此它们更像静态方法” – Charbel 2016-03-27 23:42:25
@Charbel关于数学例如,除非您考虑实施[新数学](https://www.youtube.com/watch?v=UIKGV2cTgqA),否则静态将有意义。 – 2016-08-16 16:37:09
静态方法的一个常见用法是在指定的构造函数方法中。请参阅:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.8。
该链接似乎死了... – 2017-08-27 14:43:03
您希望在类中使用静态方法的唯一时间是给定方法不要求要创建的类的实例。这可能是在尝试返回共享数据源(例如Singleton)或执行不修改对象内部状态的操作时(例如String.format)。
此维基百科条目解释静态方法非常好:http://en.wikipedia.org/wiki/Method_(computer_science)#Static_methods
静态变量和静态方法被绑定到类,而不是类的实例。
静态方法不应该包含“状态”。任何与状态有关的东西都应该绑定到一个实例化的对象,而不是类。
从本质上讲,静态方法可让您用面向对象的语言编写过程代码。它可以让你调用方法而不必先创建一个对象。
静态方法不会将“this”指针传递给对象,因此它们不能引用非静态变量或方法,但可能因此在运行时更高效(参数更少且无创建和销毁开销一个东西)。
它们可以用于将连贯方法分组到单个类中,或者对其类中的对象(如工厂模式)进行操作。
语法(PHP)的静态方法:
<?php
class Number {
public static function multiply($a, $b) {
return $a * $b;
}
}
?>
客户端代码:
echo Number::multiply(1, 2);
这使得比更有意义:
$number = new Number();
echo $number->multiply(1, 2);
由于multiply()
方法不使用任何类变量,因此不需要Number
的实例。
小挑剔:数字听起来更像一个表示数值的类,而不是提供算术运算的工具类。 – RecursiveExceptionException 2016-06-10 18:49:26
当您想要在类的不同对象之间共享某些信息时,使用静态变量。由于变量是共享的,每个对象都可以更新它,并且更新后的值也可用于所有其他对象。由于静态变量可以共享,所以这些通常称为类变量。
可以从任何上下文(即脚本中的任何位置)访问静态元素,因此您可以访问这些方法而无需将类的实例从对象传递到对象。
静态元素在类的每个实例中都可用,因此您可以设置想让所有类型成员都可以使用的值。
供进一步阅读a link!
这已经在SO上相当广泛的讨论,检查出http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it/169423#169423和其他问题当你搜索“静态方法”时会出现。 – PeterAllenWebb 2010-01-17 06:22:44