【问题标题】:How to call method from another class?如何从另一个类调用方法?
【发布时间】:2019-06-22 03:37:35
【问题描述】:

所以我是 OOP 的新手,目前在使用其他方法的函数时遇到问题。下面的类是纸牌游戏的主要类。在这里,它通过从 Game 类创建一个对象来创建一副纸牌。然后它使用创建的牌组开始游戏,并打印牌组的大小。

public class Run {

public static void main(String[] args) {

    Game game;
    System.out.println("Welcome!");
    play = true;
    while (play) {
        game = new Game(3); //Create deck of card based on number of ranks given
        game.play(); //Starts the game with deck of card
    }

}

下面的类是游戏类。当游戏开始时,它应该打印创建的牌组的大小。

public class Game {
public Game(int ranks)
{
    Deck Main = new Deck(ranks);
}
public static void play()
{
    System.out.println(Main.size()); //Where the error occurs
}

下面的类是 Deck 类,它在其中实际创建了牌组,并有一个返回牌组大小的方法。

public class Deck {

private ArrayList<Card> cards;

public Deck(int range) {
    cards = new ArrayList<Card>();
    for (int i=1; i<=range; i++)
    {
        Card card = new Card(1, i);
        Card card2 = new Card(2, i);
        Card card3 = new Card(3, i);
        Card card4 = new Card(4, i);
        cards.add(card);
        cards.add(card2);
        cards.add(card3);
        cards.add(card4);
    }
}
public int size() 
{
    int num=cards.size();
    return num;
}

最后一个类是 Card 类。

public class Card {
private int rank;
private int suit;
public Card(int s, int r)
{
    suit=s;
    rank=r;
}
public int getSuit()
{
    return suit;
}
public int getRank()
{
    return rank;
}

由于我缺乏理解,这一定是一个明显的错误,所以任何人都可以说明如何解决它?

【问题讨论】:

  • 你提到了一个错误,但不要说错误是什么......虽然我们可以通过阅读你的代码来弄清楚,但你应该在你的问题中包含所有这些细节。
  • 不相关:Main 是一个变量,所以它应该以小写开头。当你不断调用 play 方法时,你真正的 main 方法将永远循环,但你永远不会改变控制封闭循环的局部变量。
  • @GhostCat 是的,因为游戏还没有完成,所以它应该永远运行。我可能应该编辑那部分然后发布它哈哈。
  • @Zephyr 我很抱歉,我会确保下次这样做。

标签: java oop


【解决方案1】:

您在 Deck 类的构造函数中将“Main”声明为局部变量。这意味着它仅在该构造函数的主体中可见。

您需要将局部变量转换为类的字段。只有这样它才能在您班级的其他地方“可见”!与您在 Card 类中为套件和排名正确执行的操作完全相同!

当然,播放方法应该不是静态的!一场比赛是关于一副套牌,而不是“全部”!

【讨论】:

  • 啊,我看傻了。感谢您的解释更有意义。
【解决方案2】:

在构造函数中声明的 Main 会影响其对其他类的可见性,您可以这样写:

Deck Main = null;
public Game(int ranks)
{
    Main = new Deck(ranks);
}

另外一点是,调用静态方法不需要创建对象,可以直接用类名调用,比如:

Game.play();

【讨论】:

  • 这里关于静态的好点,但是:该方法首先不应该是静态的。
【解决方案3】:

改变游戏类如下:

public class Game {
   private static Deck Main;
public Game(int ranks)
{
    Main = new Deck(ranks);
}
public  static void play()
{
    System.out.println(Main.size()); //Where the error occurs
}
}

如果你想用静态方法获取它,你必须把它设为静态。

另一种方法是:

public class Game {
    Deck Main;
public Game(int ranks)
{
    Main = new Deck(ranks);
}
public   void play()
{
    System.out.println(Main.size()); //Where the error occurs
}
}

无论哪种方式,您都可以使其无错误。 问题是:你想得到一个在构造函数中的变量, 因为它在构造函数中,它的局部变量。

N.B : 变量名应该以小写字母开头。使用 Pascal 大小写作为 JAVA 的命名约定。

【讨论】:

    【解决方案4】:

    请试试这个:

    public class Game {
    
    private Deck Main;
    
    public Game(int ranks)
    {
        Main = new Deck(ranks);
    }
    public static void play()
    {
        System.out.println(Main.size()); //Where the error occurs
    }
    

    【讨论】:

    • 嗨,欢迎来到 Stack Overflow。虽然总是欢迎回答,但最好解释一下您的代码什么以及如何它有助于解决问题。请花点时间阅读"How do I write a good answer?"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多