Java静态VS实例(Java Static vs Instance)

2019-06-17 17:08发布

所以,我的朋友编码器使用讨厌的static编码。 然而,我的Java程序上充满了阶级之间建立连接,并且我有很多他们的!

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

有没有使用一个比其他任何优势?

Answer 1:

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

例如:

public class Test{

   int x = 5;

 }

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

无论t1t2拥有自己的副本 x

2.一种静态变量是每个类一个那类共享相同的静态变量的每一个对象。

例如:

public class Test{

   public static int x = 5;

 }

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

无论t1t2将有只有一个X在它们之间共享。

当JVM加载类3.静态变量的初始化。

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

5. Static methods连同Static variables可以模仿一个Singleton Pattern ,但它是不正确的做法 ,因为当有很多的班,那么我们不能肯定JVM的类加载顺序,这可能会创建一个问题。



Answer 2:

static是,你不希望有复制每个实例的情况下,

instance变量是您要为对象的每个实例单独副本的情况。

基于业务的情况下,使用哪一个可能会改变。



Answer 3:

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

一般我的原则是,如果你能使用实例变量,只有具有静态变量和函数,如果真的是通用在类而不是对象

这是一个相当好的回答一个类似的问题的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翻过其他方法,如果你需要的。



Answer 4:

垃圾收集 - 静态字段住那么实例字段长得多。 从一个逻辑起点,静态字段只假设每一个实例之间共享 - 如果它确实是你的话,那么当然没问题。



Answer 5:

你说的是静态方法或静态属性?

至于静态方法而言,只有一种滥用他们的方式,那就是当你定义需要一个对象实例作为参数的方法。 你永远不应该需要做到这一点,我认为这样做是编码不良做法。 下面是一个例子:

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

如果你在谈论在类的静态变量,你基本上到这是那里的目的是只有一个特定类的实例“单身”的主题。 单身人士受到了很多的虐待。 它们被用于许多类库(认为JDNI和记录类),但如果应用程序大量使用它们也可以是一个结构化的不良项目的标志。 这可能是你的朋友是婆妈。



Answer 6:

实例和静态变量:

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

内存分配:

对于静态变量仅一个存储位置被分配给irespective没有创建对象和用于分配的实例变量的每个对象一个存储器位置

现在考虑这个例子,考虑你在公司工作的内部项目,你必须创建1M对象Employee类和一些属性Employee类是开斋节,为ename,企业网站管理系统 ,现在重要的是,所有的员工都在XYZ公司工作,所以价值向物业企业网站管理系统是员工的会是“XYZ”不管。

现在你知道的情况下,价值的物业企业网站管理系统中会是XYZ 100万级的对象。

现在,您决定要声明ecomapny财产静态或实例考虑内存分配

如果你把它声明为静态,然后分配到企业网站管理系统最小内存将只有48字节,这非常少的比较来存储1万元的实例变量所需的内存。 100000个* 48字节= 48个百万字节。



Answer 7:

当您使用静态对象(除单身的情况下),你实际执行函数式编程与全局变量相结合。 如果你这样做了很多 - 你应该重新考虑你的任何设计或使用Java(也许你应该使用功能的编程语言,如清单,计划等)。



Answer 8:

临静

一旦静态构件从内部或类的外部调用,则类的静态构造函数被调用。 “静态对象”将度过整个会话,因此你会在性能上胜出。

精读静

静态成员不能有状态,因此他们不能谈论到类的非静态成员。

如果我们考虑到的BigInteger类 ,如果某些零件被制成静态成员这一类将受益

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

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

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



Answer 9:

因为他们没有真正的继承我不喜欢使用静态变量或方法。 这使得它更难以嘲笑进行测试。 使用实例为您提供了完整的多态性的灵活性。 在另一方面,有时静态变量是必要的,例如具有全局缓存。 静态方法可以是一个好处,如果他们提供您不能访问或扩展类/对象/图元的辅助方法。 这些辅助方法是如此简单,他们不需要继承。 例如java.util.Arrays中类或java.util.Collections中。



文章来源: Java Static vs Instance