Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中是否可以给父类中的子类赋值?_Java_Parent Child - Fatal编程技术网

在Java中是否可以给父类中的子类赋值?

在Java中是否可以给父类中的子类赋值?,java,parent-child,Java,Parent Child,我为此搜索了很多,但在任何地方都找不到,但是如果你认为以前有人问过,请将链接发送给我 我有一个名为chesspiece的父类,我有6个子类: 值为1的典当, 价值为2的骑士, 值为3的Bishop, 值为5的Rook, 价值9的女王 和价值1000的国王 我有两个实例变量:值和工件的颜色 我想知道有没有可能说,如果你的值为1,你属于典当类,或者如果你的值为2,你属于骑士类。 所以,现在我用一个方法来做这件事,但它只返回一个字符串,别的什么也没有。这是我的密码: public class Ches

我为此搜索了很多,但在任何地方都找不到,但是如果你认为以前有人问过,请将链接发送给我

我有一个名为chesspiece的父类,我有6个子类: 值为1的典当, 价值为2的骑士, 值为3的Bishop, 值为5的Rook, 价值9的女王 和价值1000的国王

我有两个实例变量:值和工件的颜色

我想知道有没有可能说,如果你的值为1,你属于典当类,或者如果你的值为2,你属于骑士类。 所以,现在我用一个方法来做这件事,但它只返回一个字符串,别的什么也没有。这是我的密码:

public class ChessPiece {
    private boolean     isWhite;
    private int         value;

    public ChessPiece (boolean isWhite, int value) {
        this.isWhite = isWhite;
        this.value = value;
    }
public String getNamebyValue() {
        switch (value) {
          case 1:
            return "Pawn";
          case 2:
            return "Knight";
          case 3:
            return "Bishop";
          case 5:
            return "Rook";
          case 9:
            return "Queen";
          case 1000:
            return "King";
        }
        return null;
    } 
这是我的儿童课:

public class Bishop extends ChessPiece {

    public Bishop(boolean isWhite) {
        super(isWhite, 3);

    }
建议:

ChessPiece.java

public class ChessPiece {
    private boolean     isWhite;
    private int         value;
    private String      name;

    public ChessPiece (boolean isWhite) {
        this.isWhite = isWhite;
    }

    public String getName() { return name; }

}
public class Bishop extends ChessPiece {

    public Bishop(boolean isWhite) {
        super(isWhite);
        this.name = "Bishop";
        this.value = 3;
    }
    ...
}
Bishop.java

public class ChessPiece {
    private boolean     isWhite;
    private int         value;
    private String      name;

    public ChessPiece (boolean isWhite) {
        this.isWhite = isWhite;
    }

    public String getName() { return name; }

}
public class Bishop extends ChessPiece {

    public Bishop(boolean isWhite) {
        super(isWhite);
        this.name = "Bishop";
        this.value = 3;
    }
    ...
}
换句话说,让“类继承”为您做尽可能多的工作

回答您的问题:可以在父类和子类之间共享一个变量(如上所示)

也可以覆盖子对象中的成员变量。看这里:


这完全取决于您的设计—取决于您的需求,以及您选择如何实现这些需求。

在这种情况下,请更改
getNamebyValue()
,如下所示:

public ChessPiece getNamebyValue() {
    switch (value) {
      case 1:
        return new Pawn();
      case 2:
        return new Knight();
      case 3:
        return new Bishop();
      case 5:
        return new Rook()";
      case 9:
        return new Queen();
      case 1000:
        return new King();
    }
    return null;
  }

并创建子类,如您为Bishop所示。您可以这样做,但不是按照您的编码方式

我建议让该方法返回一种棋子类型而不是字符串,然后通过调用该方法和一个数字来实例化该类型

  public class ChessPiece {
private boolean     isWhite;
private int         value;

public ChessPiece (boolean isWhite, int value) {
    this.isWhite = isWhite;
    this.value = value;
}
public ChessPiece getNamebyValue(int value) {
    switch (value) {
      case 1:
        return new Pawn();
        break;
      case 2:
        return new Knight();
      break;
       case 3:
        return new Bishop();
        break;
      case 5:
        return new Rook();
       break;
      case 9:
        return new Queen();
       break;
      case 1000:
        return new King();
      break;
      default:
      return new ChessPiece();
      break;
    }
    return null;
} 
然后

       ChessPiece cp= new getNameByValue(1000);
这将返回一个King类型的对象


此外,如果您的开关中没有break语句,它只会在遍历每个语句时返回最后一个值,直到出现break为止

你不应该为每种棋子类型下国际象棋,它们之间没有足够的区别。改用
enum

public class ChessPiece {
    private boolean isWhite;
    private ChessPieceType pieceType;

    enum ChessPieceType {
        Pawn(1),
        Knight(2),
        Bishop(3),
        //...
        King(1000);

        private int value;

        private ChessPieceType(int value) { 
            this.value = value; 
        }

        public int getValue() {
            return this.value;
        }
   }

    public ChessPiece (ChessPieceType type, boolean isWhite) {
        this.pieceType = type;
        this.isWhite = isWhite;
    }

    public ChessPieceType getPieceType() {
        return this.pieceType;
    }
}
使用


如果我理解正确,您可能希望查看工厂设计模式您将发送一个函数“recipe”来创建您的对象(在您的情况下是值),并返回一个适当的对象

它只返回一个字符串您还希望得到什么?确切的问题是什么?你想返回一个
实例吗?这意味着如果它是1,那么返回类型应该是类Pawn的对象?那么,在构造函数中可以这样做吗?mohd shoaib我想知道是否可以说,如果你的值为1,你属于Pawn类,或者如果你的值为2,你属于knight classIt听起来你想要的是一个
enum
。如果这没有任何break语句,它不是每次都返回一个King吗?一个包含所有case语句的return语句将保护这一点。如果没有匹配项,则只返回null。如果找到匹配项,则应立即出现
break
语句。是否使用Java
break
不是一种方法(
break()
)你是对的。我编辑了它。我不知道我是怎么忘记的。PS:我不确定“value”成员有多大价值(如果一个棋子有一个“type”,比如“Bishop”,那么“value=3”有什么意义?)。但我喜欢盖伊的建议。如果您需要“value”,那么“enum”比“int”更好(更合适)。