66

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

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

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

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

谢谢

4

10 回答 10

63

您对静态变量的描述更适合 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 中的静态概念相比,它几乎没有。

于 2010-01-17T06:19:33.667 回答
17

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

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

于 2010-01-18T13:46:44.983 回答
12

静态方法的语法 (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.

于 2010-01-20T12:18:43.410 回答
8

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

于 2010-01-17T06:49:22.353 回答
6

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

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

于 2010-01-17T06:41:24.117 回答
4

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

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

于 2010-01-17T06:43:07.683 回答
2

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

于 2010-01-17T06:17:42.687 回答
2

PHP中的静态方法

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

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

于 2010-01-18T13:11:14.750 回答
1

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

于 2012-11-21T08:59:36.193 回答
1

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

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

进一步阅读链接

于 2014-03-05T10:26:02.693 回答