25

所以我的编码朋友讨厌使用static编码。然而,我的 Java 程序充满了类之间的链接,而且我有很多!

是否值得重写整个代码以删除静态方法?

使用其中一个有什么优势吗?

4

9 回答 9

41

1.一个实例变量是每个对象一个,每个对象都有自己的实例变量副本。

例如:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

两者都t1t2拥有自己的 x.

2.每个 Class一个静态变量,该类的每个对象共享同一个静态变量。

例如:

public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

两者都t1t2一个 x 在它们之间共享。

3. JVM 加载类时初始化一个静态变量。

4. Astatic method 不能访问Non-static变量或方法。

5. as well as可以模仿a Static methods,但这不是正确的方式,因为当有很多类时,我们无法确定JVM的类加载顺序,这可能会产生问题。Static variablesSingleton Pattern

于 2012-08-10T18:38:40.177 回答
7

static适用于您不想为每个实例都有副本的情况

instance变量适用于您希望为每个对象实例单独复制的情况。

根据业务案例,使用哪一个可能会发生变化。

于 2012-08-10T18:02:55.180 回答
5

如果你有太多的静态函数和变量,它可能会导致更实用的方法而不是真正的 OO。此外,如果您有公共静态变量,那么您复制不好的全局变量。跟踪他们是一场噩梦。

一般来说,我的规则是如果可以使用实例变量,并且只有静态变量和函数确实是类而不是对象的泛型时才使用

这是对类似问题 Java 的一个很好的回答 :何时使用静态方法

考虑使用新操作来创建新对象并以非静态方式从该对象访问方法,而不是仅仅链接到方法。

public void myMethod(){
    Time.setTime(Time.getTime() + 20);
    System.out.println(Time.getTime());
}

public void myMethod(){
    Time t = new Time();
    t.setTime(t.getTime() + 20);
    System.out.println(t.getTime());
}

这些方法中保存的任何状态现在都将成为您创建的时间实例。如果需要,您还可以在其他方法中共享变量 t。

于 2012-08-10T18:06:01.097 回答
3

垃圾收集 - 静态字段的寿命比实例字段长得多。从逻辑的角度来看,静态字段仅假设在每个实例之间共享 - 如果确实是您的情况,那么当然没有问题。

于 2012-08-10T18:04:41.330 回答
1

您是在谈论静态方法还是静态属性?

就静态方法而言,只有一种方法可以滥用它们,那就是定义将对象实例作为参数的方法。你永远不需要这样做,在我看来,这样做是糟糕的编码实践。这是一个例子:

static int add(ThisClass a, ThisClass b) {
   return a.value + b.value;
}

如果您在谈论类中的静态变量,那么您基本上进入了“单例”的主题,即只有一个特定类的实例。单身人士受到很多虐待。它们被许多类库(想想 JDNI 和日志记录类)使用,但如果应用程序大量使用它们,则可能表明程序结构不佳。这可能是你朋友在抱怨的地方。

于 2012-08-10T18:10:51.653 回答
1

实例和静态变量:

回答您的问题:我会说值得使用静态变量来节省内存分配。

内存分配:

对于静态变量,无论是否创建对象,只分配一个内存位置,对于实例变量,每个对象分配一个内存位置

现在考虑这个例子,假设您正在处理公司内部项目,您必须为 Employee 类创建 1M 对象,并且Employee类的一些属性现在是eid、ename、ecompany重要的是所有员工都在XYZ公司工作,所以价值无论员工如何,财产公司都将是“XYZ”。

现在您知道情况了,该物业公司的价值XYZ代表 100 万个对象。

Now you decide you want to declare ecomapny property as static or instance considering memory allocation

if you declare it as a static then minimum memory allocated to ecompany will be only 48 bytes which very less compare to memory needed to store 1 Million instance variable. 100000 * 48 bytes = 48 Million bytes.

于 2016-06-10T13:08:11.513 回答
0

当您使用静态对象时(除了单例),您实际上是在实现与全局变量相结合的函数式编程。如果您经常这样做 - 您应该重新考虑您的设计或使用 Java(也许您应该使用函数式编程语言,如列表、方案等)。

于 2012-08-10T18:06:33.027 回答
0

专业静态

一旦从类的内部或外部调用了一个静态成员,就会调用该类的静态构造函数。“静态对象”将贯穿整个会话,因此您将在性能上获胜。

康静态

静态成员不能有状态,因此它们不能与类的非静态成员对话。

例子

如果我们考虑BigInteger 类,如果将某些部分制成静态成员,则该类会有所收获。

该类的一个实例(如预期的那样)代表一个大整数。

但是,主要方法 add 和 multiply 不是静态的(它们应该在更好的世界中),这对性能不利。

因此,在实践中,不应该害怕静态和非静态之间的混合。

于 2014-11-03T12:43:21.033 回答
0

我不喜欢使用静态变量或方法,因为它们没有真正的继承。这使得模拟测试变得更加困难。使用实例为您提供了完全多态的灵活性。另一方面,有时静态变量是必需的,例如使用全局缓存。如果静态方法为您无法访问或扩展的类/对象/基元提供辅助方法,则它们可能会带来好处。这些辅助方法非常简单,不需要继承。例如 java.util.Arrays 类或 java.util.Collections。

于 2015-10-20T06:49:55.930 回答