我在程序中想知道如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文件中。 –