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

时间:2014-01-16 07:10:33

标签: java static instance

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

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

5 个答案:

答案 0 :(得分:17)

在新手级别:

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

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

答案 1 :(得分:6)

static变量通常用于常量,如果是类,则对所有实例都是通用的。例如,许多人不喜欢在代码中“硬编码”常量;他们喜欢使用有意义的名称制作public staticprivate static变量,并在代码中使用它,这样可以使代码更具可读性。

简短

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

答案 2 :(得分:5)

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

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

静态功能:用于执行一些实用程序任务。无需任何对象声明即可调用。

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

static或instance取决于您的用途。

答案 3 :(得分:1)

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

同样使用全局变量总是会使单元测试更难 - 需要考虑的另一个缺点。

答案 4 :(得分:0)

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

Bar.altmethod(Foo f, Bar b2)

static staticMethod(Foo f, Bar b1, Bar b2)

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

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

想象

class GeographicalFigure {
    Object quadrature() { ... }
}

保留以后添加

的可能性可能会有用
class Circle extends GeographicalFigure {
    Object quadrature() {
        throw new ThisIsNoGoodException();
    }
}

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