Как вызвать метод из другого класса? - PullRequest
0 голосов
/ 29 января 2019

Итак, я новичок в ООП, и в настоящее время у меня возникают проблемы с использованием функции из другого метода.Класс ниже является основным классом для карточной игры.Здесь он создает колоду карт, создавая объект из класса 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
    }

}

Класс ниже - класс Game.Когда игра начинается, она должна напечатать размер созданной колоды.

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;
}

Это должно быть очевидной ошибкой из-за моего непонимания, поэтому кто-нибудь может показать, что нужно сделать, чтобы это исправить?

Ответы [ 4 ]

0 голосов
/ 29 января 2019

пожалуйста, попробуйте это:

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
}
0 голосов
/ 29 января 2019

Main объявлен в конструкторе, который влияет на его видимость для другого класса, вы можете написать его следующим образом:

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

другой pount: нет необходимости создавать объект для вызова статического метода, вы можете напрямую вызватьэто с именем класса, как:

Game.play();
0 голосов
/ 29 января 2019

Измените класс игры следующим образом:

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
}
}

В любом случае вы можете сделать это без ошибок.Проблема заключалась в следующем: вы хотите получить переменную, которая находится внутри конструктора, как и в конструкторе, его локальная переменная.

NB: имя переменной должно начинаться с lowerCase.Используйте регистр Pascal в качестве соглашения по именованию для JAVA.

0 голосов
/ 29 января 2019

Вы объявили "Main" как локальную переменную внутри конструктора класса Deck.Это означает, что он виден только в теле этого конструктора.

Вместо этого вам нужно превратить локальную переменную в поле вашего класса.Только тогда оно становится «видимым» в других местах вашего класса!То же самое, что вы правильно сделали для набора и ранга в классе вашей карты!

И, конечно, метод игры должен , а не быть статичным!Игра об одной колоде, а не о всех!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...