Java静态与实例

Java静态与实例,java,static,instance,Java,Static,Instance,所以我的编码朋友讨厌使用静态编码。然而,我的Java程序充满了链接类之间的信息,我有很多 是否值得重写整个代码以删除静态方法 使用一个实例比另一个实例有什么好处吗?static适用于不希望每个实例都有副本的情况 instance变量适用于需要为对象的每个实例单独复制的情况 根据业务案例,使用哪一个可能会发生变化。垃圾收集-静态字段的寿命比实例字段长得多。 从逻辑的角度来看,静态字段只假设在每个实例之间共享——如果它确实是您的情况,那么当然没有问题 如果你有太多的静态函数和变量,它可能会导致一种更

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

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


使用一个实例比另一个实例有什么好处吗?

static
适用于不希望每个实例都有副本的情况

instance
变量适用于需要为对象的每个实例单独复制的情况


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

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

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

一般来说,我的规则是使用实例变量,如果静态变量和函数在类上而不是对象上是泛型的,那么就可以使用静态变量和函数

这是对类似问题的一个很好的回答

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

以前

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


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

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

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

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

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

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

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

例如:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
t1
t2
都将拥有自己的
x
副本

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

例如:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
t1
t2
都将有正好一个x在它们之间共享。

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

4.A
静态方法
无法访问
非静态
变量或方法


5.
静态方法
以及
静态变量
可以模仿一个
单例模式
,但这不是正确的方法,因为当有很多类时,我们无法确定JVM的类加载顺序,这可能会产生问题。

预静态

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

Con Static

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

示例

如果我们考虑,这个类会在某些部分变成静态成员时获得。 该类的实例表示(如预期的)一个大整数

但是,主要的加法和乘法方法不是静态的(在更好的情况下应该是静态的),这对性能不利


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

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

实例和静态变量:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
回答您的问题:我认为使用静态变量来节省内存分配是值得的

内存分配:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
对于静态变量只分配一个内存位置,而对于实例变量每个对象只分配一个内存位置

现在考虑这个例子,考虑你正在做的公司内部项目,你必须创建1M对象到<强>雇员> /强>类,并且对雇员类的一些属性是“强> EID、EnEnm、EnpPoN<强”。现在重要的是所有员工都工作在<强> XYZ <强>公司,所以对财产有价值。