【问题标题】:How to invoke methods on an ArrayList如何在 ArrayList 上调用方法
【发布时间】:2014-04-22 20:36:29
【问题描述】:

我正在使用 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

我根本不知道如何正确调用列表中的方法。有谁知道我做错了什么?

注意:这是一个辅助类文件,包的主类文件将只包含主要的测试方法。

【问题讨论】:

  • 是的。 Deck 不是ArrayList 的方法,它是Deck 的方法(顺便说一句,类和方法的同名非常容易出错。不要这样做)。你为什么不直接打电话给Deck()
  • Java 约定以小写开头的方法和变量名称来区分它们(您会注意到代码块中不同的突出显示),这是一个非常的坏主意命名除构造函数外的任何名称,与类同名。
  • 将 public void main 更改为 public static void main,因为如果你从这个类运行你的代码,你会得到 NoSuchMethodError: main。

标签: java class methods arraylist


【解决方案1】:

alArrayList 的一个实例,而ArrayList 类没有Deck 方法。你应该做的是声明和初始化一个Deck类型的变量,它有一个Deck方法:

//al.Deck();
Deck deck = new Deck();
deck.Deck(); //technically, this will do

但您似乎想在Deckclass 构造函数中初始化al 变量中的元素,而您目前没有。构造函数是与类同名且没有任何返回类型的方法。所以这个方法:

public void Deck() {
    ...
}

不是构造函数。去掉void关键字就可以变成构造函数了:

public Deck() {
    ...
}

所以,在你声明了一个真正的构造函数之后,就没有 Deck 方法了,你的代码只会是:

//al.Deck();
Deck deck = new Deck();
//deck.Deck(); //no need for this line anymore

【讨论】:

  • +1 并且在 java 中的方法名称按约定以小写开头
  • @nachokk 您也可以使用以大写字母开头的方法,因为它可以正常编译。但它超出了社区标准。
【解决方案2】:

al 没有 Deck 方法,因为它是一个 ArrayList。 您可以调用 Deck() 传递 al 作为参数(例如 Deck(al)),或者您可以调用 Deck() 并且由于 al 在同一个类中,所以您不会有任何问题。 但是在第二种情况下 al 必须是 Deck 类的一个字段,否则 deck 方法将找不到 al 符号。

【讨论】:

    【解决方案3】:

    名为 Deck() 的方法是您的类的构造函数。在您的 main 方法中,您创建了一个 Deck 实例,其内容如下:

    Deck deck = new Deck();
    

    在您的 Deck 课程中,您拥有:

    ArrayList<String> al = new ArrayList<String>();
    

    这意味着 Deck 的每个实例都有一个名为 al 的 ArrayList 成员,它最初是一个空的 ArrayList,用于保存字符串。

    当使用构造函数实例化 Deck 时,构造函数中的代码会运行并且 ArrayList 会填充“黑桃 A”、“黑桃二”......

    主要方法是静态方法。这意味着您不能直接访问名为 al 的 ArrayList。要访问它,您必须通过 Deck 的一个实例。例如,如果您想查看卡片组中的卡片,则必须实例化卡片组,然后以卡片组.al 的形式访问数组列表。通常,您不想直接从 main 访问成员字段。您可能希望创建像 shuffle() 和 deal() 这样的方法,每个方法都使用成员 al 作为其内部数据。

    【讨论】:

      【解决方案4】:

      我不知道如何将评论声明为答案,但是“是的。Deck 不是 ArrayList 的方法,它是 Deck 的方法(顺便说一句,类和方法的同名非常容易出错。不要这样做)。你为什么不直接调用 Deck()?——njzk2 14 分钟前“是完美的解决方法,非常感谢!

      【讨论】:

      • 同名方法是类是构造函数。您不能像普通方法一样调用构造函数。您可以使用 new 调用构造函数,例如:“Deck deck = new Deck();”
      【解决方案5】:

      Java 面向对象编程的快速入门(初级建议)。创建代表现实世界事物的类。您经常会发现您要创建的类将是四种原型之一:

      1. “时刻间隔”时间相关(例如,对于事件或事件持续时间)
      2. “角色” - 派对、地点或事物如何参与
      3. “描述”(通常是“目录条目类型的描述”)出现的事物的集合
      4. “一方 [人]、地点或事物” - 这些可能扮演不同的角色(您 [一方] 可能是 [角色] 员工和客户

      然后为每个类构建对对象执行某些操作的方法(例如洗牌)。

      就你的情况而言,你有套牌 4 的原型。看起来甲板是由卡片(另一个类别)组成的,并且您想要洗牌并从甲板中获得下一张卡片。一张卡片会有一些属性、花色和价值。

      继续沿着这条路径创建您的课程。在您的“主”类中,您可能希望对您创建的类的对象进行处理。你会想问自己一个班级应该知道什么。 (套牌应该总是 52 张,4 套 AKQJ...2;或者你应该创建一个扩展套牌并具有这些特征的标准套牌。其他套牌可能是 Bid Whist 套牌(额外的小丑)、黑桃套牌、 Canasta 甲板、桑巴甲板等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-18
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        相关资源
        最近更新 更多