我正在尝试理解静态方法,但遇到了困惑的点。
仅关注方法,如果我创建一个对象实例(类本身不是静态的),那么通常只能访问公共、受保护或内部方法(取决于作用域/封装)。换句话说,我无法访问私有方法。
我读过静态方法比非静态方法略微更有效率的文章。
那么,当创建一个返回类型为void的私有方法时,除非在对象内部创建对象的引用,否则为什么不将其设置为静态?所有我见过的代码都没有这样做,所以我只能认为我错过了重点。
我正在尝试理解静态方法,但遇到了困惑的点。
仅关注方法,如果我创建一个对象实例(类本身不是静态的),那么通常只能访问公共、受保护或内部方法(取决于作用域/封装)。换句话说,我无法访问私有方法。
我读过静态方法比非静态方法略微更有效率的文章。
那么,当创建一个返回类型为void的私有方法时,除非在对象内部创建对象的引用,否则为什么不将其设置为静态?所有我见过的代码都没有这样做,所以我只能认为我错过了重点。
静态方法不能访问类中的非静态成员数据。
静态方法通常被认为是无状态的,因此无法访问实例状态。相比之下,实例方法是有状态的,因此可以读取和修改实例的状态。
无状态方法的典型示例包括:
当然,静态方法并不总是无状态的,也有静态有状态方法的样例。这时候类仅有一个单一状态:
这些实现需要更多的注意,因为类的状态也会被进程中的所有线程共享。
private void AddCount(int number) {
current += number;
}
// Do not do this!
private static void AddCount(MyClass obj, int number) {
obj.current += value;
}
基本通则是,除非对类的所有实例都至关重要,否则不要使变量或函数静态化。当然也有例外情况,但如果您仅出于没有原因而使所有私有方法静态化,那么您很可能会违反面向对象编程范例。
我能想到两个原因:
在我看来,静态方法应该更多地作为一种例外。如果你想要在依赖注入容器中轻松访问应用程序的功能,最好使用单例 bean 并注入它,因为如果你需要的话,仍然可以轻松切换实现。
.NET 有一个特定的用例,即静态方法 - 扩展方法。因此,如果你想将你的功能作为扩展方法可用,就必须使用静态方法。
在代码中看到的大多数方法都会以某种方式使用非静态的类变量/属性。这些无法从静态上下文中访问。这意味着在静态方法中,您只能访问此类的静态成员而不是特定于对象的成员。