Java 如何调用ArrayList上的方法
我正在使用ArrayList构建一个小卡片组类。我遇到的问题是,当我试图调用Deck方法来填充列表时,我得到了一个找不到的符号。代码如下Java 如何调用ArrayList上的方法,java,class,methods,arraylist,Java,Class,Methods,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>();
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
包装卡;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Scanner;
甲板{
ArrayList al=新的ArrayList();
//试验方法
公共void main(字符串[]参数){
扫描仪输入=新扫描仪(System.in);
整数选择=9;
al.Deck();//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。
您可以调用Deck()将al作为参数传递(例如Deck(al)),或者您可以调用Deck(),因为al在同一个类中,所以不会有任何问题。
但是,在第二种情况下,al必须是Deck类的字段,否则Deck方法将找不到al symbol。名为Deck()的方法是类的构造函数。在主方法中,您创建了一个Deck实例,其内容如下:
Deck deck = new Deck();
在你的甲板课程的顶端,你有:
ArrayList<String> al = new ArrayList<String>();
ArrayList al=new ArrayList();
这意味着Deck的每个实例都有一个名为al的ArrayList成员,该成员最初是一个空的ArrayList,用于保存字符串
当使用构造函数实例化一个组时,构造函数中的代码将运行,ArrayList将填充“黑桃王牌”、“黑桃两个”
main方法是静态方法。这意味着您不能直接访问名为al的ArrayList。要访问它,您必须遍历Deck的实例。例如,如果您想查看Deck中的卡,则必须实例化Deck,然后以Deck.al的形式访问数组列表。通常,您不想直接访问成员字段你可能想创建像shuffle()和deal()这样的方法,每个方法都使用成员al作为其内部数据。我不知道如何将注释声明为答案,但“是的。Deck不是ArrayList的方法,而是Deck的方法(顺便说一句,类和方法的名称相同,非常容易出错。不要这样做)。为什么不直接调用Deck()?–njzk2 14分钟前“是一个完美的解决方案,非常感谢!非常快速的Java面向对象编程入门(初级建议)。创建代表真实世界的类。您通常会发现要创建的类将是四种原型之一:
与时间相关的“时刻间隔”(例如,事件或事件持续时间)
“角色”——聚会、场所或事物的参与方式
“描述”(通常是“目录条目类型描述”)出现的事物的集合
“一方[人]、一个地方或一件事”-它们可能扮演不同的角色(你[一方]可能是[角色]员工和客户)
然后为每个类构建处理对象的方法(例如,洗牌一副牌)
对于你的情况,你有原型4 a牌组。牌组似乎是由牌(另一个类别)组成的,你会想洗牌一副牌,然后从牌组中获得下一张牌。牌组会有一些属性、花色和价值
继续沿着此路径创建类。在“主”类中,您可能希望使用已创建类的对象执行操作。您可能希望问问自己类应该知道什么。(牌组应该始终是52张牌,4套AKQJ…2;或者你应该创建一个标准牌组扩展牌组并具有这些特征。其他牌组可能是出价惠斯特牌组(额外的小丑)、黑桃牌组、卡纳斯塔牌组、桑巴牌组等)是。牌组
不是数组列表
的方法,而是牌组
(顺便说一句,类和方法的相同名称非常容易出错。不要这样做)。为什么不直接调用Deck()
?Java的惯例是以小写字母开始方法和变量名以区分它们(您会注意到代码块中的不同突出显示),将构造函数命名为与类相同的名称是一个非常糟糕的主意。将public void main更改为public static void main,因为如果从该类运行代码,将得到NoSuchMethodError:main。+1在java方法中,名称以小写字母开头convention@nachokk您可以使用以大写字母开头的方法好吧,因为它可以很好地编译。但是它超出了社区标准。一个名为相同的方法就是类是构造函数。你不能像普通方法那样调用构造函数。你可以使用new调用构造函数,比如:“Deck Deck=new Deck();”