Java中在Player对象内创建Piece对象报错:pawnA无法解析或不是字段
问题分析与解决
错误原因
你在Player类的piecegen()方法里定义的pawnA是局部变量,它的作用域仅限于该方法内部。方法执行完毕后,这个变量就会被销毁,所以在Main类中尝试通过p1.pawnA访问时,Java会认为Player类根本没有这个字段,从而抛出错误。
解决方案
方案1:声明为Player类的成员变量
如果只需要单个pawnA,直接把它定义为Player类的属性,然后在piecegen方法中初始化:
import java.util.Scanner; class Player { public int id, piecesleft, l1, l2; public String name; // 把pawnA声明为类的成员变量 public Piece pawnA; public Player(int idin, int plin, String namein) { id = idin; piecesleft = plin; name = namein; if (id == 1) { l1 = 7; l2 = 6; } else { l1 = 0; l2 = 1; } } public void piecegen() { // 直接给成员变量赋值,不要重新定义局部变量 pawnA = new Piece('p', true, l2, 0); } }; class Piece { public char type; public boolean status; public int pos1, pos2; public Piece(char typein, boolean statusin, int pos1in, int pos2in) { type = typein; status = statusin; pos1 = pos1in; pos2 = pos2in; } }; public class Main { public static void main (String[] args) { Scanner scan = new Scanner(System.in); System.out.print("\n玩家1 - 姓名: "); String name1 = scan.nextLine(); Player p1 = new Player(1, 16, name1); System.out.print("玩家2 - 姓名: "); String name2 = scan.nextLine(); Player p2 = new Player(2, 16, name2); p1.piecegen(); p2.piecegen(); System.out.println(p1.pawnA.type); // 现在可以正常访问了 scan.close(); } };
方案2:用集合管理多个棋子(更适合象棋场景)
象棋每个玩家有多个棋子,单个变量显然不够,建议用List<Piece>来存储所有棋子,扩展性更好:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; class Player { public int id, piecesleft, l1, l2; public String name; // 用List存储所有棋子 public List<Piece> pieces = new ArrayList<>(); public Player(int idin, int plin, String namein) { id = idin; piecesleft = plin; name = namein; if (id == 1) { l1 = 7; l2 = 6; } else { l1 = 0; l2 = 1; } } public void piecegen() { // 添加多个棋子,比如兵A、兵B等 pieces.add(new Piece('p', true, l2, 0)); // 兵A pieces.add(new Piece('p', true, l2, 1)); // 兵B // 可以继续添加其他棋子(车、马、象等) } }; class Piece { public char type; public boolean status; public int pos1, pos2; public Piece(char typein, boolean statusin, int pos1in, int pos2in) { type = typein; status = statusin; pos1 = pos1in; pos2 = pos2in; } }; public class Main { public static void main (String[] args) { Scanner scan = new Scanner(System.in); System.out.print("\n玩家1 - 姓名: "); String name1 = scan.nextLine(); Player p1 = new Player(1, 16, name1); System.out.print("玩家2 - 姓名: "); String name2 = scan.nextLine(); Player p2 = new Player(2, 16, name2); p1.piecegen(); p2.piecegen(); // 访问第一个棋子的type System.out.println(p1.pieces.get(0).type); scan.close(); } };
额外提示
- 尽量不要用
public修饰所有属性,实际开发中建议用private,然后提供getter/setter方法来访问和修改,这是面向对象的封装原则。 - 注意关闭
Scanner资源(比如上面代码里的scan.close()),避免资源泄漏。
内容的提问来源于stack exchange,提问作者Paradox
相关产品推荐
相关产品推荐

