2010-01-17 72 views
56

我有静态变量的概念,但什么是在类中的静态方法的好处。我曾参与过一些项目,但我没有使静态的方法。每当我需要调用一个类的方法时,我都会创建该类的一个对象并调用所需的方法。什么时候应该在一个类中使用静态方法,并且有什么好处?

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

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

问:什么是静态方法的可访问范围?

谢谢

+4

这已经在SO上相当广泛的讨论,检查出http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it/169423#169423和其他问题当你搜索“静态方法”时会出现。 – PeterAllenWebb 2010-01-17 06:22:44

回答

58

您对静态变量的描述更适合于在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中的静态想法相比很少。

+0

我不确定我是否同意这样的说法:“创建单独的实例来使用这种功能是没有意义的,因此它们更像静态方法” – Charbel 2016-03-27 23:42:25

+0

@Charbel关于数学例如,除非您考虑实施[新数学](https://www.youtube.com/watch?v=UIKGV2cTgqA),否则静态将有意义。 – 2016-08-16 16:37:09

2

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

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

8

从本质上讲,静态方法可让您用面向对象的语言编写过程代码。它可以让你调用方法而不必先创建一个对象。

15

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

它们可以用于将连贯方法分组到单个类中,或者对其类中的对象(如工厂模式)进行操作。

11

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

+0

小挑剔:数字听起来更像一个表示数值的类,而不是提供算术运算的工具类。 – RecursiveExceptionException 2016-06-10 18:49:26

1

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

1

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

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

供进一步阅读a link

相关问题