【问题标题】:How do I access a private array from a subclass in Java?如何从 Java 中的子类访问私有数组?
【发布时间】:2020-12-07 03:25:51
【问题描述】:

我知道从子类中直接调用私有数组是不可能的,但我仍然需要以某种方式访问​​它,那么最好的方法是什么?现在我有一个用于我的主要方法的类、随机数组、播放器数组和第四个类,我想用它来比较两个数组。

到目前为止,我已经尝试创建一个仅返回数组的 getter 方法,然后我会从 compare 类中调用该 getter 方法。这失败了,所以我尝试制作一个基本的 for 循环将返回该数组中的每个值,但这也不起作用。所以我的问题是如何将私有数组的值放入子类中?

这是我的尝试之一,它只打印 0 0 0 0

    public class test {
      public static void main(String[] args) {
      Scanner console = new Scanner(System.in);

      PlayerArray player = new PlayerArray(console);

      testArray test = new testArray();
      test.printArray();
    }


    class PlayerArray extends RandomArray {
       private int[] playerArray = new int[4];

       public PlayerArray() {
       }

       public PlayerArray(Scanner console) {
           System.out.println();
           System.out.println("Enter 4 numbers you wish to guess: ");
           for(int i=0; i<playerArray.length; i++) {
              playerArray[i] = console.nextInt();
           }
       }

      public int[] getPlayerArray() {
         return playerArray;
      }
    }


  class testArray extends PlayerArray {

    public void testArray() {
    }

    public void printArray() {
        System.out.println(getPlayerArray());
        for (int i = 0; i < 4; i++) {
            System.out.print(getPlayerArray()[i]);
        }

    }
 }

【问题讨论】:

  • 我已经在谷歌上搜索了很多次这个问题,看了很多视频,但没有任何帮助。一切都只是谈论超级基本的封装,例如用户在 setter 方法中输入名称,然后系统打印 getter 方法。我不确定为什么需要 1000 个资源来了解最基本的封装可能使用情况,因为如果人们要努力解决问题,那将是困难的问题,而不是超级简单的问题......

标签: java arrays class subclass private


【解决方案1】:

你在做。

但是,public void testArray() 什么都不做 - 你打算创建一个构造函数吗?那些没有返回类型,所以只有public testArray

因为你没有写构造函数,java给你做了一个。相当于:

public testArray() {
    super();
}

如,它调用不做任何事情的 PlayerArray 构造函数,因此导致 playerArray 持有 4x 一个 0 值。如果你想要别的东西,那么Scanner 引用不会凭空出现,所以:

public testArray(Scanner console) {
    super(scanner);
}

调用“正确的”。

注意:它应该是TestArray,并且让数组对外部可见是不好的;你无法控制它,你给它的任何人都可以改变它,例如getPlayerArray()[i] = 10;。一般来说,使用列表(java.util.List)等代替数组。

【讨论】:

  • 我之前使用了构造函数,所以我只是把它留在了那里,但是我从我的 main 方法中调用了所有方法。 PlayerArray player = new PlayerArray(console); testArray test = new testArray(); test.printArray();
  • 我更新了我的帖子以反映 main 方法,因为它引起了一些混乱,但我忽略了我的另一个类,因为它与我的 PlayerArray 类存在相同的问题。我需要使用普通的私有数组,我不能使用数组列表。我明白你所说的不安全的意思,这在我的情况下不是问题,但对未来很有用。
  • ` PlayerArray player = new PlayerArray(console); testArray test = new testArray(); test.printArray();` 好的,现在你有两个独立的 PlayerArray 对象。一个具有您输入的任何值,另一个使用该无参数构造函数完全不同,因此是 4x 0 值。每个实例都有自己的副本。您只需要一个实例:testArray ta = new testArray(console);
  • 我只是试图让我的 playerArray 静态并且它工作,所以我认为我的问题与被视为对象的数组有关,然后我没有正确调用它,但我不确定。
  • playerArray 绝对不应该是静态的,在这里。也许您需要重新阅读课程或教程中涉及面向对象的任何部分。那个,或者停止扩展。
【解决方案2】:
  PlayerArray player = new PlayerArray(console);

在这里,您创建一个 PlayerArray 实例,它接收控制台并填充内部数组。

  testArray test = new testArray();
  test.printArray();

在这里,您创建一个新的 testArray 实例,其中尚未填充内部数组。

要打印正确的值,您需要将 printArray() 方法复制到 Player 类并在播放器实例上调用 printArray() 方法。

  player.printArray();

然后从 Main 方法中删除 testArray() 实例。它在这里毫无用处。

或者,您可以在 Player 类中添加一个构造函数,该构造函数接受控制台并通过 super(console) 将其传递给 Super;

【讨论】:

  • 我试过了,它只是给了我一个错误,因为我将使用 Player 类的对象来尝试调用 testArray 类
  • 对不起,我忘记写了,你需要先将 printArray() 方法复制到 Player 类。我更新了我的答案以反映这一点。您的问题是您实例化了 2 个不同的对象,其中一个包含实际填充的数组,但您在另一个上调用 printArray 方法。我没有看到 TestArray 类的用途,所以我建议删除该类并改用 PlayerArray。
猜你喜欢
  • 2019-04-18
  • 2023-03-22
  • 2017-12-15
  • 2011-07-27
  • 2010-11-21
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多