เรียนรู้ Java ตั้งแต่ต้น

คุณต้องการโปรแกรมใน Java หรือไม่? เยี่ยมมากและคุณมาถูกที่แล้ว Java 101 ชุดยังมีการเปิดตัวแนะนำตัวเองกับการเขียนโปรแกรม Java ที่เริ่มต้นด้วยพื้นฐานและครอบคลุมทุกแนวคิดหลักที่คุณจำเป็นต้องรู้เพื่อเป็นนักพัฒนา Java ประสิทธิผล ซีรีส์นี้มีเนื้อหาทางเทคนิคพร้อมตัวอย่างโค้ดมากมายที่จะช่วยให้คุณเข้าใจแนวคิดในขณะที่เราดำเนินการไป ฉันจะถือว่าคุณมีประสบการณ์การเขียนโปรแกรมอยู่แล้วไม่ใช่แค่ใน Java

บทความแรกนี้แนะนำแพลตฟอร์ม Java และอธิบายความแตกต่างระหว่างสามรุ่น ได้แก่ Java SE, Java EE และ Java ME คุณจะได้เรียนรู้เกี่ยวกับบทบาทของ Java virtual machine (JVM) ในการปรับใช้แอปพลิเคชัน Java ฉันจะช่วยคุณตั้งค่า Java Development Kit (JDK) ในระบบของคุณเพื่อให้คุณสามารถพัฒนาและรันโปรแกรม Java ได้และฉันจะช่วยคุณเริ่มต้นด้วยสถาปัตยกรรมของแอปพลิเคชัน Java ทั่วไป สุดท้ายนี้คุณจะได้เรียนรู้วิธีการคอมไพล์และรันแอพ Java ง่ายๆ

อัปเดตสำหรับ Java 12 และ JShell ใหม่

ชุดนี้ได้รับการอัปเดตสำหรับ Java 12 และรวมถึงการแนะนำอย่างรวดเร็วสำหรับใหม่jshell: เครื่องมือโต้ตอบสำหรับการเรียนรู้ Java และการสร้างต้นแบบโค้ด Java

ดาวน์โหลดรับโค้ดดาวน์โหลดซอร์สโค้ดสำหรับแอปพลิเคชันตัวอย่างในบทช่วยสอนนี้ สร้างโดย Jeff Friesen สำหรับ JavaWorld

Java คืออะไร?

คุณอาจคิดว่า Java เป็นภาษาเชิงวัตถุที่มีวัตถุประสงค์ทั่วไปซึ่งมีลักษณะคล้าย C และ C ++ มาก แต่จะใช้ง่ายกว่าและช่วยให้คุณสร้างโปรแกรมที่มีประสิทธิภาพมากขึ้น น่าเสียดายที่คำจำกัดความนี้ไม่ได้ให้ข้อมูลเชิงลึกเกี่ยวกับ Java มากนัก ในปี 2000 Sun Microsystems (ผู้ริเริ่มแพลตฟอร์ม Java) อธิบาย Java ด้วยวิธีนี้: 

Java เป็นภาษาคอมพิวเตอร์ที่เรียบง่ายเชิงวัตถุเข้าใจเครือข่ายตีความแข็งแกร่งปลอดภัยสถาปัตยกรรมเป็นกลางพกพาประสิทธิภาพสูงมัลติเธรดแบบไดนามิกภาษาคอมพิวเตอร์

ลองพิจารณาแต่ละคำจำกัดความเหล่านี้แยกกัน

Java เป็นภาษาที่ง่ายJava ได้รับการจำลองแบบตาม C และ C ++ ในขั้นต้นโดยลบคุณลักษณะบางอย่างที่อาจทำให้สับสน ตัวชี้การสืบทอดการนำไปใช้งานหลายตัวและการโอเวอร์โหลดตัวดำเนินการเป็นคุณลักษณะ C / C ++ บางอย่างที่ไม่ได้เป็นส่วนหนึ่งของ Java คุณลักษณะที่ไม่ได้รับคำสั่งใน C / C ++ แต่จำเป็นสำหรับ Java คือสิ่งอำนวยความสะดวกในการรวบรวมขยะที่เรียกคืนอ็อบเจ็กต์และอาร์เรย์โดยอัตโนมัติ

Java เป็นภาษาเชิงวัตถุโฟกัสเชิงวัตถุของ Java ช่วยให้นักพัฒนาสามารถปรับ Java เพื่อแก้ปัญหาได้แทนที่จะบังคับให้เราจัดการปัญหาเพื่อให้ตรงตามข้อ จำกัด ของภาษา สิ่งนี้แตกต่างจากภาษาที่มีโครงสร้างเช่น C ตัวอย่างเช่นในขณะที่ Java ให้คุณมุ่งเน้นไปที่ออบเจ็กต์บัญชีออมทรัพย์ C ต้องการให้คุณคิดแยกเกี่ยวกับสถานะบัญชีออมทรัพย์(ยอดคงเหลือดังกล่าว) และพฤติกรรม (เช่นการฝากและถอน)

Java เป็นภาษาเครือข่ายเข้าใจไลบรารีเครือข่ายที่กว้างขวางของ Java ทำให้ง่ายต่อการรับมือกับโปรโตคอลเครือข่าย Transmission Control Protocol / Internet Protocol (TCP / IP) เช่น HTTP (HyperText Transfer Protocol) และ FTP (File Transfer Protocol) และลดความยุ่งยากในการเชื่อมต่อเครือข่าย นอกจากนี้โปรแกรม Java ยังสามารถเข้าถึงอ็อบเจ็กต์ผ่านเครือข่าย TCP / IP ผ่าน Uniform Resource Locators (URLs) ได้อย่างง่ายดายเช่นเดียวกับที่คุณเข้าถึงได้จากระบบไฟล์ภายในเครื่อง

Java เป็นภาษาตีความในรันไทม์โปรแกรม Java จะดำเนินการทางอ้อมบนแพลตฟอร์มพื้นฐาน (เช่น Windows หรือ Linux) ผ่านเครื่องเสมือน (ซึ่งเป็นตัวแทนซอฟต์แวร์ของแพลตฟอร์มสมมุติ) และสภาพแวดล้อมการดำเนินการที่เกี่ยวข้อง เครื่องเสมือนจะแปลไบต์โค้ดของโปรแกรม Java (คำแนะนำและข้อมูลที่เกี่ยวข้อง) เป็นคำสั่งเฉพาะแพลตฟอร์มผ่านการตีความการตีความหมายถึงการหาว่าคำสั่ง bytecode หมายถึงอะไรจากนั้นจึงเลือกคำสั่งเฉพาะแพลตฟอร์ม "กระป๋อง" ที่เทียบเท่าเพื่อดำเนินการ จากนั้นเครื่องเสมือนจะเรียกใช้คำสั่งเฉพาะแพลตฟอร์มเหล่านั้น

การตีความทำให้ง่ายต่อการดีบักโปรแกรม Java ที่ผิดพลาดเนื่องจากมีข้อมูลเวลาคอมไพล์มากขึ้นที่รันไทม์ การตีความยังช่วยให้สามารถชะลอขั้นตอนการเชื่อมโยงระหว่างส่วนต่างๆของโปรแกรม Java จนถึงรันไทม์ซึ่งจะทำให้การพัฒนาเร็วขึ้น

Java เป็นภาษาที่แข็งแกร่ง โปรแกรม Java ต้องมีความน่าเชื่อถือเนื่องจากใช้ในแอปพลิเคชันสำหรับผู้บริโภคและภารกิจที่สำคัญตั้งแต่เครื่องเล่น Blu-ray ไปจนถึงระบบนำทางในยานพาหนะหรือระบบควบคุมทางอากาศ คุณลักษณะของภาษาที่ช่วยให้ Java มีประสิทธิภาพ ได้แก่ การประกาศการตรวจสอบประเภทที่ซ้ำกันในเวลาคอมไพล์และรันไทม์ (เพื่อป้องกันปัญหาเวอร์ชันไม่ตรงกัน) อาร์เรย์จริงที่มีการตรวจสอบขอบเขตอัตโนมัติและการละเว้นพอยน์เตอร์ (ดู "คุณลักษณะของภาษา Java เบื้องต้น" เพื่อเริ่มต้นกับประเภทภาษา Java ตัวอักษรตัวแปรและอื่น ๆ )

อีกแง่หนึ่งของความแข็งแกร่งของ Java คือการวนซ้ำต้องถูกควบคุมโดยนิพจน์บูลีนแทนที่จะเป็นนิพจน์จำนวนเต็มโดยที่ 0 เป็นเท็จและค่าที่ไม่ใช่ศูนย์เป็นจริง ตัวอย่างเช่น Java ไม่อนุญาตให้ใช้การวนซ้ำแบบ C เช่นwhile (x) x++;เนื่องจากการวนซ้ำอาจไม่สิ้นสุดตามที่คาดไว้ คุณต้องระบุนิพจน์บูลีนอย่างชัดเจนแทนเช่นwhile (x != 10) x++;(ซึ่งหมายความว่าลูปจะทำงานจนxเท่ากับ 10)

Java เป็นภาษาที่มีความปลอดภัย โปรแกรม Java ถูกใช้ในสภาพแวดล้อมแบบเครือข่าย / แบบกระจาย เนื่องจากโปรแกรม Java สามารถโยกย้ายและดำเนินการบนแพลตฟอร์มต่างๆของเครือข่ายได้สิ่งสำคัญคือต้องปกป้องแพลตฟอร์มเหล่านี้จากรหัสที่เป็นอันตรายที่อาจแพร่กระจายไวรัสขโมยข้อมูลบัตรเครดิตหรือดำเนินการที่เป็นอันตรายอื่น ๆ คุณลักษณะภาษา Java ที่รองรับความทนทาน (เช่นการละเว้นของพอยน์เตอร์) ทำงานร่วมกับคุณลักษณะด้านความปลอดภัยเช่นโมเดลการรักษาความปลอดภัย Java sandbox และการเข้ารหัสคีย์สาธารณะ คุณสมบัติเหล่านี้ร่วมกันป้องกันไวรัสและรหัสอันตรายอื่น ๆ จากการสร้างความหายนะบนแพลตฟอร์มที่ไม่น่าสงสัย

ในทางทฤษฎี Java มีความปลอดภัย ในทางปฏิบัติมีการตรวจพบและใช้ช่องโหว่ด้านความปลอดภัยต่างๆ ด้วยเหตุนี้ Sun Microsystems และ Oracle จึงยังคงปล่อยการอัปเดตด้านความปลอดภัย

Java เป็นภาษาสถาปัตยกรรมที่เป็นกลางเครือข่ายเชื่อมต่อแพลตฟอร์มกับสถาปัตยกรรมที่แตกต่างกันโดยอาศัยไมโครโปรเซสเซอร์และระบบปฏิบัติการต่างๆ คุณไม่สามารถคาดหวังให้ Java สร้างคำสั่งเฉพาะแพลตฟอร์มและมีคำสั่งเหล่านี้ "เข้าใจ" โดยแพลตฟอร์มทุกประเภทที่เป็นส่วนหนึ่งของเครือข่าย แต่ Java จะสร้างคำสั่ง bytecode ที่ไม่ขึ้นกับแพลตฟอร์มซึ่งง่ายสำหรับแต่ละแพลตฟอร์มในการตีความ (ผ่านการใช้งาน JVM)

Java เป็นภาษาแบบพกพาความเป็นกลางของสถาปัตยกรรมมีส่วนช่วยในการพกพา อย่างไรก็ตามมีความสามารถในการพกพาของ Java มากกว่าคำสั่ง bytecode ที่ไม่ขึ้นกับแพลตฟอร์ม พิจารณาว่าขนาดประเภทจำนวนเต็มต้องไม่แตกต่างกัน ตัวอย่างเช่นประเภทจำนวนเต็ม 32 บิตต้องได้รับการลงชื่อและครอบครอง 32 บิตเสมอไม่ว่าจะประมวลผลจำนวนเต็ม 32 บิตที่ใด (เช่นแพลตฟอร์มที่มีการลงทะเบียน 16 บิตแพลตฟอร์มที่มีการลงทะเบียน 32 บิตหรือแพลตฟอร์ม ด้วยการลงทะเบียน 64 บิต) ไลบรารีของ Java ยังมีส่วนช่วยในการพกพา ในกรณีที่จำเป็นจะมีประเภทที่เชื่อมต่อโค้ด Java กับความสามารถเฉพาะแพลตฟอร์มในลักษณะพกพาได้มากที่สุด

Java เป็นภาษาที่มีประสิทธิภาพสูง การสื่อความหมายจะให้ระดับประสิทธิภาพที่มากเกินพอ สำหรับสถานการณ์จำลองแอ็พพลิเคชันที่มีประสิทธิภาพสูงมาก Java จะใช้การคอมไพล์แบบทันเวลาซึ่งวิเคราะห์ลำดับคำสั่ง bytecode ที่ตีความและรวบรวมลำดับคำสั่งที่ตีความบ่อยเป็นคำสั่งเฉพาะแพลตฟอร์ม ความพยายามในภายหลังในการตีความลำดับคำสั่ง bytecode เหล่านี้ส่งผลให้มีการดำเนินการตามคำสั่งเฉพาะแพลตฟอร์มที่เทียบเท่าส่งผลให้มีการเพิ่มประสิทธิภาพ

Java เป็นภาษาแบบมัลติเธรดเพื่อปรับปรุงประสิทธิภาพการทำงานของโปรแกรมที่จะต้องบรรลุผลงานหลายครั้งที่ Java สนับสนุนแนวคิดของการดำเนินเกลียวตัวอย่างเช่นโปรแกรมที่จัดการส่วนติดต่อผู้ใช้แบบกราฟิก (GUI) ในขณะที่รออินพุตจากการเชื่อมต่อเครือข่ายจะใช้เธรดอื่นเพื่อดำเนินการรอแทนที่จะใช้เธรด GUI เริ่มต้นสำหรับทั้งสองงาน สิ่งนี้ช่วยให้ GUI ตอบสนอง การซิงโครไนซ์แบบดั้งเดิมของ Java ช่วยให้เธรดสามารถสื่อสารข้อมูลระหว่างกันได้อย่างปลอดภัยโดยไม่ทำให้ข้อมูลเสียหาย (ดูการเขียนโปรแกรมแบบเธรดใน Java ที่กล่าวถึงที่อื่นในซีรีส์ Java 101)

Java เป็นภาษาแบบไดนามิกเนื่องจากการเชื่อมต่อระหว่างโค้ดโปรแกรมและไลบรารีเกิดขึ้นแบบไดนามิกที่รันไทม์จึงไม่จำเป็นต้องเชื่อมโยงอย่างชัดเจน ด้วยเหตุนี้เมื่อโปรแกรมหรือไลบรารีหนึ่งของโปรแกรมมีวิวัฒนาการ (เช่นสำหรับการแก้ไขข้อบกพร่องหรือการปรับปรุงประสิทธิภาพ) ผู้พัฒนาจะต้องแจกจ่ายโปรแกรมหรือไลบรารีที่อัปเดตเท่านั้น แม้ว่าพฤติกรรมแบบไดนามิกจะส่งผลให้โค้ดแจกจ่ายน้อยลงเมื่อเกิดการเปลี่ยนแปลงเวอร์ชัน แต่นโยบายการแจกจ่ายนี้ยังสามารถนำไปสู่ความขัดแย้งของเวอร์ชัน ตัวอย่างเช่นนักพัฒนาลบประเภทคลาสออกจากไลบรารีหรือเปลี่ยนชื่อ เมื่อ บริษัท กระจายไลบรารีที่อัปเดตแล้วโปรแกรมที่มีอยู่ซึ่งขึ้นอยู่กับประเภทคลาสจะล้มเหลว เพื่อลดปัญหานี้ลงอย่างมาก Java สนับสนุนประเภทอินเทอร์เฟซซึ่งเปรียบเสมือนสัญญาระหว่างสองฝ่าย (ดูอินเทอร์เฟซประเภทและคุณลักษณะภาษาเชิงวัตถุอื่น ๆ ที่กล่าวถึงในที่อื่น ๆ ในซีรีส์ Java 101)

การคลายความหมายนี้สอนเรามากมายเกี่ยวกับ Java ที่สำคัญที่สุดคือแสดงให้เห็นว่า Java เป็นทั้งภาษาและแพลตฟอร์ม คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับส่วนประกอบของแพลตฟอร์ม Java ได้แก่ เครื่องเสมือน Java และสภาพแวดล้อมการเรียกใช้งาน Java ในบทช่วยสอนนี้ในภายหลัง

Java สามรุ่น: Java SE, Java EE และ Java ME

Sun Microsystems เปิดตัวชุดพัฒนาซอฟต์แวร์ Java 1.0 (JDK) ในเดือนพฤษภาคม 1995 JDK ตัวแรกถูกใช้เพื่อพัฒนาแอพพลิเคชั่นเดสก์ท็อปและแอพเพล็ตและต่อมา Java ได้พัฒนาขึ้นเพื่อครอบคลุมการเขียนโปรแกรมเซิร์ฟเวอร์ระดับองค์กร การจัดเก็บไลบรารีที่จำเป็นทั้งหมดไว้ใน JDK เดียวจะทำให้ JDK มีขนาดใหญ่เกินไปที่จะแจกจ่ายโดยเฉพาะอย่างยิ่งเนื่องจากการแจกจ่ายในปี 1990 ถูก จำกัด ด้วยซีดีขนาดเล็กและความเร็วของเครือข่ายที่ช้า เนื่องจากนักพัฒนาส่วนใหญ่ไม่ต้องการ API สุดท้ายทุกตัว (นักพัฒนาแอปพลิเคชันเดสก์ท็อปแทบจะไม่จำเป็นต้องเข้าถึง Java API ขององค์กร) Sun จึงแยก Java ออกเป็นสามรุ่นหลัก ในที่สุดสิ่งเหล่านี้ก็รู้จักกันในชื่อ Java SE, Java EE และ Java ME:

  • Java Platform, Standard Edition (Java SE)เป็นแพลตฟอร์ม Java สำหรับพัฒนาแอปพลิเคชันฝั่งไคลเอ็นต์ (ซึ่งทำงานบนเดสก์ท็อป) และแอพเพล็ต (ซึ่งทำงานในเว็บเบราว์เซอร์) โปรดทราบว่าด้วยเหตุผลด้านความปลอดภัยไม่รองรับแอพเพล็ตอย่างเป็นทางการอีกต่อไป
  • Java Platform, Enterprise Edition (Java EE ) เป็นแพลตฟอร์ม Java ที่สร้างขึ้นจาก Java SE ซึ่งใช้เฉพาะในการพัฒนาแอปพลิเคชันเซิร์ฟเวอร์สำหรับองค์กร แอ็พพลิเคชันฝั่งเซิร์ฟเวอร์รวมJava servletsซึ่งเป็นโปรแกรม Java ที่คล้ายกับแอพเพล็ต แต่รันบนเซิร์ฟเวอร์แทนที่จะเป็นไคลเอ็นต์ Servlets เป็นไปตาม Java Servlet API
  • Java Platform, Micro Edition (Java ME)ยังสร้างขึ้นบน Java SE เป็นแพลตฟอร์ม Java สำหรับการพัฒนาMIDletsซึ่งเป็นโปรแกรม Java ที่ทำงานบนอุปกรณ์ข้อมูลมือถือและXletsซึ่งเป็นโปรแกรม Java ที่ทำงานบนอุปกรณ์ฝังตัว

Java SE เป็นแพลตฟอร์มพื้นฐานสำหรับ Java และเป็นจุดสำคัญสำหรับ Java 101 series ตัวอย่างโค้ดจะอ้างอิงจาก Java เวอร์ชันล่าสุดในขณะที่เขียน Java 12

แพลตฟอร์ม Java และ JVM

Java เป็นทั้งภาษาโปรแกรมและแพลตฟอร์มสำหรับรันโค้ด Java ที่คอมไพล์แล้ว แพลตฟอร์มนี้ประกอบด้วย JVM เป็นหลัก แต่ยังรวมถึงสภาพแวดล้อมการดำเนินการที่สนับสนุนการดำเนินการของ JVM บนแพลตฟอร์มพื้นฐาน (เนทีฟ) JVM มีส่วนประกอบหลายอย่างสำหรับการโหลดตรวจสอบและเรียกใช้โค้ด Java รูปที่ 1 แสดงวิธีการทำงานของโปรแกรม Java บนแพลตฟอร์มนี้ 

Jeff Friesen

ที่ด้านบนสุดของแผนภาพคือชุดของไฟล์คลาสโปรแกรมซึ่งหนึ่งในนั้นจะแสดงเป็นไฟล์คลาสหลัก โปรแกรม Java ประกอบด้วยไฟล์คลาสหลักเป็นอย่างน้อยซึ่งเป็นไฟล์คลาสแรกที่จะโหลดตรวจสอบและดำเนินการ

JVM มอบหมายการโหลดคลาสให้กับคอมโพเนนต์ classloader Classloaders โหลดไฟล์คลาสจากแหล่งต่างๆเช่นระบบไฟล์เครือข่ายและไฟล์เก็บถาวร พวกเขาป้องกัน JVM จากความซับซ้อนของการโหลดคลาส

ไฟล์คลาสที่โหลดจะถูกเก็บไว้ในหน่วยความจำและแสดงเป็นอ็อบเจ็กต์ที่สร้างจากClassคลาส เมื่อโหลดแล้วโปรแกรมตรวจสอบ bytecode จะตรวจสอบคำสั่ง bytecode ต่างๆเพื่อให้แน่ใจว่าถูกต้องและจะไม่ส่งผลต่อความปลอดภัย

ถ้าไบต์โค้ดของไฟล์คลาสไม่ถูกต้อง JVM จะสิ้นสุด มิฉะนั้นคอมโพเนนต์ตัวแปลจะตีความ bytecode ทีละคำสั่ง การตีความระบุคำสั่ง bytecode และเรียกใช้คำสั่งเนทีฟที่เทียบเท่า

ลำดับคำสั่ง bytecode บางลำดับจะรันบ่อยกว่าลำดับอื่น ๆ เมื่อล่ามตรวจพบสถานการณ์นี้คอมไพเลอร์ just-in-time (JIT) ของ JVM จะคอมไพล์ลำดับ bytecode กับโค้ดเนทีฟเพื่อการดำเนินการที่เร็วขึ้น

ในระหว่างการดำเนินการโดยทั่วไปล่ามจะพบคำขอเพื่อเรียกใช้งาน bytecode ของไฟล์คลาสอื่น (ซึ่งเป็นของโปรแกรมหรือไลบรารี) เมื่อสิ่งนี้เกิดขึ้น classloader จะโหลดไฟล์คลาสและตัวตรวจสอบ bytecode จะตรวจสอบไบต์โค้ดของไฟล์คลาสที่โหลดก่อนที่จะดำเนินการ นอกจากนี้ในระหว่างการดำเนินการคำสั่ง bytecode อาจร้องขอให้ JVM เปิดไฟล์แสดงบางสิ่งบนหน้าจอส่งเสียงหรือทำงานอื่นที่ต้องใช้ความร่วมมือกับแพลตฟอร์มเนทีฟ JVM ตอบสนองโดยใช้เทคโนโลยีบริดจ์ Java Native Interface (JNI) เพื่อโต้ตอบกับแพลตฟอร์มเนทีฟเพื่อดำเนินงาน