【问题标题】:calling static array from another class从另一个类调用静态数组
【发布时间】:2014-09-14 17:52:11
【问题描述】:

我有两个程序。我创建了一个静态数组和一些方法,如下所示:

public Someclass{
    static int counter[] = new int[n];

    //methods & main

}

n 被定义为某个数字,所以我知道它会有一些长度。后来我填充了这个数组并测试它是否被正确填充,所以我知道一些索引应该有 0 以外的值。现在当我尝试在第二个程序中调用它时,虽然我从未填充它,因为它只给出我是 0。

  //second program 
  public Someclass2{

      public static main(String[] args){
         String n = "someword"
         int[] nums = new int[n.length]
         for( int i = 0; i < n.length; i++){
            nums[i] = nums[i] + (25 * SomeClass.counter[i]); 
          }
      }

 }

由于某种原因,当我在第二个程序中调用数组时,它返回全零并且不会更改 nums 的值,即使我知道计数器数组应该具有非零值。我认为这与我静态初始化它但我在本地方法和类中填充它的事实有关。所以从技术上讲,它永远不会更新零。我在尝试解决此问题时遇到了麻烦,如果有人可以提供帮助,我会很感激。

谢谢

【问题讨论】:

  • 什么时候调用 SomeClass 中的本地方法来修改计数器数组?
  • 静态数组被初始化为全零。你没有把价值观放进去。如果您已处理值。您的 main 方法中没有调用它。

标签: java arrays class static global


【解决方案1】:

我的猜测:您在 SomeClass 中填充数组,但在使用其他类中的数组之前永远不要调用该填充代码。解决方法:一定要先填写。如需更具体的帮助,请向我们展示有关您的代码的更多详细信息。

其他点——通常最好避免使用静态字段,而将数组设为实例字段通常会更好。然后,您可以通过其包含类确定其状态,还可以通过包含您希望对其进行更改的能力施加任何限制的包含类来更改其状态。

【讨论】:

    【解决方案2】:

    如果第二个“程序”真的是一个单独的程序,而不仅仅是另一个类,那么它就不会按照您想要的方式工作。当第二个程序调用静态类时,它只会为第二个程序创建一个新数组,而您在第一个程序中填写的原始数组会为第一个程序保留。静态变量只能被同一程序的其他部分访问,而不是计算机上运行的所有程序。

    【讨论】:

      【解决方案3】:

      问题出在这里:nums[i] = nums[i] + (25 * SomeClass.counter[i]);

      基本上你已经创建了一个数组并且没有填充它。
      所以如果 n = 5 然后 counter == {0,0,0,0,0}

      这意味着每个索引都会获得 0 的默认值,因此每次执行此操作时:
      25 * SomeClass.counter[i] 乘以 0,当然会返回 0

      【讨论】:

        【解决方案4】:

        Someclass2.main() 中没有任何事情会导致Someclass 中的静态数组被填充。全部为零,因为Java spec defines it

        每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化(第 15.9 节、第 15.10 节)[...] 对于 int 类型,默认值为零,即 0。

        第二个程序从不修改Someclass.counter 的状态,导致全为零。

        【讨论】:

          猜你喜欢
          • 2016-07-02
          • 2012-11-09
          • 1970-01-01
          • 1970-01-01
          • 2016-06-26
          • 2013-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多