![](/img/trans.png)
[英]enhanced for loop does not invoke the overriden methods of arraylist. Classcast exception
[英]How to invoke methods on an ArrayList
我正在使用ArrayList构建一副纸牌类。 我遇到的问题是,当我尝试调用Deck方法填充列表时,遇到了“找不到符号”。 下面的代码。
package deckofcards;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Deck{
ArrayList<String> al = new ArrayList<String>();
//test method
public void main(String[] args){
Scanner input = new Scanner(System.in);
int choice = 9;
al.Deck(); //<--Right here is the problem, it gives Cannot Find Symbol
//Symbol: method Deck() Location: variable al of type
//ArrayList<String>
while(choice != 0){
System.out.println("Shuffle - 1 Display - 2 Exit - 0:");
//didn't finish since it gave an error
}
}
private void Shuffle(){
Collections.shuffle(al);
}
private void Deck(){
al.add(0, "Ace of Spades");
al.add(1, "Two of Spades");
al.add(2, "Three of Spades");
//yadaa yadaa yadaa
我根本无法弄清楚如何正确调用列表中的方法。 有人知道我在做什么错吗?
注意:这是辅助类文件,软件包的主类文件将仅包含主要测试方法。
al
是ArrayList
的实例,而ArrayList
类没有Deck
方法。 您应该做的是声明并初始化一个Deck
类型的变量,该变量具有Deck
方法:
//al.Deck();
Deck deck = new Deck();
deck.Deck(); //technically, this will do
但是似乎您想初始化Deck
类构造函数中的al
变量中的元素,您目前还没有。 构造函数是一种与类相同的名称,并且没有任何返回类型的方法 。 所以这个方法:
public void Deck() {
...
}
不是构造函数。 只需删除void
关键字,它将成为一个构造函数:
public Deck() {
...
}
因此,在声明了一个真正的构造函数之后,就不再有Deck
方法了,您的代码将只有:
//al.Deck();
Deck deck = new Deck();
//deck.Deck(); //no need for this line anymore
al没有Deck方法,因为它是ArrayList。 您可以通过传递al作为参数来调用Deck()(例如Deck(al)),否则您可以调用Deck(),并且由于al在同一类中,因此您不会有任何问题。 但是,在第二种情况下,al必须是Deck类的字段,否则deck方法将找不到al符号。
名为Deck()的方法是您的类的构造函数。 在您的主要方法中,您将创建一个Deck实例,其内容如下:
Deck deck = new Deck();
在Deck班级的顶部,您有:
ArrayList<String> al = new ArrayList<String>();
这意味着Deck的每个实例将具有一个名为al的ArrayList成员,该成员最初是一个空的ArrayList,用于容纳字符串。
通过使用构造函数实例化Deck时,构造函数中的代码运行,并且ArrayList中填充了“黑桃A”,“黑桃A”。
主要方法是静态方法。 这意味着您不能直接访问名为al的ArrayList。 要访问它,您必须浏览Deck的一个实例。 例如,如果您想查看卡片组中的卡片,则必须实例化Deck,然后以deck.al的身份访问阵列列表。 通常,您不想直接从main访问成员字段。 您可能想要创建诸如shuffle()和deal()之类的方法,每个方法均使用成员al作为其内部数据。
我不知道如何将评论声明为答案,但是“是的。Deck不是ArrayList的方法,它是Deck的方法(顺便说一句,类和方法的名称相同,非常容易出错。你为什么不只打电话给Deck()?– 14分钟前njzk2”是完美的解决方法,非常感谢!
Java面向对象编程的快速入门(初学者级建议)。 创建代表现实世界事物的类。 您经常会发现要创建的类将是四种原型之一:
然后,对于每个类,构建对对象执行某些操作的方法(例如,洗牌)。
对于您的情况,您有原型4 A Deck。 看起来,牌组是由卡片组成的(另一类),您可能希望洗牌并从牌组中取出下一张牌。 卡具有一些属性,适合性和价值。
沿着这条路径继续创建您的课程。 在您的“主”类中,您想对已创建的类的对象进行操作。 您将要问自己一个班级应该知道什么。 (应该将Deck始终是52张牌,4套AKQJ ... 2;或者应该创建一个标准Deck扩展Deck并具有这些特征。其他套牌可能是Bid Whist套牌(额外的笑话),黑桃牌, Canasta甲板,Samba甲板等)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.