2

我想知道机器人运行像Karel这样的程序,因为它不使用 main() 方法。相反,它使用了 run() 方法:

import stanford.karel.Karel;

public class CollectNewspaperKarel extends Karel { 
  public void run() { 
    move(); 
  } 
}

它是如何工作的?

4

5 回答 5

6

实际的主要方法在其他地方。例如,在KarelRunner 类中。java执行程序时,其实是在执行runner类中的main方法。您自己的 run 方法是从该运行程序代码中调用的。

于 2014-07-26T22:24:25.277 回答
2

“main”方法是每个 java 程序的起点。这个类的情况是它本身不是一个java程序,是在某种类型的框架内执行的(在这种情况下是karel机器人java实现),这个框架当然有一个“main”方法但没有这个类,框架知道如何加载这个类并执行他的 run 方法。

这个“程序”是设计用于执行特殊类型程序的框架,我不知道这个“karel 框架”,但是例如,当你编写一个 java web 应用程序时,你编写了一个“servlet”,但你没有编写一个“主要”方法。有一些称为“应用程序服务器”的程序当然有一个“主”方法,并采用这个 servlet 类并执行以响应一些 http 消息。

于 2014-07-27T01:59:45.617 回答
1

没有什么奇怪的。该类CollectNewspaperKarel只是扩展了 Karel 的行为。它不需要有main方法。

将成为程序入口点的类确实需要有一个main方法并创建一个 的实例CollectNewspaperKarel,例如:

public class MyProgram {

    public static void main(String[] args) {
        CollectNewspaperKarel cnpk = new CollectNewspaperKarel();
        cnpk.run();
    }
}

或者 CollectNewspaperKarel 的实例可以是一个静态字段:

public class MyProgram {
    private static CollectNewspaperKarel cnpk = new CollectNewspaperKarel();
    public static void main(String[] args) {
        cnpk.run();
    }
}

Karel 不是一个应用程序,它是一个 API。你提出申请。

于 2014-07-27T00:09:10.627 回答
0

当您阅读所有这些说明时,您会发现 Karel 运行的程序只是更大系统的一小部分——更大的系统涉及绘制地图、发现逻辑错误等。您将内容写入run(),然后使用实际运行整个系统的类之一,以及 THOSE 调用run()您的程序之一。祝你好运。

于 2014-07-26T22:29:36.140 回答
0

关键很简单:extends Karel

Karel该类是一个实现的类Runnable,并且其中有很多方法。

在不尝试详细了解它的所有功能的情况下,它看起来像这样:

public class Karel implements java.lang.Runnable {
    private static final int NORTH = 0;
    private static final int EAST = 1;
    private static final int SOUTH = 2;
    private static final int WEST = 3;
    private static final int INFINITE = 99999999;
    private stanford.karel.KarelWorld world;
    private int x;
    private int y;
    private int dir;
    private int beepers;

    public Karel() { /* compiled code */ }
    public void run() { /* compiled code */ }
    public void move() { /* compiled code */ }
    public void turnLeft() { /* compiled code */ }
    public boolean beepersPresent() { /* compiled code */ }
    public boolean noBeepersPresent() { /* compiled code */ }
    public boolean beepersInBag() { /* compiled code */ }
    public boolean noBeepersInBag() { /* compiled code */ }
    public boolean facingNorth() { /* compiled code */ }
    public boolean facingEast() { /* compiled code */ }
    public boolean facingSouth() { /* compiled code */ }
    public boolean facingWest() { /* compiled code */ }

    public static void main(java.lang.String[] args) { /* compiled code */ }
    protected void start() { /* compiled code */ }
    protected void start(java.lang.String[] args) { /* compiled code */ }

    ...
}

我从那里拿出了很多方法,因为它定义的东西很长。

但是我留下的最后一个…… protected void start(java.lang.String[] args)(或者至少,我的图书馆检查员是这样解释的)。 深入研究这段代码,这似乎是main()在 KarelProgram 中调用的,但在大多数情况下,这既不是这里也不是那里。

这样你就有了产业。您正在继承代码正在使用的许多其他方法。您move();在该代码中使用但未定义它应该不会比定义它更令人惊讶main(java.lang.String[] args)

只需在 IDE 中打开 jar 中的类即可。

于 2014-07-26T22:37:45.080 回答