Java静态与实例

Kez*_*101 23 java static instance

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

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

使用一个优于另一个是否有任何优势?

Kum*_*tra 38

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

例如:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
Run Code Online (Sandbox Code Playgroud)

双方t1t2拥有自己的副本 x.

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

例如:

public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();
Run Code Online (Sandbox Code Playgroud)

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

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

4. A static method 无法访问Non-static变量或方法.

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

  • 我不认为问题是什么是静态变量以及为什么它们是坏的.是否值得删除他的编码器朋友说的坏的静态变量. (5认同)
  • 我已经描述了它们是什么以及它们如何与班级相关联.现在由编码员朋友来决定是否使用......我在第5点也提到它有时会变坏 (5认同)

kos*_*osa 7

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

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

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


RNJ*_*RNJ 5

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

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

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

与其仅仅链接到方法,不如考虑使用 new 操作来创建一个新对象并以非静态方式从该对象访问该方法。

public void myMethod(){
    Time.setTime(Time.getTime() + 20);
    System.out.println(Time.getTime());
}
Run Code Online (Sandbox Code Playgroud)

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

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