Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从另一个类调用方法?_Java_Oop - Fatal编程技术网

Java 如何从另一个类调用方法?

Java 如何从另一个类调用方法?,java,oop,Java,Oop,所以我是OOP的新手,目前在使用另一种方法的函数时遇到了问题。下面的类是纸牌游戏的主要类。在这里,它通过从游戏类创建一个对象来创建一副牌。然后用创建的牌组开始游戏,并打印牌组的大小 public class Run { public static void main(String[] args) { Game game; System.out.println("Welcome!"); play = true; while (play) { ga

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

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类,它在其中实际创建Deck,并有一个返回该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;
}
这一定是一个明显的错误,因为我不理解,所以有人能告诉我如何修复它吗?

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

您需要将局部变量转换为类的字段。只有这样,它才会在你们班的其他地方“可见”!同样的事情,你做正确的套房和排名在您的卡类


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

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

Deck Main = null;
public Game(int ranks)
{
    Main = new Deck(ranks);
}
另一个重击是,无需创建对象来调用静态方法,您可以直接使用类名调用它,如:

Game.play();

更改游戏类,如下所示:

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
}
}
无论哪种方式,您都可以使其无错误。 问题是:您想要获取构造函数中的变量, 在构造函数中,它的局部变量

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

请尝试以下方法:

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
}

你提到了一个错误,但没有说错误是什么。。。虽然我们可以通过阅读您的代码来解决这个问题,但您应该在问题中包含所有这些细节。无关:Main是一个变量,所以它应该以小写开头。你真正的main方法将永远循环,因为你一直在调用play方法,但是你永远不会改变控制封闭循环的局部变量。可能是@GhostCat Ya的重复,因为游戏还没有结束,所以它应该永远运行。我可能应该编辑那个部分,然后发布它哈哈。@Zephyr我很抱歉我下次一定会这么做。关于静态的观点很好,但是:这个方法首先不应该是静态的。嗨,欢迎使用堆栈溢出。虽然答案总是受欢迎的,但最好解释代码的作用以及它如何帮助解决问题。请花点时间读一读啊,我看到了愚蠢的我。谢谢你的解释,这更有意义。
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
}