0

我有一堂课:

public class C1{
  public int v=10;
  public int myFunction1(){
       // some code
  }
}

调用myFunction1()我们使用:

C1 ob = new C1();
ob.myFunction1();
ob.v;

与“静态”相同:

public class C1{
  public static int v=10;
  public static int myFunction1(){
       // some code
  }
}

调用myFunction1()我们使用:

C1.myFunction1();
C1.v;

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

4

5 回答 5

2

如果我稍微更改一下您的示例,则可以最好地说明差异:

public class C1{
    private final int v;

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

    public int getV(){
       return v;
    }
}

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

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

您不能对static方法执行此操作,因为它们绑定到Class实例而不是实例 - 因此所有方法调用Object都会看到状态的任何变化。

通常,在 OO 设计中,static最好避免使用。它有它的位置,它通常用于实用程序类和常量(尽管在 Javaenum中更适合常量)。

于 2013-10-06T16:41:00.990 回答
1

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

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

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

于 2013-10-06T16:37:39.953 回答
0

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

假设将其更改为 20,然后 C1 类的所有实例都看到此值 20。这在 public int v = 10 的第一种情况下是不可能的;

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

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

于 2013-10-06T20:02:30.223 回答
0

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

于 2013-10-06T16:37:27.707 回答
0

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

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

静态方法不能访问非静态变量。

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

于 2013-10-06T16:48:14.913 回答