คำนำ
เราคุ้นเคยกับฟังก์ชั่นหลักในชวามาก ฉันเชื่อว่าทุกคนที่เรียนรู้ภาษา Java สามารถเขียนฟังก์ชั่นการเข้าร่วมของโปรแกรมนี้ได้อย่างชำนาญ อย่างไรก็ตามเพราะเหตุใดฟังก์ชั่นหลักจึงถูกเขียนด้วยวิธีนี้คำหลักแต่ละคำจึงมีความหมายอย่างไร บางทีทุกคนไม่สามารถตอบได้อย่างง่ายดาย ฉันยังพบปัญหานี้ในระหว่างการศึกษา โดยการค้นหาข้อมูลออนไลน์และเพิ่มการปฏิบัติของฉันเองในที่สุดฉันก็ได้รับประสบการณ์ ฉันไม่กล้าเก็บไว้และเขียนออกมาเพื่อแบ่งปันกับทุกคน
Main () วิธีการใน Java
Java Virtual Machine ค้นหาโปรแกรมการทำงานที่ต้องเริ่มต้นด้วยวิธีการหลักและตรวจสอบว่าคลาสที่ฟังก์ชันหลักนั้นถูกโหลดโดยเครื่องเสมือน Java หรือไม่ หากไม่ได้โหลดให้โหลดคลาสและโหลดคลาสอื่น ๆ ที่เกี่ยวข้องทั้งหมด ดังนั้นเมื่อโปรแกรมกำลังทำงานวิธีแรกในการดำเนินการคือวิธี main() โดยปกติหากคุณต้องการเรียกใช้เมธอดคลาสคุณต้องยกตัวอย่างวัตถุของคลาสนี้ก่อนจากนั้นผ่าน " ชื่อวัตถุชื่อเมธอด () "แต่เนื่องจากหลักคือจุดเริ่มต้นของโปรแกรมวัตถุยังไม่ได้รับการยกตัวอย่างในเวลานี้วิธีหลักจะถูกประกาศว่าเป็นแบบคงที่เพื่อให้สามารถเรียกใช้วิธีนี้โดยตรงผ่าน ชื่อ " ชื่อวิธี () "
ก่อนที่จะดูวิธีการหลัก () ใน Java ก่อนอื่นมาดูแอปพลิเคชัน Java ที่ง่ายที่สุด HelloWorld ฉันจะใช้ตัวอย่างนี้เพื่อแสดงให้เห็นถึงความลึกลับของวิธีการ main() ในคลาส Java รหัสของโปรแกรมมีดังนี้:
/ *** คำอธิบายโดยละเอียดของเมน () ใน java*/ ชั้นเรียนสาธารณะ HelloWorld {โมฆะคงที่สาธารณะหลัก (String args []) {System.out.println ("Hello World!"); -1. พูดคุยเกี่ยวกับหมวดหมู่ก่อน:
มีวิธีการ main() ในคลาส HelloWorld ซึ่งหมายความว่านี่เป็นแอปพลิเคชัน Java ที่เริ่มต้นและเรียกใช้โดยตรงผ่าน JVM
เนื่องจากเป็นคลาส Java อนุญาตให้คลาสไม่อยู่ภายใต้ข้อ จำกัด ของคำหลักสาธารณะ แน่นอนคำจำกัดความของคลาสสามารถ จำกัด เฉพาะคำหลักสาธารณะหรือไม่ จำกัด (ค่าเริ่มต้น)
2. มาพูดถึงวิธีการหลัก ()
วิธีการ main() ถูกประกาศว่า: public static void main(String args[]) มันจะต้องกำหนดเช่นนี้นี่คือข้อกำหนด Java
ทำไมถึงกำหนดเช่นนี้? มันมีบางอย่างเกี่ยวกับการดำเนินงานของ JVM
เมื่อมีวิธีการ main() ในชั้นเรียนการดำเนินการคำสั่ง "ชื่อคลาส Java" จะเริ่มเครื่องเสมือนเพื่อเรียกใช้วิธีหลักในชั้นเรียน
เนื่องจาก JVM จะโทรหาวิธีหลักเป็นครั้งแรกเมื่อเรียกใช้แอปพลิเคชัน Java นี้ เมื่อโทรหาวัตถุของคลาสนี้ไม่ได้สร้างอินสแตนซ์ แต่ถูกเรียกโดยตรงผ่านชื่อคลาสดังนั้นจึงต้องถูก จำกัด ให้สาธารณะคงที่
สำหรับวิธีการหลักใน Java, JVM มีข้อ จำกัด และไม่สามารถมีค่าคืนได้ดังนั้นประเภทค่าคืนจะเป็นโมฆะ
นอกจากนี้ยังมีพารามิเตอร์อินพุตในวิธีหลักซึ่งเป็นประเภทสตริง [] ซึ่งเป็นข้อกำหนด Java วิธีการ main() ต้องมีพารามิเตอร์รายการและรายละเอียดคลาสจะต้องเป็น String[] สำหรับชื่อของอาร์เรย์สตริงสามารถตั้งค่าได้ด้วยตัวเอง ตามนิสัยชื่อของสตริงอาร์เรย์นี้โดยทั่วไปสอดคล้องกับชื่อของพารามิเตอร์ MIAN ในตัวอย่างข้อมูลจำเพาะของ Sun Java และมีชื่อว่า Args
ดังนั้นนิยามวิธีการ main() จะต้องเป็น: " public static void main(String 字符串数组参数名[]) "
3. วิธีการหลัก () สามารถโยนข้อยกเว้น
ดังนั้นข้อยกเว้นสามารถโยนในวิธีการ main() และสามารถประกาศข้อยกเว้นในวิธีการ main()
ตัวอย่างเช่นต่อไปนี้ถูกต้อง:
Public Class Testmain {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {system.out.println ("hahahahahahahaha"); โยนข้อยกเว้นใหม่ (""); -ผลการดำเนินการ: Hahahahaha ยกเว้นในด้าย "Main" Java.lang.exception: atavest.testmain.main (testmain.java:11) ที่ sun.reflect.nativemethodaccessorimpl.invoke0 (วิธีการดั้งเดิม) sun.reflect.delegatingMethodaccessorimpl.invoke (มอบหมาย Methodaccessorimpl.java:25) ที่ java.lang.reflect.method.invoke (method.java:585) ที่ com.intellij.rt.execution.application
4. ฟังก์ชั่นของพารามิเตอร์สตริงในเมธอด Main ()
ในวิธีการ main() , ฟังก์ชั่นอาร์เรย์พารามิเตอร์สตริงเพื่อรับพารามิเตอร์อินพุตบรรทัดคำสั่งและพารามิเตอร์ของบรรทัดคำสั่งจะถูกคั่นด้วยช่องว่าง
นี่คือตัวอย่างที่จะดูวิธีการเริ่มต้นและใช้อาร์เรย์นี้
/ *** พิมพ์พารามิเตอร์อินพุตในวิธีการหลัก*/ Public Class Testmain {โมฆะคงที่สาธารณะหลัก (สตริง args []) {system.out.println ("พารามิเตอร์การพิมพ์อินพุตในวิธีหลัก!"); สำหรับ (int i = 0; i <args.length; i ++) {system.out.println (args [i]); - วิธีการดำเนินการและผลการดำเนินงาน
D:/การศึกษา/basetest/src> javac testmain.java d:/การศึกษา/basetest/src> java testmain 1 2 3 พิมพ์พารามิเตอร์อินพุตในวิธีหลัก! 1 2 3
5. ให้ HelloWorld อีกรุ่นหนึ่ง
/ *** เวอร์ชันที่บิดเบือนของ helloWorld.hehe*/ คลาสสาธารณะ HelloWorld2 {คงที่ {System.out.println ("Hello Wordld!"); } โมฆะคงที่สาธารณะหลัก (สตริง args []) {system.exit (0); - วิธีการ main() ดำเนินการเนื้อหาของประโยค " System.exit(0); " โดยมีวัตถุประสงค์เพื่อให้โปรแกรมสิ้นสุดตามปกติ "HelloWorld!" อยู่ที่ไหน พิมพ์จาก? ความลับถูกพิมพ์ในแบบคงที่เนื่องจากเนื้อหาของบล็อกรหัสคงที่จะถูกเรียกก่อนการโทรหลัก
VI. ตัวอย่าง
เครื่องเสมือนเริ่มต้นด้วยการเรียกวิธีการหลักของคลาสที่ระบุส่งผ่านไปยังพารามิเตอร์หลักของสตริงอาร์เรย์เพื่อให้คลาสที่ระบุถูกโหลดเชื่อมโยงประเภทอื่น ๆ ที่ใช้โดยคลาสและเริ่มต้นพวกเขา ตัวอย่างเช่นสำหรับโปรแกรม:
คลาสสาธารณะ HelloApp {โมฆะคงที่สาธารณะหลัก (String [] args) {system.out.println ("Hello World!"); สำหรับ (int i = 0; i <args.length; i ++) {system.out.println (args); -หลังจากการรวบรวมแล้วให้พิมพ์ในโหมดบรรทัดคำสั่ง: Java HelloApp เรียกใช้เครื่องเสมือน
Java Virtual Machine จะเริ่มต้นด้วยการโทรหาวิธีการหลักของ HelloApp และส่งผ่านไปยังอาร์เรย์หลักที่มีสามสตริง "เรียกใช้", "เสมือนจริง" และ "เครื่อง" ตอนนี้เราอธิบายขั้นตอนที่เครื่องเสมือนอาจใช้เวลาสั้น ๆ เมื่อดำเนินการ HelloApp
ฉันเริ่มพยายามเรียกใช้วิธีหลักของคลาส HelloAPP และพบว่าคลาสไม่ได้โหลดซึ่งหมายความว่าเครื่องเสมือนไม่ได้มีตัวแทนไบนารีของชั้นเรียนในปัจจุบัน ดังนั้นเครื่องเสมือนจึงใช้ classloader เพื่อพยายามค้นหาตัวแทนไบนารี หากกระบวนการนี้ล้มเหลวข้อยกเว้นจะถูกโยนลงไป หลังจากโหลดคลาสก่อนที่จะมีการเรียกวิธีการหลักแล้วคลาส HelloApp จะต้องเชื่อมโยงกับประเภทอื่น ๆ และเริ่มต้น ลิงค์ประกอบด้วยสามขั้นตอน: การตรวจสอบการเตรียมการและการแยกวิเคราะห์ ตรวจสอบสัญลักษณ์และความหมายของคลาสหลักที่โหลดแล้วเตรียมสร้างโดเมนแบบคงที่ของคลาสหรืออินเทอร์เฟซและเริ่มต้นโดเมนเหล่านี้เป็นค่าเริ่มต้นมาตรฐานและการแยกวิเคราะห์มีหน้าที่ตรวจสอบการอ้างอิงเชิงสัญลักษณ์ของคลาสหลักไปยังคลาสหรืออินเทอร์เฟซอื่น ๆ เป็นทางเลือกในขั้นตอนนี้ การเริ่มต้นคลาสคือการดำเนินการของฟังก์ชันการเริ่มต้นแบบคงที่และตัวสร้างการเริ่มต้นของโดเมนคงที่ที่ประกาศในชั้นเรียน คลาสแม่ของคลาสจะต้องเริ่มต้นก่อนที่จะเริ่มต้น
กระบวนการทั้งหมดมีดังนี้:
สรุป
ตามข้อกำหนดพิเศษวิธีการหลักนั้นแตกต่างจากวิธีการทั่วไปและมีข้อ จำกัด มากมาย การทำความเข้าใจหลักการของมันต้องใช้การเรียนรู้ความรู้ที่เกี่ยวข้องกับ JVM มันเป็นอุปสรรคสำคัญในการเรียนรู้ในชวา ข้างต้นเป็นบทสรุปของหลักการและการใช้งานหลักที่รวบรวมโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร