我什么时候应该在课堂上使用静态方法?有什么好处?

Nav*_*eed 62 oop static-methods static-variables

我有静态变量的概念,但静态方法在类中有什么好处.我曾经参与过一些项目,但我并没有将方法设为静态.每当我需要调用类的方法时,我创建该类的对象并调用所需的方法.

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

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

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

谢谢

D.C*_*.C. 62

您对静态变量的描述更符合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);
Run Code Online (Sandbox Code Playgroud)

在OO语言中(再次,从Java的角度来看)函数,或者更好地称为方法,不能具有静态局部变量.只有类可以有静态成员,正如我所说的,与C中静态的概念相比,它们很少.


Phi*_*lMY 15

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

它们可用于将内聚方法分组到单个类中,或者用于对其类的对象进行操作,例如在工厂模式中.


jmo*_*moz 12

静态方法的语法(php):

<?php
class Number {
    public static function multiply($a, $b) {
        return $a * $b;
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

客户代码:

echo Number::multiply(1, 2);
Run Code Online (Sandbox Code Playgroud)

这比以下更有意义:

$number = new Number();
echo $number->multiply(1, 2);
Run Code Online (Sandbox Code Playgroud)

由于该multiply()方法不使用任何类变量,因此不需要实例Number.


Dav*_*son 8

实质上,静态方法允许您以面向对象的语言编写过程代码.它允许您调用方法而无需先创建对象.


小智 6

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

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