java:static和nonstatc函数调用方法

java: static and nonstatc function calling approach

我有一堂课:

1
2
3
4
5
6
public class C1{
  public int v=10;
  public int myFunction1(){
       // some code
  }
}

要调用myFunction1(),我们使用:

1
2
3
C1 ob = new C1();
ob.myFunction1();
ob.v;

与"static"相同:

1
2
3
4
5
6
public class C1{
  public static int v=10;
  public static int myFunction1(){
       // some code
  }
}

要调用myFunction1(),我们使用:

1
2
C1.myFunction1();
C1.v;

所以我的问题是这两种方法有什么区别。什么时候使用static方法比较好?两者的技术优势和劣势是什么?


如果我稍微改变一下您的示例,就可以很好地说明这一区别:

1
2
3
4
5
6
7
8
9
10
11
public class C1{
    private final int v;

    public C1(final int v) {
        this.v = v;
    }

    public int getV(){
       return v;
    }
}

在这种情况下,当你创建你的C1时,你给它一个内部状态,即v。现在你可以了

1
2
final C1 firstC1 = new C1(10);
final C1 secondC1 = new C1(20);

使用static方法不能这样做,因为它们绑定到Class实例,而不是Object实例,因此所有方法调用都会看到状态的任何变化。

一般来说,在OO设计中,最好避免使用static。它有它的位置,它经常用于实用类和常量(尽管在Java EDCOX1中,13个s对于常数来说更好)。


如果C1没有您想要在实例之间改变的内部状态(字段),那么就没有太大的区别。但是您应该使用单例模式(因为C1的所有实例基本上都是相同的)。如果v在不同的实例之间有所不同,或者子类化可能会在C1的实例之间产生差异,那么static方法通常不会很好地解决问题。

使用singleton而不是static方法的主要原因是可以声明singleton来实现各种接口。

有关更多讨论,请参阅此线程和此线程。


它有很大的不同。具有非静态成员和静态成员的类定义在不同的场景中都很有用。我们都知道静态成员变量由该类的所有实例共享。所以,在第二种情况下公共静态int v=10;

假设将其更改为20,那么类C1的所有实例都会看到这个值20。这在第一种情况下是不可能的公共int v=10;

在这种情况下,c1的所有实例都有自己的v副本,该副本初始化为10。一个实例将v 10的值更改为其他某个值,而不会影响其他实例v的值。

与静态方法类似,我们都知道静态方法只能访问静态成员的。所以,使方法静态或非静态取决于您的需求。


静态方法首先加载到内存堆栈中。如果您注意到类的主方法本身是静态的[public static void main]

类的所有实例都共享静态变量。所有静态变量都在创建任何对象之前初始化。

静态方法无法访问非静态变量。

静态方法适用于不依赖于特定实例的实用方法。


static成员由所有实例共享,因此如果创建两个实例,那么两个htem都将共享v的值。静态/非静态的缺点没有优势,这取决于需要。如果希望一个属性的值由所有实例共享,那么将其标记为静态的;如果希望每个实例都有自己的属性值,那么将其标记为非静态的。