【问题标题】:java: static and nonstatc function calling approachjava:静态和非静态函数调用方法
【发布时间】:2013-10-06 16:36:17
【问题描述】:

我有一堂课:

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 方法?两者的技术优势和劣势是什么?

【问题讨论】:

  • 在 Java 中它们被称为 methods 而不是 functions

标签: java static-methods


【解决方案1】:

如果我稍微改变一下你的例子,可以最好地说明差异:

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 实例 - 因此,all 方法调用会看到状态的任何变化。

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

【讨论】:

  • All static variables are initialized before any object can be created. 您对此有何看法?如果为真,那么它不会消耗内存
  • @Manish 所有变量都需要在某个时候初始化。事实上static 变量可能更少 消耗内存,每个Class 只有一个实例。通常昂贵的资源(线程安全的)存储在private static 变量中。
【解决方案2】:

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

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

更多讨论请见this threadthis one

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        类似于静态方法。我们都知道静态方法只能访问静态成员。 因此将方法设为静态或非静态取决于您的要求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-20
          • 2019-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多