Java静态与实例

时间:2012-08-10 18:01:07

标签: java static instance

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

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

使用一个优于另一个有什么好处吗?

9 个答案:

答案 0 :(得分:37)

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

<强>例如

public class Test{

   int x = 5;

 }

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

<{1}}和t1 都有自己的 t2副本。

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

<强>例如

x

public class Test{ public static int x = 5; } Test t1 = new Test(); Test t2 = new Test(); t1都会有在它们之间共享一个x。

3. 当JVM加载类时,会初始化静态变量。

4。 t2 无法访问static method变量或方法。

5。 Non-static以及Static methods可以模仿一个Static variables,但是它不是正确的方式< / em>,就像有很多类的时候一样,我们无法确定JVM的类加载顺序,这可能会产生问题。

答案 1 :(得分:7)

static适用于您不希望为每个实例复制的情况

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

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

答案 2 :(得分:4)

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

一般来说,我的规则是使用实例变量,如果你可以而且只有静态变量和函数,如果它真的是一般而不是一个对象

对于类似的问题,这是一个很好的答案 Java: when to use static methods

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

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());
}

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

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

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

如果你在谈论类中的静态变量,那么你基本上就是“单身人士”的主题,而“单身人士”只是一个特定类的一个实例。单身者受到很多虐待。它们被许多类库(想想JDNI和日志记录类)使用,但如果应用程序大量使用它们,它可能是程序结构不良的标志。这可能是你的朋友所喋喋不休的。

答案 5 :(得分:1)

实例和静态变量:

回答你的问题:我认为使用静态变量来节省内存分配是值得的。

内存分配:

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

现在考虑这个例子,考虑你正在开发公司内部项目,你必须在员工类中创建1M对象,而对Employee类的一些属性是 eid,ename,ecompany < / strong>现在重要的是所有员工都在 XYZ 公司工作,因此无论员工如何,物业公司的价值都将是“XYZ”。

现在你知道了这种情况,对于1百万个对象,属性 ecompany 的值将是 XYZ

现在您决定要将 ecomapny 属性声明为静态或考虑内存分配的实例

如果将其声明为静态,那么分配给 ecompany 的最小内存将只有48个字节,这与存储1百万个实例变量所需的内存相比要少得多。 100000 * 48字节= 4800万字节。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

Pro Static

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

Con Static

静态成员不能拥有状态,因此他们无法与该类的非静态成员交谈。

示例

如果我们考虑BigInteger class,如果某些部分被制作成静态成员,则此类将获得

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

然而,主要的方法是加法和乘法不是静态的(它们应该是一个更好的世界),这对性能不利。

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

答案 8 :(得分:0)

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