【问题标题】:How to get a value from a constructor into a method?如何从构造函数中获取值到方法中?
【发布时间】:2015-04-20 17:59:54
【问题描述】:

当然,这可能是我错误查看的相当简单的事情,但我必须确定。

我正在努力让一个经典的 PlayingCard 类与 PlayingCard Tester 一起运行,以将其作为一项作业进行测试。现在,当整个事情完成后,我将有一个 Pack 类以及用于生成一包纸牌并将其洗牌,以及 PlayingCard 类中的 equals 方法,但现在,我只想获得基本的 PlayingCard 类与测试人员合作。

这是 PlayingCard 类的当前设置,忽略 i 的 int 语句,因为它是用于借助 for 循环的随机数生成器,但已经或者更确切地说,应该使用PlayingCard 构造函数。

public class PlayingCard 
{
   public PlayingCard(int rank, int suit)
   {
       this.rank = rank;
       this.suit = suit;
   }


   // Values for rank
   public final int TWO = 2;
   public final int THREE = 3;
   public final int FOUR = 4;
   public final int FIVE = 5;
   public final int SIX = 6;
   public final int SEVEN = 7;
   public final int EIGHT = 8;
   public final int NINE = 9;
   public final int TEN = 10;
   public final int JACK = 11;
   public final int QUEEN = 12;
   public final int KING = 13;
   public final int ACE = 14;

   // Values for suits
   public final int CLUBS = 0;
   public final int DIAMONDS = 1;
   public final int HEARTS = -1;
   public final int SPADES = -2;

   // Set random Rank and Suit values
   public int rank;
   public int suit;
   public int i;

   public int getRank()
   {   
      return rank;
   }

   public int getSuit()
   {
      return suit;
   }

   @Override
   public String toString()
   {
      return getClass().getName() + "[rank " + rank + "suit " + suit + "]"; 
   }

   public void format()
   {
      System.out.format(rank + " of " + suit);
   }
}

这是当前的测试员,请注意,我使用了一组基于班级中等级和套装值的值。

public class PlayingCardTester 
{
    public static void main(String[] args) 
    {
       PlayingCard test;
       test = new PlayingCard(14, 1);
       test.getRank();
       test.getSuit();
       test.toString();
       test.format();
       System.out.println("");
    }

}

放入构造函数的值应该在类的方法中使用。我想要的实际测试人员和班级的输出是这样的:

Ace of Diamonds

相反,我得到了这个:

0 of 0

我要问的是,如何在测试器和类中实现的方法中使用构造函数中给出的值,以便获得我想要的输出?使用的值意味着与类中指定的值相关,但有些东西告诉我它们实际上是无用的,或者没有在实际类中使用。这可能是我错过但无法找到的相当简单的东西,或者我自己对此非常愚蠢,但我想确定以防万一需要更复杂的东西。

建议?

编辑:向构造函数添加了详细信息,现在我有了输出:

14 of 1

【问题讨论】:

    标签: java oop methods constructor


    【解决方案1】:

    您实际上有两个不同的问题。如另一个答案所述,第一个问题是,您没有将传递给类的构造函数的变量分配给相应的实例变量。

    您遇到的第二个问题是您正在设置 int 值来表示 Rank 和 Suit,但没有在 PlayingCard 类中提供相应的 String 表示。

    您可以通过创建如下数组来进行排名:

    String ranks [] = {"TWO","THREE"...};
    

    并在 format() 中使用ranks[rank -2]

    由于整数表示具有非连续值,您需要使用其他数据结构(例如 Map)。

    然而,一个更简单的方法是创建两个枚举,如下所示。然后,您将创建一张新卡,例如:

    PlayingCard card = new PlayingCard(Rank.ACE, Suit.SPADES);
    

    适合的枚举:

    public enum Suit {
    
        HEARTS(0), SPADES(-2), CLUBS(-1), DIAMONDS(1);
    
        private int value;
    
        private Suit(int value){
            this.value = value;
        }
    
        public int getValue(){
            return value;
        }
    }
    

    排名的枚举:

    public enum RANK {
    
        TWO(2), THREE(3), ACE(14);
    
        private int value;
    
        private Suit(int value){
            this.value = value;
        }
    
        public int getValue(){
            return value;
        }
    }
    

    扑克牌:

    public class PlayingCard 
    {
        private Rank rank;
        private Suit suit;
    
        public PlayingCard(Rank rank, Suit suit)
        {
            this.rank = rank;
            this.suit = suit;
        }
    
        public Rank getRank()
        {   
            return rank;
        }
    
        public Suit getSuit()
        {
            return suit;
        }
    
        @Override
        public String toString()
        {
            return getClass().getName() + "[rank " + rank + "suit " + suit + "]"; 
        }
    
        public void format()
        {
            System.out.format(rank + " of " + suit);
        }
    }
    

    【讨论】:

    • 我不熟悉枚举,有没有像样的链接或解释?
    • 我也刚刚注意到,我猜这些枚举应该在单独的文件中?
    【解决方案2】:

    您需要将参数从构造函数设置到您的实例。

    public PlayingCard(int rank, int suit)
           {
              this.rank = rank;
              this.suit = suit;
           }
    

    因为这个构造函数有两个参数,但没有对它们做任何事情。

    public PlayingCard(int rank, int suit)
           {
    
           }
    

    因为 int 自然设置为 0,所以你得到两个 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多