我想知道机器人运行像Karel这样的程序,因为它不使用 main() 方法。相反,它使用了 run() 方法:
import stanford.karel.Karel;
public class CollectNewspaperKarel extends Karel {
public void run() {
move();
}
}
它是如何工作的?
实际的主要方法在其他地方。例如,在KarelRunner 类中。java执行程序时,其实是在执行runner类中的main方法。您自己的 run 方法是从该运行程序代码中调用的。
“main”方法是每个 java 程序的起点。这个类的情况是它本身不是一个java程序,是在某种类型的框架内执行的(在这种情况下是karel机器人java实现),这个框架当然有一个“main”方法但没有这个类,框架知道如何加载这个类并执行他的 run 方法。
这个“程序”是设计用于执行特殊类型程序的框架,我不知道这个“karel 框架”,但是例如,当你编写一个 java web 应用程序时,你编写了一个“servlet”,但你没有编写一个“主要”方法。有一些称为“应用程序服务器”的程序当然有一个“主”方法,并采用这个 servlet 类并执行以响应一些 http 消息。
没有什么奇怪的。该类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。你提出申请。
当您阅读所有这些说明时,您会发现 Karel 运行的程序只是更大系统的一小部分——更大的系统涉及绘制地图、发现逻辑错误等。您将内容写入run()
,然后使用实际运行整个系统的类之一,以及 THOSE 调用run()
您的程序之一。祝你好运。
关键很简单: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 中的类即可。