ผมเปลี่ยนจาก C# มาใช้ Java มาสักระยะแล้ว ผมอยากจะสรุปสิ่งที่ผมคิดว่าเป็นความแตกต่างระหว่าง Syntax ของ Java และ C# ครับ ถ้าคุณมีความเห็นแตกต่างออกไป ผมอยากจะถามทุกคนครับ เมื่อ Haihan เรียน Java เป็นครั้งแรก เขารู้สึกว่าไวยากรณ์ใกล้เคียงกับของ C# โดยประมาณ (ฉันควรจะบอกว่า C# ประมาณเหมือนกับ Java หลังจากนั้น C# ของ Microsoft ก็จงใจเลียนแบบพฤติกรรมทางไวยากรณ์ของ Java)
Bill Gates เคยกล่าวไว้ว่า "Java เป็นภาษาโปรแกรมที่โดดเด่นที่สุด"
ใกล้บ้านมากขึ้น เรามาสำรวจความแตกต่างทางไวยากรณ์ระหว่าง Java และ C# กันดีกว่า - -
1. เนมสเปซและแพ็คเกจ
เพื่อจัดระเบียบคลาสที่ใช้ฟังก์ชันที่คล้ายกันร่วมกัน C# แนะนำแนวคิดของเนมสเปซ (เนมสเปซ)
สิ่งที่เทียบเท่ากันใน Java เรียกว่าแพ็คเกจ
2. ความแตกต่างในการควบคุมการเข้าถึงคลาส
C# มีเพียงสองประเภท: สาธารณะและค่าเริ่มต้น (เหมือนกับภายใน)
public สามารถเข้าถึงได้โดยทุกคลาส (ในโปรเจ็กต์เดียวกันและในโปรเจ็กต์ต่างกัน)
ภายใน (ค่าเริ่มต้นเป็นภายในเมื่อไม่มีการเพิ่มอักขระควบคุมก่อนคีย์เวิร์ดคลาส) บ่งชี้ว่าคลาสสามารถเข้าถึงได้ในโปรเจ็กต์เดียวกันเท่านั้น
Java มีสองประเภทเท่านั้น: สาธารณะและค่าเริ่มต้น
public สามารถเข้าถึงได้โดยทุกคลาส โดยค่าเริ่มต้น (เมื่อไม่มีการเพิ่มอักขระควบคุมก่อนคีย์เวิร์ดของคลาส) คลาสทั้งหมดจะสามารถเข้าถึงได้ในแพ็คเกจเดียวกันเท่านั้น
3. การควบคุมการเข้าถึงของสมาชิกชั้นเรียน
C# มีสี่ประเภท: สาธารณะ, ป้องกัน, ส่วนตัว (ค่าเริ่มต้น), ภายใน (โปรดทราบว่าภายในและค่าเริ่มต้นจะแตกต่างกันที่นี่)
สาธารณะสามารถเข้าถึงได้โดยทุกชั้นเรียน
protected สามารถเข้าถึงได้โดยคลาสย่อยเท่านั้น
ส่วนตัว (นั่นคือ โดยค่าเริ่มต้นเมื่อไม่มีการเขียนอักขระควบคุม) สามารถเข้าถึงได้ภายในคลาสเท่านั้น
ภายในสามารถเข้าถึงได้โดยคลาสในโปรเจ็กต์เดียวกัน
Java ยังมีสี่ประเภท: สาธารณะ, ได้รับการป้องกัน, ส่วนตัวและค่าเริ่มต้น
สาธารณะสามารถเข้าถึงได้โดยทุกชั้นเรียน
protected สามารถเข้าถึงได้โดยคลาสอื่นในแพ็คเกจเดียวกันหรือโดยคลาสย่อยในแพ็คเกจที่ต่างกัน
ไพรเวทสามารถใช้ได้ภายในคลาสเท่านั้น และสามารถเข้าถึงได้โดยคลาสอื่นในแพ็คเกจนี้ตามค่าเริ่มต้น หากคลาสย่อยและคลาสพาเรนต์อยู่ในแพ็คเกจที่แตกต่างกัน คลาสย่อยจะไม่สามารถเข้าถึงสมาชิกควบคุมการเข้าถึงเริ่มต้นในคลาสพาเรนต์ได้
4. การสืบทอดคลาสใน C# ถูกนำมาใช้ผ่านโคลอน: และส่วนขยายถูกใช้ใน Java
อินเทอร์เฟซถูกนำไปใช้ผ่านโคลอน: ใน C# และนำไปใช้ใน Java
คลาสที่ปิดผนึกจะถูกนำไปใช้โดยใช้การปิดผนึกใน C# และสุดท้ายใน Java
ค่าคงที่ถูกนำมาใช้เป็น const ใน C# และสุดท้ายใน Java
คุณสมบัติใน C# ถูกนำมาใช้โดยใช้บล็อกโค้ด set และ get
มีแนวคิดเกี่ยวกับคลาสบางส่วนใน C# แต่ไม่ใช่ใน Java
มีแอตทริบิวต์ที่แก้ไขแบบอ่านอย่างเดียวใน C# ที่เป็นแบบอ่านอย่างเดียว แต่ไม่ใช่ใน Java
มีเมธอดเสมือนจริงและเมธอดที่ถูกแก้ไขและเมธอดที่ถูกแทนที่ใน C# แต่ไม่ใช่ใน Java เมธอดในคลาสพาเรนต์เริ่มต้นใน Java นั้นเป็นเสมือนทั้งหมด
มีแนวคิดเกี่ยวกับบล็อกโค้ดแบบคงที่{} และซิงโครไนซ์{}ใน Java แต่ไม่ใช่ใน C#
มีแนวคิดของป้ายกำกับ (เช่น labelA:) ใน Java แต่ไม่ใช่ใน C#
ใน C# คลาสย่อยจะใช้ base.method() เพื่อเรียกเมธอดของคลาสพาเรนต์ และใน Java จะใช้ super.method()
ใน C# ใช้เพื่อพิจารณาว่าอินสแตนซ์เป็นของคลาสใดคลาสหนึ่งหรือไม่ และใน Java จะใช้ instanceof
ใน C# จะใช้ foreach(int i in array) เพื่อสำรวจแต่ละองค์ประกอบในอาร์เรย์ และใน Java จะใช้ for(int i : array)