การประกาศตัวแปรในภาษาจาวาเราต้องกำหนดชนิดข้อมูลให้กับตัวแปรเพื่อจองพื้นที่ในหน่วยความจำให้เหมาะสมกับข้อมูล ชนิดข้อมูลจะมี 2 ชนิดคือ primitive data type หรือเรียกว่า value type และ reference data type หรือเรียกว่า reference type โดย primitive data type เป็นชนิดข้อมูลพื้นฐานที่ภาษาจาวา (core java) มีมาให้เราใช้งาน ส่วน reference data type จะหมายถึงคลาสที่มีใน Java API และรวมถึงคลาสที่เราสร้างขึ้นมาเองภายหลังด้วย เรามองคลาสเป็นชนิดข้อมูลแบบหนึ่งเพื่อให้ง่ายต่อการทำความเข้าใจในการใช้งาน
ข้อแตกต่างระหว่างชนิดข้อมูลทั้ง 2 ชนิดคือวิธีการที่ตัวแปรชี้ไปยังพื้นที่เก็บข้อมูลในหน่วยความจำของเครื่องคอมพิวเตอร์ โดยตัวแปรที่มีชนิดข้อมูลแบบ primitive data type จะชี้ไปยังพื้นที่ในหน่วยความจำที่เก็บข้อมูลโดยตรง ส่วนตัวแปรที่มีชนิดข้อมูลแบบ reference data type จะชี้ไปยังพื้นที่ในหน่วยความจำซึ่งจะเก็บตำแหน่งของพื้นที่ในหน่วยความจำที่เก็บข้อมูลจริงๆอีกทีหนึ่ง
Primitive Data Type
ชนิดข้อมูลแบบ primitive data type เป็นชนิดข้อมูลพื้นฐานในภาษาจาวา (core java) ประกอบด้วยชนิดข้อมูลแบบ boolean byte char short int long float double แต่เฉพาะชนิดข้อมูลแบบ boolean integer และ double เท่านั้นที่ถูกใช้บ่อยๆ
ชนิดข้อมูลแบบ boolean เป็นข้อมูลตรรกะคือมีค่าเป็นจริง (true) หรือเป็นเท็จ (false) เท่านั้น ตัวแปรที่มีชนิดข้อมูลแบบ boolean มักจะถูกใช้ในการเก็บสถานะเพื่อใช้ในการตรวจสอบก่อนดำเนินการของประโยคคำสั่งแบบมีเงื่อนไข เช่น ใช้ในการตรวจสอบก่อนดำเนินการของคำสั่ง if
จากตัวอย่างด้านล่าง เราประกาศตัวแปร myTrueValue และ myFalseValue เป็นตัวแปรที่มีชนิดข้อมูลแบบ boolean โดยเก็บค่า true และ false ตามลำดับ จากนั้นตรวจสอบว่า myTrueValue เป็นจริงถึงจะพิมพ์ข้อความที่กำหนด
ชนิดข้อมูลแบบ byte คือข้อมูลเลขจำนวนเต็มที่ใช้หน่วยความจำขนาดขนาด 8 บิตในการเก็บข้อมูล
ชนิดข้อมูลแบบ short คือข้อมูลเลขจำนวนเต็มที่ใช้หน่วยความจำขนาดขนาด 16 บิตในการเก็บข้อมูล
ชนิดข้อมูลแบบ int (integer) คือข้อมูลเลขจำนวนเต็มที่ใช้หน่วยความจำขนาดขนาด 32 บิตในการเก็บข้อมูล
ชนิดข้อมูลแบบ long คือข้อมูลเลขจำนวนเต็มที่ใช้หน่วยความจำขนาดขนาด 64 บิตในการเก็บข้อมูล
เลขจำนวนเต็มสูงสุดและเลขจำนวนเต็มต่ำสุดที่สามารถเก็บได้สำหรับแต่ละชนิดข้อมูล byte short int และ long ดูได้จากตัวอย่างโปรแกรมด้านล่าง
เนื่องจากภาษาจาวาจะมองเลขจำนวนเต็มเป็นชนิดข้อมูลแบบ int เสมอ ดังนั้นในกรณีที่ประกาศตัวแปรด้วยชนิดข้อมูลแบบ long เลขจำนวนเต็มที่จะกำหนดให้กับตัวแปรจะต้องกำกับด้วยอักษร L ต่อท้ายข้อมูลเสมอเพื่อบอกว่าเลขจำนวนเต็มดังกล่าวเป็นชนิดข้อมูลแบบ long เช่นเดียวกัน ไม่เช่นนั้นโปรแกรม IntelliJ IDEA จะแสดงข้อผิดพลาดว่าเราพยายามกำหนดชนิดข้อมูลแบบ int ให้กับตัวแปรที่เป็นชนิดข้อมูลแบบ long
ชนิดข้อมูลแบบ float คือข้อมูลเลขจำนวนจริงที่ใช้หน่วยความจำขนาดขนาด 32 บิตในการเก็บข้อมูล
ชนิดข้อมูลแบบ double คือข้อมูลเลขจำนวนจริงที่ใช้หน่วยความจำขนาดขนาด 64 บิตในการเก็บข้อมูล
เนื่องจากภาษาจาวาจะมองเลขจำนวนจริงเป็นชนิดข้อมูลแบบ double เสมอ ดังนั้นในกรณีที่ประกาศตัวแปรด้วยชนิดข้อมูลแบบ float เลขจำนวนจริงที่จะกำหนดให้กับตัวแปรจะต้องกำกับด้วยอักษร F ต่อท้ายข้อมูลเสมอเพื่อบอกว่าเลขจำนวนจริงดังกล่าวเป็นชนิดข้อมูลแบบ float เช่นเดียวกัน ไม่เช่นนั้นโปรแกรม IntelliJ IDEA จะแสดงข้อผิดพลาดว่าเราพยายามกำหนดชนิดข้อมูลแบบ double ให้กับตัวแปรที่เป็นชนิดข้อมูลแบบ float
เนื่องจากขนาดของพื้นที่ที่ใช้เก็บข้อมูลของชนิดข้อมูลแบบ double มีมากกว่าชนิดข้อมูลแบบ float ดังนั้นค่าที่ได้จะมีความแม่นยำมากกว่า แต่ถึงกระนั้นหากเราต้องการคำนวนค่าอะไรก็ตามที่ต้องการความแม่นยำมากๆ เช่น การคำนวนทางวิทยาศาสตร์ หรือ การคำนวนอัตราแลกเปลี่ยนเงินตรา เราจะใช้ชนิดข้อมูลแบบ BigDecimal ซึ่งมีความแม่นยำมากกว่า โดยชนิดข้อมูลแบบ BigDecimal จะมีขนาดของการเก็บข้อมูลที่ไม่จำกัด เรียกได้ว่าขึ้นอยู่กับขนาดของหน่วยความจำของเครื่องคอมพิวเตอร์ก็ว่าได้ BigDecimal เป็นคลาสที่มีอยู่ใน Java API

ชนิดข้อมูลแบบ char (ย่อมาจาก character) คือข้อมูลชนิดตัวอักษรมีขนาด 16 บิต เพื่อเก็บตัวอักษรด้วยรหัส unicode เราสามารถดูรหัสตัวอักษรได้จาก http://www.unicode-table.com จากตัวอย่างด้านล่างจะเห็นว่าเราสามารถกำหนดข้อมูลได้ทั้งในแบบตัวอักษรและรหัส unicode โดยจะต้องอยู่ในเครื่องหมาย ‘ ‘ เสมอ
ในการหาจำนวนต่ำสุดและจำนวนสูงสุดที่ชนิดข้อมูลแต่ละแบบสามารถรองรับได้ เราสามารถเรียกดูข้อมูลดังกล่าวได้จากฟิลด์แบบ static
ของ Wrapper Class ของชนิดข้อมูลแต่ละแบบ เช่น ชนิดข้อมูลแบบ int จะเรียกใช้ฟิลด์แบบ static จาก Wrapper Class Integer คือ Integer.MAX_VALUE และ Integer.MIN_VALUE
ภาษาจาวามี Wrapper Class มาให้ใน Java API ซึ่งมีเมธอดที่หลากหลายให้เราใช้จัดการกับชนิดข้อมูลที่เป็น primitive data type เราสามารถดูว่า Wrapper Class ของแต่ละชนิดข้อมูลมีตัวแปรหรือเมธอดอะไรให้ใช้บ้างได้ง่ายๆโดยดูจากรายการที่แสดงให้เราเลือกตอนคีย์คำสั่งตามตัวอย่างด้านล่าง
และหากเราชี้เมาส์ไปที่คำว่า Integer จะแสดงรายละเอียดของคลาส Integer ขึ้นมา
สำหรับชนิดข้อมูลแบบ byte short int long ค่าที่เราเก็บมักจะเป็นข้อมูลในระบบเลขฐานสิบคือประกอบด้วยเลข 0-9 ในกรณีที่เราต้องการเก็บข้อมูลในระบบเลขฐานสิบหกคือประกอบด้วยและ 0-9 และ A-F (ตัวอักษรใหญ่หรือเล็กก็ได้) จะต้องนำหน้าข้อมูลด้วย 0x เช่น int hexNumber = 0x1F ในกรณีที่เราต้องการเก็บข้อมูลในระบบเลขฐานแปดคือประกอบด้วยและ 0-7 จะต้องนำหน้าข้อมูลด้วย 0 ในกรณีที่เราต้องการเก็บข้อมูลในระบบเลขฐานสองคือประกอบด้วย 0-1 จะต้องนำหน้าข้อมูลด้วย 0b เราสามารถเก็บข้อมูลในรูปแบบเดียวกันนี้สำหรับชนิดข้อมูลแบบ char ซึ่งจะหมายถึงตัวอักษรตามค่าในตาราง unicode ที่ตรงกับค่านั้นๆ
การแปลงชนิดข้อมูลด้วยการ casting
ในกรณีที่ตัวข้อมูลมีชนิดข้อมูลแตกต่างจากชนิดข้อมูลของตัวแปร เราจะต้องแปลงชนิดข้อมูลของตัวข้อมูลให้ตรงกับชนิดข้อมูลของตัวแปรเสียก่อนจึงจะสามารถเก็บข้อมูลในตัวแปรได้ ตัวอย่างเช่น เราประกาศให้ตัวแปร myInt เป็นชนิดข้อมูลแบบ int และเราเอาตัวแปร myInt ไปคำนวนเพื่อเอาผลลัพธ์ไปเก็บในตัวแปร myShort ซึ่งเป็นชนิดข้อมูลแบบ short จะเห็นว่า IntelliJ IDEA จะแสดงข้อผิดพลาดว่าข้อมูลของเราเป็นชนิดข้อมูลแบบ int แต่ตัวแปรต้องการชนิดข้อมูลแบบ short
เราสามารถแก้ไขปัญหานี้โดยการแปลงชนิดข้อมูลจาก int เป็น short ได้ด้วยการเติม (short) ดังตัวอย่างด้านล่าง ซึ่งวิธีการนี้เราเรียกว่าการคาสติ้ง (casting) จะเห็นว่าการคาสติ้งคือการเอาชนิดข้อมูลที่ต้องการมากำหนดไว้หน้าสุดของนิพจน์นั่นเองโดยรูปแบบคือ (ชนิดข้อมูล) ในกรณีที่นิพจน์เรามีความซับซ้อนให้ครอบนิพจน์ทั้งหมดด้วยวงเล็บ เช่น (short) ((a+b)/(d+c)) ไม่เช่นนั้นเฉพาะตัวแปรหรือวงเล็บที่ติดกับคาสติ้งเท่านั้นที่จะถูกดำเนินการ
ตัวอย่างด้านล่างเป็นการคาสติ้งด้วยชนิดข้อมูลที่เป็นตัวเลขแบบอื่นๆ
Reference Data Type
ที่ผ่านมาเราพูดถึง primitive data type ซึ่งเป็นข้อมูลพื้นฐานที่ภาษาจาวามีมาให้และ primitive data type ไม่ได้เป็นคลาสแต่อยู่ในแก่นของภาษาจาวา (core java) แต่ข้อมูลชนิด reference data type นั้นจะหมายถึงคลาสที่มีอยู่ใน Java API และรวมถึงคลาสที่เราเขียนขึ้นมา ตัวอย่างของ reference data type ที่ใช้งานง่ายและเราจะคุ้นเคยเป็นอย่างมากจนกระทั่งคิดว่าเป็นข้อมูลพื้นฐานของภาษาจาวาคือคลาส String
คลาส String ถูกออกแบบให้ใช้งานได้ง่ายเหมือนกับการใช้งาน primitive data type เช่น ไม่ต้องสร้างออบเจกต์ขึ้นมาเพื่อใช้งานแต่ใช้วิธีประกาศตัวแปรแล้วกำหนดค่าให้กับตัวแปรได้เลย และยังมีเมธอดมากมายให้เราดำเนินการกับข้อความ เช่น เราสามารถใช้เครื่องหมาย + ในการเชื่อมต่อข้อความกับตัวเลขได้โดยที่ไม่ต้องทำอะไรเป็นพิเศษ เพราะการจัดการเรื่องการแปลงชนิดข้อมูล (casting) จากตัวเลขเป็นชนิดข้อมูล String แล้วเอาไปต่อกับข้อความเดิมถูกเขียนเป็นเมธอดไว้ในคลาส String แล้ว
เรามองคลาสเป็นชนิดข้อมูลแบบหนึ่ง รูปแบบการเรียกใช้งานจะเหมือนกับการเรียกใช้งานชนิดข้อมูลแบบ primitive data type ดังตัวอย่างด้านล่างเราสร้างคลาส Car และสร้างออบเจกต์จากคลาส Car โดยประโยคคำสั่งในการสร้างออบเจกต์จะมีรูปแบบดังนี้
ชื่อคลาส ตัวแปร = new ชื่อคลาส();
จะเห็นว่าตำแหน่งของ ชื่อคลาส ที่ต้นประโยคคำสั่งในการสร้างออบเจกต์ ทำหน้าที่เหมือนกับการบอกชนิดข้อมูลให้กับตัวแปร โดยที่นิพจน์ที่ประกอบด้วยคีย์เวิร์ด new และเมธอดคอนสตรัคเตอร์ ชื่อคลาส() จะสร้างออบเจกต์ขึ้นมาแล้วเอาไปเก็บไว้ที่ ตัวแปร
Wrapper Class
Wrapper Class คือคลาสใน Java API ที่เราสามารถใช้ดำเนินการกับชนิดข้อมูลแบบ primitive data type ได้เช่นเดียวกับการใช้งานคลาสคือมีเมธอดให้เรียกใช้งานเพื่อให้ได้ผลลัพธ์ในแบบต่างๆ เช่น แปลงชนิดข้อมูล แปลงรูปแบบของข้อมูล แก้ไขข้อมูลในแบบต่างๆ เป็นต้น
Wrapper Class จะมีชื่อเดียวกับชนิดข้อมูลแบบ primitive data type แต่ขึ้นต้นด้วยตัวอักษรใหญ่ เช่น Wrapper Class ของชนิดข้อมูลแบบ int คือคลาส Integer หรือ Wrapper Class ของชนิดข้อมูลแบบ double คือคลาส Double เป็นต้น
Wrapper Class มีเมธอดหลายๆเมธอดให้เลือกใช้เพื่อจัดการกับข้อมูล เช่น หากเรามีข้อมูลตัวเลขในรูปแบบของชนิดข้อมูลแบบ String และเราต้องการเอามาคำนวน เราจะต้องแปลงชนิดข้อมูลดังกล่าวก่อน ซึ่งเราไม่สามารถทำได้กับชนิดข้อมูลแบบ primitive data type แต่เราสามารถใช้ Wrapper Class ดำเนินการได้ การเรียกใช้ Wrapper Class เหมือนการกำหนดให้ข้อมูลแบบ primitive data type เป็นพารามิเตอร์ของ Wrapper Class และเราจะดำเนินการกับฟิลด์ด้วยเมธอดของ Wrapper Class
จากตัวอย่างด้านล่าง เราประกาศตัวแปร year เป็นชนิดข้อมูลแบบ String และเก็บค่า 1990 หากเราต้องการเอาข้อมูล 1990 ซึ่งเป็นชนิดข้อมูลแบบ String มาคำนวน เราจะต้องแปลงข้อมูลมาเป็นชนิดข้อมูลแบบ int ก่อนด้วยเมธอด parseInt() ของคลาส Integer และเราต้องแปลงข้อมูลกลับมาเป็นชนิดข้อมูลแบบ String อีกครั้งด้วยเมธอด value0f() ของคลาส String
เมธอดในคลาสจะมีทั้งแบบที่ต้องสร้างออบเจกต์ขึ้นมาก่อนถึงจะเรียกใช้งานได้และแบบที่สามารถเรียกใช้งานได้เลย ซึ่งใน Wrapper Class ก็เช่นเดียวกัน เมธอดที่สามารถใช้ได้โดยตรงกับตัวแปรที่เป็น primitive data type โดยที่ไม่ต้องสร้างออบเจกต์ขึ้นมาก่อนเราเรียกเมธอดแบบนี้ว่า static method วิธีการใช้งานคืออ้างอิงชื่อคลาสและเมธอดที่ต้องการใช้ เช่น ชื่อคลาส.ชื่อเมธอด() สำหรับเมธอดที่ต้องสร้างออบเจกต์ขึ้นมาก่อนเราเรียกว่า instance method วิธีการใช้คือสร้างออบเจกต์มาเก็บไว้ที่ตัวแปรแล้วอ้างอิงชื่อตัวแปรและเมธอดที่ต้องการใช้ เช่น ชื่อตัวแปร.ชื่อเมธอด() ถ้าเราเข้าไปดูรายละเอียดของเมธอดจากเว็บ Java API Document ของ Oracle เราสามารถเลือกได้ว่าจะดูเมธอดทั้งหมด หรือดูเฉพาะ static method หรือ instance method ก็ได้
ชนิดข้อมูลแบบ enum
enum เป็นคลาสแบบพิเศษที่เป็นตัวแทนของกลุ่มตัวแปรแบบคอนแสตนท์ (constant) จากตัวอย่างด้านล่างในบรรทัดที่ 5-9 เราสามารถกำหนดชนิดข้อมูลแบบ enum ได้โดยใช้คีย์เวิร์ด enum ตามด้วยตั้งชื่อชนิดข้อมูลที่ต้องการ เช่น ตัวอย่างในบรรทัดที่ 5 เราตั้งชื่อชนิดข้อมูลว่า MyEnumType โดยข้อมูลที่เรากำหนดนิยมให้เป็นตัวอักษรใหญ่ตามตัวอย่างในบรรทัดที่ 6-8
ในการใช้งานเราจะประกาศตัวแปรด้วยชนิดข้อมูลแบบ enum ที่ตั้งชื่อไว้และอ้างถึงข้อมูลด้วยรูปแบบ ชนิดข้อมูลแบบ enum.ข้อมูล ตามตัวอย่างในบรรทัดที่ 12 เราสามารถใช้เมธอด values เพื่อแสดงค่าทั้งหมดที่กำหนดไว้ในรูปแบบอาเรย์ตามตัวอย่างในบรรทัดที่ 16-18