当前位置: 首页 > 知识库问答 >
问题:

为什么使用ArrayList但返回基元类型的方法要求方法名包含“static”?[副本]

马德厚
2023-03-14

这个程序可以工作,但我不确定为什么使用arraylist的方法必须在方法头中包含static。只是作为背景,程序接受一个文本文件,读取它并将其内容保存到arraylist (games)中。用户输入文件名和球队名,程序输出特定球队打了多少场比赛,赢了多少场比赛,输了多少场比赛。

它读取的.csv具有以下格式:

ENCE,Vitality,9,16
ENCE,Vitality,16,12
etc..

下面的所有四个方法(一个返回arraylist,另三个返回ints),除非我在方法头中输入关键字statice。如果我只为方法编写public arraylist public int,它们将无法工作。

arraylist被传递到方法中时,是否意味着方法头必须始终包含static?为什么会这样呢?

工作代码如下:

import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Scanner;

public class SportStatistics {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
    
        System.out.println("File: ");
        String file = scan.nextLine();
    
        ArrayList<Game> record = getGame(file); //After method returns the list of 
        objects, it is copied over to another list.

        System.out.println("Team: ");
        String team = scan.nextLine(); 
    
        //These methods return how many games a team played, has won and has lost.
        int gamesPlayed = getGamesPlayed(record, team);
        int gamesWon = getGamesWon(record, team);
        int gamesLost = getGamesLost(record, team);
    
        System.out.println("Games: " + gamesPlayed);
        System.out.println("Wins: " + gamesWon);
        System.out.println("Losses: " + gamesLost);

    }

    //This method takes in the file name given by user and saves file details into 
    a list of objects.
    **public static** ArrayList<Game> getGame(String file){
        ArrayList<Game> games = new ArrayList<>();
    
        try(Scanner reader = new Scanner(Paths.get(file))){
            while(reader.hasNextLine()){
                String input = reader.nextLine();
                String[] parts = input.split(",");
                String homeTeam = parts[0];
                String visitingTeam = parts[1];
                int homePoints = Integer.valueOf(parts[2]);
                int visitingPoints = Integer.valueOf(parts[3]);
            
                games.add(new Game(homeTeam, visitingTeam, homePoints, 
                visitingPoints));
            }
        }
        catch(Exception e){
            System.out.println("Error: File " + file + " not found.");
        }
    
        return games;
    }

    **public static int** getGamesPlayed(ArrayList<Game> record, String team){
        int gamesPlayed = 0;
        for(Game game: record){
            if (game.getHomeTeam().equals(team) || 
            game.getVisitngTeam().equals(team)){
                gamesPlayed++;
            }
        }
    
        return gamesPlayed;
    }

    **public static int** getGamesWon(ArrayList<Game> record, String team){
        int gamesWon = 0;
        for(Game game: record){
            if (game.getHomeTeam().equals(team) || 
            game.getVisitngTeam().equals(team)){
                if(game.getHomeTeam().equals(team) && game.getHomePoints() > 
                game.getVisitingPoints()){
                    gamesWon++;
                }
                if(game.getVisitngTeam().equals(team) && game.getVisitingPoints() > 
                game.getHomePoints()){
                    gamesWon++;
                }
            }
        }
    
        return gamesWon;
    }

    **public static int** getGamesLost(ArrayList<Game> record, String team){
        int gamesLost = 0;
        for(Game game: record){
            if (game.getHomeTeam().equals(team) || 
            game.getVisitngTeam().equals(team)){
                if(game.getHomeTeam().equals(team) && game.getHomePoints() < 
                game.getVisitingPoints()){
                    gamesLost++;
                }
                if(game.getVisitngTeam().equals(team) && game.getVisitingPoints() < 
                game.getHomePoints()){
                    gamesLost++;
                }
            }
        }
    
        return gamesLost;
    }


}

共有2个答案

欧阳洲
2023-03-14

静态只是意味着它不是您从类创建的对象的一部分。它独立于您创建的对象/实例。您可以说它只是与类相关/是类的一部分,而不是一个特性。

杜经艺
2023-03-14

错误与参数列表或返回类型无关。您正在静态上下文中使用这些方法(即,您没有在特定实例上调用它们),因此它们必须是static

 类似资料:
  • 现在我学习Java已经有一段时间了,但有一个概念我很难理解。我习惯了这样的方法 我知道上面的方法会返回一个整数或字符串,无论你想要什么数据类型 现在我在问自己,上述方法的回报类型到底是什么。我如何使用返回的东西做其他事情? 我还看到人们将对象作为这样的参数传递给方法 这又是怎么回事?在什么情况下,上述“风格”是必要的,需要避免什么陷阱? 使用对象而不是整数之类的值让我感到困惑。

  • 我在从事Java项目时遇到了一件非常奇怪的事情。 我在界面中有这个基本方法: 显然,类型参数完全没用,因为它既不用于返回类型也不用于参数。我的IDE也通知了我这一点。 我还有一个扩展注册表的接口: 对于上下文,扩展, 与注册表中的findType(String)冲突;这两种方法具有相同的擦除,但都不重写另一种方法。 我现在的问题是: > 当重写方法想要指定返回值泛型类型时,为什么Java在base

  • 我有一个方法,它检查一个对象是否已经存在于数组列表中,如果存在,则用新对象替换索引,如果不存在,则添加新对象。 当我编写方法时,我没有返回类型。我收到一个错误,建议我将返回类型设置为void,所以我就这样做了。然后我得到了另一个错误,返回类型必须是布尔的。我唯一的问题是方法本身本质上(至少对我来说)不是true/false返回。我需要它做的只是在ArrayList中添加/替换一个对象,而不是返回任

  • 我看过返回IList vs ICollection vs Collection以及它链接的其他问题,但我仍然对这个问题感到困惑。 出于演示目的,我们假设我有一个类,在其中公开了一个公共方法,如下所示: 要遵循CA1002,我的方法应该返回实际的集合类(、等)或它们的接口(、等),如果我希望返回具体?

  • 我注意到,在使用扫描仪时,如果我想设置定界符或区域设置等属性,那么这样做的方法会返回扫描仪对象本身: 我不明白的是,如果属性被更改(而不是创建新对象),为什么它返回一个扫描器对象而不是void?这并不是说我必须将返回值存储在一个变量中——事实上,如果我尝试这样做,就像下面的代码中那样,Eclipse将发出消息:“lineScanner”在此位置未关闭:

  • 下面对getHighest()和getLowest()的调用返回Comparable类型的对象,而不是T类型的对象,这正是我们想要的。为什么,我该如何改进这段代码,使这些调用返回T(这样T的字段和方法就可用了)? 下一行生成编译器错误: 错误:找不到符号符号:方法getName()位置:接口java.lang.Comparable 我想employee.getHighest()返回一个员工(而不仅