Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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 如何调用ArrayList上的方法_Java_Class_Methods_Arraylist - Fatal编程技术网

Java 如何调用ArrayList上的方法

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>();

我正在使用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
包装卡;
导入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();”