【问题标题】:Why can I not access an instance of class that is created in a constructor ( Java )为什么我不能访问在构造函数 (Java) 中创建的类的实例
【发布时间】:2020-04-03 23:10:52
【问题描述】:

作为问题的序言,我对 Java 很陌生。

我有名为 Game、Player 和 SystemIO 的类。 我的 main() 在 Game 类中。下面是它的代码

public static void main(String[] args){
SystemIO systemIO = new SystemIO();
}

一旦 SystemIO 被调用,它的构造函数就会创建一个 Player 的实例,其中包含以下行

 Player player = new Player("Bob");


其中 Player 构造函数将 1 个参数作为字符串。

在 SystemIO 类的更下方,我有一个从“播放器”实例访问信息的方法。

player.getName();

当我尝试这样做时,控制台报告
SystemIO.java:339: error: cannot find symbol

我已经检查过我没有尝试使用大写的“Player”来引用类名。 就像我说的那样,我对 Java 非常陌生,只是想绕开它,我相信这是一个范围问题……但我不确定。

编辑以添加可重现的代码:

Game.java

package com.myapps;
import com.myapps.system.SystemIO;

public class Game{
    public static void main(String[] args){
        SystemIO systemIO = new SystemIO();
    }
}

Player.java

package com.myapps.player;

public class Player{
    String name;
    public Player(String playerName){
        name = playerName;
    }
}

public String getName(){
    return name;
}

SystemIO.java

package com.myapps.system;
import com.myapps.player.Player;

public class SystemIO{
    public SystemIO(){
        Player player = new Player("Bob");
        readPlayerName();
    }

    public void readPlayerName(){
        System.out.println(player.getName());
    }
}

【问题讨论】:

  • 几乎可以肯定是因为范围。不幸的是,您没有包含足够的代码来确定。将您的问题编辑为minimal, reproducible example。描述代码没有帮助。
  • 这绝对是一个范围错误。感谢您的帮助。
  • public readPlayerName(){ 应该是编译器错误。您缺少返回类型。我认为应该是public void readPlayerName(){ - 并且您也可以将变量传递给您的方法。所以 could 已经是public void readPlayerName(Player player),然后您可以将player 传递给该方法(除了在提供的答案中将其设为类字段)。
  • @ElliottFrisch 是的。我修好了它。在实际代码中,返回类型存在且有效。

标签: java constructor scope instance


【解决方案1】:

让 player 成为一个类变量。

让某人进入你的班级:

Player player;

并将构造函数的代码更改为:

player = new Player("Bob");

这称为范围错误。您希望类的所有方法都可以访问的变量应该在类中声明,而不是在一个特定方法中声明(在您的情况下,您是在构造函数中完成的)

【讨论】:

  • 当然。只见树木不见森林。这就说得通了。我会修改,看看是否可以。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多