【问题标题】:instantiation of static array in Android / JavaAndroid / Java中静态数组的实例化
【发布时间】:2013-07-02 06:29:47
【问题描述】:

在下面显示的代码示例中,我使用“new”关键字来实例化一个字符串数组。但是实例化仅适用于对象,由于 c[] 数组是静态的,这样做是错误的吗?有没有另一种方法可以做到这一点,或者我应该使用“新”来实例化它,就好像它是一个对象一样?

public class SmallTank {

static String tableString = " ";

static String c[];
static String d[];
static String p;

public SmallTank(){

    c = new String[66];
    d = new String[29];

    // initialize string array
    for(int v = 0; v<66; v++ ){
        c[v] = null; 
    }

【问题讨论】:

  • 在旁注中使用静态是不好的做法,如果可能的话,你应该避免它:)
  • 如果你的尺寸保持不变,那么它很好,否则会产生异常。
  • 如果你想创建一个新的字符串数组,你确定你会为其放置 66 个字符串对象,那么在我看来,“new”是好的。但如果字符串对象不同,请尝试使用 ArrayList 或 Vector。您应该在静态引用中初始化静态变量,以防万一可以是静态初始化块。

标签: java android arrays static


【解决方案1】:

数组是一个对象。所以 c 是一个对象,它是静态的并不会改变这一点。

它的意思是,SmallTank每个对象 最终都会覆盖cd

我认为你想做的是static initialization

添加

static {
    c = new String[66];
    d = new String[29];

    // initialize string array
    for(int v = 0; v<66; v++ ){
        c[v] = null; 
    }
}

并从构造函数中删除这些调用。

这将只初始化一次cd

【讨论】:

    【解决方案2】:

    您的数组是对象。因此它们是用new 创建的。

    只有对这个对象的引用通过static关键字绑定到class

    【讨论】:

      【解决方案3】:

      您的方法的问题是每次创建 SmallTank 实例时都会初始化数组。也许这是您想要的,但通常静态初始化器是正确的方法:

      public class SmallTank {
      
          static String tableString = " ";
      
          static String c[] = new String[66];
          static String d[] = new String[29];
          static String p;
      
          static {
              // initialize string array
              for(int v = 0; v<66; v++ ){
                  c[v] = null; 
              }
      

      这将在第一次加载类时初始化数组一次 - 通常是在您第一次创建它的任何实例时。

      正如其他人指出的那样,初始化为 null 是没有意义的。

      【讨论】:

        【解决方案4】:

        static修饰符的含义是:

        您可以将“静态”方法或字段视为在类定义之外声明。换句话说

        静态字段/方法只有一个“副本”。 静态字段/方法无法访问非静态字段/方法。

        所以你想要的是:

        static String c[] = new String[66];
        static String d[] = new String[29];
        

        【讨论】:

          【解决方案5】:

          在声明数组时初始化数组,而不是在构造函数中。

          public class SmallTank {
              static String c[] = new String[66];
              static String d[] = new String[99];
          ...
          }
          

          在构造函数中这样做是合法的,但是使用静态字段的目的是在实例之间共享它。在您的情况下,每次创建 SmallTank 的新实例时,数组都会被重置。

          【讨论】:

            【解决方案6】:

            您不需要此代码 c[v] = null; ,默认情况下,引用数组的所有元素都是 null。 Array 是一个 object ,因此您使用 new 来实例化它。不要在构造函数里面做,直接在声明的地方实例化即可。

            static String c[] = new String[66];
            

            这将创建一个静态数组对象,因此该类的所有实例共享该对象。您也可以通过其他方式创建数组:

            static String[] c = {"a","b","c"};
            static String[] c = new String[]{"a","b","c"};
            

            【讨论】:

              【解决方案7】:

              在 java 中,每个 array 都是一个 object。没关系数组是静态引用。 出于初始化目的,您可以使用静态初始化块

                static {
              
                      c = new String[66];
                      d = new String[29];
              
                      }
              

              当类加载到内存中时,它只会先加载一次。

              【讨论】:

                【解决方案8】:

                数组是 Java 中的对象。因此,它们是使用 new 关键字创建的。

                并且静态字段/方法只有一个“副本”。意味着类中只有一个静态变量,并且始终在类的所有方法之间共享。静态字段/方法无法访问非静态字段/方法。

                因此您可以将代码修改为:

                static String c[] = new String[66];
                static String d[] = new String[29];
                

                您也可以参考以下文档: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

                【讨论】:

                  猜你喜欢
                  • 2018-02-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-03
                  • 2013-08-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多