【问题标题】:Java - field is not visibleJava - 字段不可见
【发布时间】:2011-10-09 12:18:02
【问题描述】:

作为我作业的一部分,我得到了一个已经准备好的 public static void main 方法。我的工作是通过创建与此相关的所有方法来补充这一点。这应该在其他三个班级中完成。

在已经准备好的main方法中,有如下代码:

ticket = new LotteryTicket(10);
ticket.ticketOwner = new Player();

LotteryTicketPlayer 是我创建的其他类。 LotteryTicket 类中的相关实例变量为:

private LotteryRow[] rows;
private Player ticketOwner;

public LotteryTicket(int maxNumberOfRows) {
    this.rows = new LotteryRow[maxNumberOfRows];
}

Player 如上所述,是我创建的另一个类。在这个类中,除其他外,还有一种方法供用户输入姓名、地址、邮政编码等数据。

当我尝试运行程序时,ticket.ticketOwner = new Player(); 行中出现错误。错误是:LotteryTicket.ticketOwner 字段不可见”

这可能是什么原因?我将不胜感激任何帮助!我希望我提供的代码就足够了。我以前没有遇到过这个错误信息,所以我不知道该怎么办。

【问题讨论】:

    标签: java field


    【解决方案1】:

    问题的核心是您尝试访问的字段 (ticketOwner) 标记为 private。此外,至少从我们所看到的来看,似乎缺少用于访问它的 getter/setter。

    虽然对此的快速修复是添加getter/setters 并使用它们访问字段,或者一种丑陋的方法是使字段public。但你会想继续阅读......

    您最好的选择(如果 LotteryTicket 需要 Player,看起来确实如此)是在 LotteryTicket 本身的构造函数中拥有 Player 实例,因此不会产生额外开销。

    public LotteryTicket(int maxNumberOfRows, Player player) {
            this.rows = new LotteryRow[maxNumberOfRows];
            this.ticketOwner = player;
    }
    

    编辑

    您的调用将如下所示:

    Player p = new Player();
    // invoke APIs on (Player p), if needed
    ticket = new LotteryTicket(10, p);
    

    【讨论】:

    • 显然,您应该在将Player 实例传递给LotteryTicket 之前对其执行所有调用。和/或让LotteryTicket 中的其他方法对ticketOwner 进行操作。
    【解决方案2】:

    ticketOwner 被声明为 private ,因此在您的执行类中不可见是正常的。

    在票证类中,您必须添加一个 setter 方法。

    public void setTicketOwner(Player p) {
    
    this.ticketOwner = p;
    
    }
    

    然后代替

    ticket.ticketOwner = new Player();
    

    ticket.setTicketOwner(new Player());
    

    【讨论】:

      【解决方案3】:

      它们已被声明为私有,将它们声明为公共,甚至更好地创建公共getters/setters 以进行封装。

      【讨论】:

      • 和/或让 LotteryTicket 的构造函数创建自己的 Player。
      • @BenvanGompel 最好注入它,而不是让构造函数创建它(看看 Saket 的回答,这是正确的做法)
      【解决方案4】:

      你将它声明为私有变量

      【讨论】:

      • 谢谢。这行得通,但我的家庭作业告诉我应该将其声明为私有。
      【解决方案5】:

      private 表示无法从其他类访问。​​

      通常有一个类似setTickerOwner 的方法可以从另一个类中设置这样的字段。

      【讨论】:

      • 谢谢。更改为“公共”有效,但在我的作业中,我应该将这些变量声明为私有。
      • 在这种情况下,您应该按照我的建议创建一个 setter。大多数 IDE 会自动为您执行此操作。
      • 谢谢。我将继续使用您的意见和其他人的意见。
      猜你喜欢
      • 2022-01-25
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多