何时使用静态变量/方法以及何时在Java中使用实例变量/方法?

我想问一个问题,什么时候使用静态变量/方法或在Java中的其他情况下的实例变量/方法是有利的?

我知道这取决于某些情况(比如将util-classes编程为静态方法),但我们可以声明类似于一般策略的东西吗?

在新手级别:

在以下情况下使用实例变量:每个变量对于不同对象具有不同的值。 例如:学生姓名,卷号等。

在以下情况下使用静态变量:变量的值独立于对象(对于每个对象不唯一)。 例如:没有学生。

static变量通常用于常量,这对于类的所有实例都是通用的。 例如,许多人不喜欢在代码中“硬编码”常量; 他们喜欢使用有意义的名称创建一个public staticprivate static变量,并在其代码中使用它,这应该使代码更具可读性。

简而言之

任何独立于类实例状态的方法或变量都应该是静态的

静态变量:当您需要在整个应用程序中使用的东西时,每个实例都需要知道变量。

实例变量:它与对象和对象的属性不同,而静态变量是Class的属性。

静态function:用于做一些实用任务。 无需任何对象声明即可调用。

实例function:需要对象来调用此function。

static或instance取决于您的用途。

将静态变量视为类范围的全局变量,或者,如果使用“final”关键字,则将其视为类范围的全局常量。 明智地使用静态非最终变量 – 它们在所有类实例之间共享,并且可能导致一些非明显的错误。 我建议完全避免使用可变的静态变量 – 有很少甚至没有这种情况,使用dependency injection无法实现这种需求。

使用全局变量总是会使unit testing更加困难 – 需要考虑的另一个缺点。

至于方法:根据定义,每个方法Foo.method(Bar1 b1,Bar2,b2)总是可以有其他等效设计:

Bar.altmethod(Foo f,Bar b2)

静态静态方法(Foo f,Bar b1,Bar b2)

你也可以将后一种方法作为intsance方法包装在一个服务类中,该服务类本身就是一个单例(因此该方法的静态有点隐藏它所在的类)。

将您的方法作为您的一个方法参数(静态版本)的类的实例方法的唯一令人信服的理由是,当您希望该类具有子类时,并且它可能对这些子类有用有一个专门的方法实现。

想像

class GeographicalFigure {Object quadrature(){…}}

保留以后添加的可能性可能是有用的

class Circle扩展GeographicalFigure {Object quadrature(){throw new ThisIsNoGoodException(); }}

除此之外,您的所有选择都基本相同。