【问题标题】:Can't use method from another class?不能使用其他类的方法?
【发布时间】:2017-04-15 13:57:06
【问题描述】:

我知道还有其他标题相似的主题,但我已经完成了这些主题中建议的所有内容。

我正在尝试制作一款名为 Fossil Fuels 的恐龙赛车游戏,目前我正在创建通用游戏,其中包含需要避开的障碍物从顶部飘落。

我确实知道 Python,并且最近才开始学习 Java,所以这个问题可能听起来很愚蠢,但这里是。

import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

import java.lang.System;
import java.util.ArrayList;
import java.lang.Math;
public class MainLoop
{
    public static void main(String [] args)
    {
        boolean mloop = true;
        int obsMoveIncrease = 1;
        ArrayList obsList = new ArrayList();
        final String[] validObsTypes = {"tree", "rock", "bush"};
        long moveFrequency = 750;
        long beginningTime = System.currentTimeMillis();
        long obsInterval = 3000; //how often a new object is created in milliseconds
        long timeOfLastMove = System.currentTimeMillis();
        JFrame frame = new JFrame();
        ImageIcon background = new ImageIcon("background.jpg"); //background is 700 by 1500 px
        JLabel bgLabel = new JLabel(background);
        frame.add(bgLabel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        while (mloop)
        {
            int freshObsTypeNum = (int) Math.random() * 3;
            String freshObsType = validObsTypes[freshObsTypeNum]; //chooses a pseudo-random valid obstacle type
            if (System.currentTimeMillis() >= beginningTime + obsInterval) 
            { //checks if sufficient time has passed since last obstacle was created
                Obstacle obs = new Obstacle(freshObsType, 0);
                obsList.add(0, obs);
                beginningTime = System.currentTimeMillis(); //resets "clock"
            }


            if (System.currentTimeMillis() >= timeOfLastMove + moveFrequency) //checks if it is time to move obstacles
            {
                timeOfLastMove = System.currentTimeMillis();
                for (int i = 0; i < obsList.size(); i++)
                {
                    obsList.get(i).moveObs(obsMoveIncrease); //moves obstacles ERROR OCCURS ON moveObs
                    if (obsList.get(i).getObsY() > 1500)
                    {
                        obsList.remove(i);
                    }

                }
            }
        }
    }
}

这是我的障碍类:

import java.util.Arrays;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class Obstacle
{
    private String obstacleType;
    private int obstacleXPos;
    public final int[] obsXlist = {0, 175, 350, 525}; //list of starting positions (4 slots along the x axis)
    int obstacleYPos = 0;
    public Obstacle(String type, int startPos)
    {
        obstacleType = type;
        obstacleXPos = obsXlist[startPos];
    }

    public int getObsX()
    {return obstacleXPos;}

    public int getObsY()
    {return obstacleYPos;}

    public void moveObs(int increase)
    {obstacleYPos += increase;}

    ImageIcon obstacleImg;
    public JLabel getObsImg() //gets image (on a label) for keyword given to constructor
    {
        if (obstacleType.equals("tree"))
            obstacleImg = new ImageIcon("treeObs.jpg");
        else if (obstacleType.equals("rock"))
            obstacleImg = new ImageIcon("rockObs.jpg");
        else if (obstacleType.equals("bush"))
            obstacleImg = new ImageIcon("bushObs.jpg");
        else
            System.out.println(obstacleType + " is not a valid obstacle type");

        JLabel obsLabel = new JLabel(obstacleImg);
        return obsLabel;
    }
}

当我从 main 方法中调用 moveObs(int) 时,它告诉我找不到符号。我不知道为什么我无法访问 Obstacle 类中的公共方法

【问题讨论】:

  • 尝试执行ArrayList&lt;Obstacle&gt; obsList 之类的操作,以便列表知道里面有哪些东西,从而知道这些对象存在哪些方法。
  • 只需更改您的 ArrayList 定义以使用 ArrayList obsList = new ArrayList(); 等泛型
  • 我刚试过,它解决了问题,但为什么它会起作用?它不应该已经知道列表中的项目类型吗
  • 不相关,但我想建议您始终为 if/else 块使用大括号,并为它们保持一致的样式。查看softwareengineering.stackexchange.com/a/2970 了解有关该主题的更多信息。
  • 你应该使用 List obsList = new ArrayList();。如果可以,请始终使用该界面。 Java 并不总是有泛型,所以有些遗留类接受了不知道障碍方法的普通对象。那时你会得到对象然后投射到障碍物。

标签: java bluej


【解决方案1】:

obsList 没有类型。 您正在尝试在“对象”上调用 moveObs(),而不是在“障碍物”上。

要改变这一点,您需要使 obsList 成为这样的类型列表:

ArrayList<Obstacle> obsList = new ArrayList<>();

【讨论】:

  • 谢谢,我的印象是它会知道它是什么类型的对象,因为我使用了障碍物的方法,但我想我必须在创建数组列表时指定。
  • 是的,您向 obsList 添加了一个障碍物并且它起作用了,因为障碍物也是一个对象(就像 Java 中隐含的所有内容一样)。虽然您可以添加许多其他对象并将它们放在一起,但您只能调用所有这些对象共有的方法,这些方法是 Object 类型的方法,正如您在创建 obsList 时定义的('new ArrayList()' 是隐式'new ArrayList()')。所以你总是指定类型。
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
相关资源
最近更新 更多