卡雷尔如何在没有“主要”方法的情况下运行?

时间:2014-07-26 22:18:15

标签: java karel

我想在Karel the Robot运行的程序中运行,因为它没有使用main()方法。相反,它使用了run()方法:

import stanford.karel.Karel;

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

它是如何运作的?

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

这个"节目"是专门用于执行特定类型程序的框架,我不知道这个" karel框架",但是,例如,当您编写一个Java Web应用程序时,您编写了一个" servlet" ;但你不会写一个" main"方法。有些程序称为"应用程序服务器"那当然有一个"主要"方法并获取此servlet类并执行以响应某些http消息。

答案 2 :(得分: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。您可以申请。

答案 3 :(得分:0)

当您阅读所有这些说明时,您会发现Karel运行的程序只是较大系统的一小部分 - 较大的系统涉及绘制地图,发现逻辑错误等。您在{ {1}},然后你使用其中一个实际运行整个系统的类,以及你程序中的一个调用run()。祝你好运。

答案 4 :(得分: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)(或者至少,我的图书馆检查员如何解释它)。 深入研究这段代码,看来这会在KarelProgram中调用main(),但在大多数情况下,无论是在这里还是在那里。

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

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