我在程序中想知道如Karel the Robot运行,因为它没有使用main()方法。相反,它使用run()方法:卡雷尔如何在没有“主要”方法的情况下运行?
import stanford.karel.Karel;
public class CollectNewspaperKarel extends Karel {
public void run() {
move();
}
}
它是如何工作的?
我在程序中想知道如Karel the Robot运行,因为它没有使用main()方法。相反,它使用run()方法:卡雷尔如何在没有“主要”方法的情况下运行?
import stanford.karel.Karel;
public class CollectNewspaperKarel extends Karel {
public void run() {
move();
}
}
它是如何工作的?
实际的主要方法是在别的地方。例如,在the KarelRunner class。当java执行程序时,它实际上是在runner类中执行main方法。您自己的运行方法是从该运行程序代码中调用的。
当您阅读所有这些说明时,您会发现卡雷尔运行的程序只是较大系统的一小部分 - 较大的系统涉及绘制地图,发现逻辑错误等。 run()
,那么您使用其中一个实际运行整个系统的类,其中一个在您的程序上调用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)
(或至少,这是我的图书馆检查员如何解释它)。 深入研究这段代码,看起来这调用了KarelProgram中的main()
,但大多数情况下,这不是在这里,也不是在那里。
因此你有继承。您正在继承代码正在使用的许多其他方法。您在该代码中使用move();
但未对其进行定义应该比定义main(java.lang.String[] args)
更令人惊讶。
它只需要在IDE中的jar中打开该类。
没有什么奇怪的。 CollectNewspaperKarel
课程只是扩展了卡雷尔的行为。 它不需要有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();
}
}
卡雷尔是不是一个应用程序,它是一个API。你制作应用程序。
“主”方法是每个java程序的出发点。这个类正在发生的事情是,它不是一个java程序本身,而是在某种类型的框架(在这种情况下是karel robot java实现)中执行的,这个框架偏离了过程的“主要”方法,而不是这个类,框架知道如何加载这个类并执行他的运行方法。这个“程序”是设计用于执行特定类型程序的框架,我不知道这个“karel框架”,但是例如,当你编写一个java web应用程序时,你写了一个“servlet”,但是你不用写一个“主要”方法。有一些程序称为“应用程序服务器”,当然有一个“主要”方法,并采用此servlet类并执行以响应某些http消息。
什么是公共内部static void main(java.lang.String [] args){/ *编译代码* /}? – user3276091
不知道,我对该方法的观点是编码字节码,并且里面有一个'invokestatic'。我真的没有打扰太深,并且源文件没有附加在.jar文件中。 –