为此,我创建了两个java文件。卡片.java 具足 实例变量 和 杰克.java 将只是运行所有的 卡片 当被问及。
我的代码 卡片.java 是。
public class Card {
private int rank;
private int suit;
public Card(int rank, int suit) {
this.rank = rank;
this.suit = suit;
}
public static final String[] RANKS = {
null, "Ace", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "Jack", "Queen", "King"};
public static final String[] SUITS = {
"Clubs", "Diamonds", "Hearts", "Spades"};
public String toString() {
String s = RANKS[this.rank] + " of " + SUITS[this.suit]; // we are actually using the instances variables to access the array elements
return s;
}
public boolean equals(Card that) { // this that could be any variables
return this.rank == that.rank && this.suit == that.suit;
}
}
我的代码是: 杰克.java 是。
public class Jack {
public static void main(String[] args) {
Card small = new Card(0,1); // creates the small object
Card card = new Card(11,1); // cretes the card object
System.out.println(small); // prints the small class
System.out.println(card); // prints the card class
System.out.println(small.equals(card)); // compares small with cards
Card[] cards = new Card[52];
int index = 0; // to keep track
for (int suit = 0; suit <= 3; suit++) { // outer loop
for (int rank = 1; rank <= 13; rank++) { // inner loop
cards[index] = new Card(rank, suit);
index++;
}
}
public static void printDeck(Card[] cards) {
for (Card card : cards) {
System.out.println(card);
}
}
System.out.println(Arrays.toString(cards));
}
}
所有的代码都能用,但PrintArray不能用。我试图从书上寻求帮助,但我没有得到什么可能的错误。先谢谢你了。我也试过把void方法 printDeck 在Card.java文件中,但我又失败了。
有公共数组是个坏主意。事实上,你把一个 final
并不能解决这个问题;数组在这里无法实现你想要的东西。我建议你用列表来代替。试试吧 写这个。Card.RANKS[1] = "10"; // hahaha I'm cheating!
试试这个
public static final List<String> RANKS = List.of("", "Ace", "2", "3", ...);
或者更好的是,用java的方式来使用它。用类型和名称。
public enum Rank {
ACE, R2, R3, R4, R5, R6, R7, R8, R9, R10, JACK, QUEEN, KING;
}
public class Card {
private final Rank rank;
}
java的工作方式是,一个方法在运行时的名字比单纯的名字要复杂一些。其实就是名字。和 所有参数的所有类型,但不包含它们上的任何属姓。和 的返回类型。所以,equals的全称其实是 equals(java.lang.Object)boolean
. 你的等价法 不 覆盖,因为它的名字其实并不一样,它的名字是 equals(Card)boolean
. 不一样的。对于任何与equals方法交互的代码(如hashmap、hashset、list.contains等),它都不会工作。你应该让你的 equals 方法接受一个 Object
,并检查它是否为卡,如果不是,显然,它不等于。所以,加。if (!(that instanceof Card)) return false;
. 如果卡不是最终的,更好的检查是 if (that == null || that.getClass() != Card.class) return false;
因为有些复杂的原因。
这是一个伟大的想法,添加 @Override
到任何你认为应该覆盖的方法。这什么都不会做,除非你的方法实际上没有覆盖任何东西,在这种情况下,它会导致编译器告诉你这一点。嘿,伙计--你的假设不成立-- 然后拒绝编译你的代码,这样你就可以修正它了。
你的RANKS以null开头,但你却创建了 new Card(0,1);
这是[A]不可读的,[B]意味着你现在有一个空级。没有必要使用这个空值。另外,如果你使用枚举和类型,它可以变得更可读。new Card(Rank.ACE, Suit.DIAMONDS);
.
你把一个方法放在了一个方法中(该方法的 printDeck
方法是在 main
方法)。) Java目前并不支持这一点。移动该方法,使其成为一个兄弟姐妹。
您的代码将无法按原样编译。printDeck()方法目前在main()方法的定义中,需要移到外面。移动该方法后,就能按预期运行了。下面是修改后的Jack类。
public class Jack {
public static void main(String[] args) {
Card small = new Card(0,1); // creates the small object
Card card = new Card(11,1); // cretes the card object
System.out.println(small); // prints the small class
System.out.println(card); // prints the card class
System.out.println(small.equals(card)); // compares small with cards
Card[] cards = new Card[52];
int index = 0; // to keep track
for (int suit = 0; suit <= 3; suit++) { // outer loop
for (int rank = 1; rank <= 13; rank++) { // inner loop
cards[index] = new Card(rank, suit);
index++;
}
}
printDeck(cards);
}
public static void printDeck(Card[] cards) {
for (Card card : cards) {
System.out.println(card);
}
}
}
和结果的输出:
null of Diamonds
Jack of Diamonds
false
Ace of Clubs
2 of Clubs
3 of Clubs
4 of Clubs
5 of Clubs
6 of Clubs
7 of Clubs
8 of Clubs
9 of Clubs
10 of Clubs
Jack of Clubs
Queen of Clubs
King of Clubs
Ace of Diamonds
2 of Diamonds
3 of Diamonds
4 of Diamonds
5 of Diamonds
6 of Diamonds
7 of Diamonds
8 of Diamonds
9 of Diamonds
10 of Diamonds
Jack of Diamonds
Queen of Diamonds
King of Diamonds
Ace of Hearts
2 of Hearts
3 of Hearts
4 of Hearts
5 of Hearts
6 of Hearts
7 of Hearts
8 of Hearts
9 of Hearts
10 of Hearts
Jack of Hearts
Queen of Hearts
King of Hearts
Ace of Spades
2 of Spades
3 of Spades
4 of Spades
5 of Spades
6 of Spades
7 of Spades
8 of Spades
9 of Spades
10 of Spades
Jack of Spades
Queen of Spades
King of Spades