什么时候应该在类中使用静态方法,有什么好处?

Posted

技术标签:

【中文标题】什么时候应该在类中使用静态方法,有什么好处?【英文标题】:When should I use static methods in a class and what are the benefits? 【发布时间】:2011-01-06 00:19:33 【问题描述】:

我有静态变量的概念,但是类中的静态方法有什么好处。我从事过一些项目,但我没有将方法设为静态。每当我需要调用某个类的方法时,我都会创建该类的一个对象并调用所需的方法。

问: 方法中的静态变量即使在方法执行时也保持其值,但只能在其包含方法中访问,但静态方法的最佳定义是什么?

问: 调用静态方法而不创建该类的对象是静态方法的唯一好处吗?

问:静态方法的可访问范围是多少?

谢谢

【问题讨论】:

这已在 SO 上得到广泛讨论,请查看 ***.com/questions/169378/… 以及搜索“静态方法”时出现的其他问题。 【参考方案1】:

您对静态变量的描述更符合 C 语言中的描述。在面向对象的术语中,静态变量的概念在概念上是不同的。我在这里借鉴 Java 经验。静态方法和字段在概念上不属于某事物的实例时很有用。

考虑一个包含一些常用值(如 Pi 或 e)以及一些有用函数(如 sin 和 cos)的 Math 类。创建单独的实例来使用这种功能确实没有意义,因此它们作为静态更好:

// This makes little sense
Math m = new Math();
float answer = m.sin(45);

// This would make more sense
float answer = Math.sin(45);

在 OO 语言中(同样,从 Java 的角度来看)函数,或者更广为人知的方法,不能有静态局部变量。只有类可以有静态成员,正如我所说,与 C 中的静态概念相比,它几乎没有。

【讨论】:

我不确定我是否同意“创建单独的实例来使用这种功能确实没有意义,因此它们作为静态对象更好” @Charbel 关于数学示例,静态是有意义的,除非您考虑实现 New Math。 补充一点信息,VB.NET 是一种 OOP 语言,并且允许在函数中使用静态局部变量。【参考方案2】:

静态方法不会将“this”指针传递给对象,因此它们不能引用非静态变量或方法,但因此在运行时可能会更高效(参数更少且无需创建和销毁对象)。

它们可用于将内聚方法组合到单个类中,或作用于其类的对象,例如在工厂模式中。

【讨论】:

静态方法可以引用另一个类的非静态方法,只要你在静态函数中声明global $myNonStaticClassObj。您可以使用此方法从非静态成员中读取和设置值,我不明白为什么我总是读到静态方法不能引用非静态方法,这是不正确的。 @andreszs 的重点是,从静态方法中,您不能像在实例方法中那样在 $this 上运行操作。您要么实例化一个新对象,例如new static;,然后在其上运行方法,要么像您的示例中那样声明一个单例。但是你实际上是在外部运行方法,在一个新对象上,而不是在静态上下文中。【参考方案3】:

静态方法的语法(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 的实例。

【讨论】:

有点吹毛求疵:Number 听起来更像是一个表示数值的类,而不是提供算术运算的实用程序类。【参考方案4】:

本质上,静态方法让您可以使用面向对象的语言编写过程代码。它使您无需先创建对象即可调用方法。

【讨论】:

【参考方案5】:

您想在类中使用静态方法的唯一情况是当给定方法不需要创建类的实例时。这可能是在尝试返回共享数据源(例如 Singleton)或执行不修改对象内部状态的操作时(例如 String.format)。

这个***条目很好地解释了静态方法:http://en.wikipedia.org/wiki/Method_(computer_science)#Static_methods

【讨论】:

【参考方案6】:

静态变量和静态方法绑定到类,而不是类的实例。

静态方法不应包含“状态”。任何与状态相关的内容都应该绑定到实例化对象,而不是类。

【讨论】:

没错,无论如何,静态类可以用const 声明常量值,以便为自己提供一个常量、不可更改的值。【参考方案7】:

静态方法的一个常见用法是在命名构造函数中。请参阅:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.8。

【讨论】:

【参考方案8】:

Static Methods in PHP:

可以在不创建类对象的情况下调用。

只能调用静态方法和函数。

【讨论】:

但是您可以从静态方法或函数中调用非静态方法或函数,只需在静态函数中将静态函数的类对象声明为global【参考方案9】:

当您想在类的不同对象之间共享一些信息时使用静态变量。由于变量是共享的,因此每个对象都可以对其进行更新,并且更新后的值也可用于所有其他对象。 由于静态变量是可以共享的,所以通常称为类变量。

【讨论】:

【参考方案10】:

可以从任何上下文(即脚本中的任何位置)访问静态元素,因此您可以访问这些方法,而无需在对象之间传递类的实例。

静态元素在类的每个实例中都可用,因此您可以设置希望对类型的所有成员可用的值。

进一步阅读a link!

【讨论】:

以上是关于什么时候应该在类中使用静态方法,有什么好处?的主要内容,如果未能解决你的问题,请参考以下文章

什么是静态方法?

为什么要使用静态方法

Java中的静态方法是啥?

java里静态方法在啥情况下使用,好处是啥

lt;译文>Python中静态方法和类方法的区别是啥

每天来点Java面试题