นี่ก็เป็นบทความแรกของผมที่ลงใน gotoknow.org นะครับ ความรู้ทาง Java Programming จากประัสบการณ์ทำงานของผมซึ่งพบว่าพื้นฐานเป็นสิ่งสำคัญมากแม้หลายคนอาจจะบ่นว่า Java เป็นภาษาที่ยากนั่นเป็นเพราะเค้าไม่ยอมเสียเวลาที่จะศึกษาพื้นฐานทางภาษาให้ดีทำให้เมื่อไปทำงานร่วมกับคนที่มีประสบการณ์มากกว่าหรือจะขยับไปใช้ Technologies ใหม่ทำให้ทำได้ลำบาก ซึ่งผมจะทะยอยลงบทความเหล่านี้แบบกระัชับครับ
1. โครงสร้างภาษาของ Java
- Java Architechture
- การประกาศ Class การสร้าง instances, Data Types, and references
- Constants, Static members, Method, this
- Scope, Expressions, Statement, Conditions และ Loop
- Package, Jar file, Classpath และ Modifiers
- Inner, Local และ Anonymous Class
- Inheritance, shadowing และ overriding.
- Constructor, Chaining และ super.
- Interface, Abstract และ Polymorphism
- Object, Generic และ Type Safe
- Implicit Classes เช่น VarArg และ Enum
- Exception Handling
- Annotation
2. Java API ที่ควรรู้
- String, StringBuilder และ StringTokenizer
- Math
- Wrapper Class
- Number และ NumberFormat
- Date และ DateFormat
- System และ Scanner
- Collection Framework
- Thread
- I/O Stream
- JDBC
- Logging
- XML โดย SAX และ DOM
3. Design Patterns
- Singleton
- Factory
- Observer
Java Architechture
Java นั้นไม่ใช่ pure Object Oriented อย่างที่หลายท่านเข้าใจนะครับซึ่งจะอธิบายในทีหลัง ทีนี้มาพูดกันว่า Java ถูกสร้างขึ้นมาในยุคที่ c/c++ กำลังเฟื่องฟู โดยจุดขายในตอนนั้นคือ Write Once, Run Anywhere และเป็น OOP (แต่ไม่ pure) โดยการเขียนโปรแกรมจะต้องใช้ jdk ซึ่งสามารถ download ได้ที่ http://www.java.com โดยจะมีเครื่องมือสำหรับพัฒนาโปรแกรมได้แก่ javac เอาไว้ compile source code ที่นามสกุล .java แล้วเราจะได้ไฟล์นามสกุล .class แต่การจะเอา java class file ไปทำงานนั้นก็ทำบน jre หรือผ่านทาง java command โดยที่หากเรามีหลาย class file เราสามารถ pack เป็น zip file ได้ซึ่งจะนามสกุล .jar
ตรงนี้แหละครับที่เป็นจุดขายหลักของ java เพราะว่ามี jre(หรือ jvm) รองรับ O/S แทบทุกยี่ห้อไม่ว่าจะเป็น Linux, Window 9x/XP/2000, AIX, BSD แม้กระทั่ง Mac จึงเป็นเรื่องที่น่าตื่นเต้นมากที่เราสามารถเอา class หรือ jar ไฟล์ที่ได้จากการ Compile บน O/S หนึ่งนำไปใช้บน O/S อื่นได้เลยโดยไม่ต้อง Compile ใหม่(แต่มีข้อแม้อยู่ว่า jre บน O/S ปลายทางนั้น version ต้องเท่ากันหรือใหม่กว่า)
แน่นอนว่าจุดขายของ Java ไม่ใช่ User Interface ที่สวยงามอาจจะค่อนข้างแย่ด้วยซ้ำแต่ Java เหมาะกับงานหลังบ้านมากกว่าเช่นเป็นตัวเชื่อมระบบที่หลากหลายภายในองค์กรซึ่งเราสามารถยกระดับ Application ของท่านหรือที่มีอยู่แล้วในองค์กรมาเป็น Web 2.0 ได้ เช่นการเชื่อมต่อกับ Facebook API ซึ่งแน่นอนว่าชาวโลกจะมีโอกาสสัมผัสกับงานของท่านได้อย่างแน่นอน
การประกาศ Class การสร้าง instances, Data Types, and references
การสร้าง class อันดับแรกให้เราสร้างไฟล์ A.java ขึ้นมา
จากนั้นประกาศ class ดังนี้
class A{
}
จากนั้นใช้คำสั่ง >>javac A.java เพื่อ Compile โปรแกรมของเรา
จะเห็นว่าเราได้ไฟล์ A.class เพิ่มขึ้นมา
ทีนี้ที่ไฟล์ A.java ลองเพิ่มดังนี้
class B {
}
จากนั้นทำเหมือนเดิมคือ Complie จะเห็นว่าเราจะได้ class สองตัวคือ A.class และ B.class
นี่เป็นวิธีการสร้าง class ที่ง่ายที่สุดนั่นเอง
คำถาม
- ถ้าเปลี่ยนชื่อ java source ไฟล์เป็น C.java จะสามารถ Compile ได้หรือไม่
ทีนี้เรามาดูโปรแกรมแรกคือ Hello World! ของเรากันเลย
โดย เพิ่ม main method เข้าไปดังนี้
class B {
public static void main(String[]args) {
System.out.println("Hello World!");
}
}
สังเกตุการประกาศ public static void main(String[]args) เป็นรูปแบบบังคับ
เพื่อเป็นเหมือนประตูทางเข้า ให้ jvm วิ่งเข้าไปทำงาน หลังจาก Compile ใหม่อีกครั้ง
เราสามารถเรียก >>java B เพื่อสั่งให้ class B ทำงาน
คำถาม
- จะเกิดอะไรขึ้นถ้าเรียก >>java A
- จะเกิดอะไรขึ้นหากเปลี่ยนเป็น public void main(String[]args)..
- จะเกิดอะไรขึ้นหากเปลี่ยนเป็น static public void main(String args[])..
- จะเกิดอะไรขึ้นหากแก้ไข code เป็น
class B {
public static void main(String[]args) {
System.out.println("Hello World!");
}
public static void main(String[]args) {
System.out.println("Hello World2!");
}
}
- จะเกิดอะไรขึ้นหากแก้ไข code เป็น
class A {
public static void main(String[]args) {
System.out.println("A:Hello World!");
}
}
class B {
public static void main(String[]args) {
System.out.println("B:Hello World!");
}
}
แล้วต้องการให้ class A ทำงาน
จากตัวอย่างข้างต้นยังแม้ยังไม่มีการสร้าง instance แต่ก็สามารถทำงานได้ แต่เรายังจำเป็นต้องสร้าง instance
เพื่อเป็นตัวแทนของข้อมูลในหน่วยความจำซึ่ง class ก็เหมือนเป็น Spec ในการผลิต instance นั่นเอง
แล้วทีนี้สิ่งที่จะเป็นตัวกำหนดว่าโปรแกรมเราควรมี class อะไรบ้างคือทักษะของการเขียนโปรแกรมของแต่ละคน
เช่นถ้าเราทำระบบ Stock สินค้าแน่นอนว่าเราควรต้องมี class Product เพื่อใช้แทนสินค้าแต่ละชิ้น นั่นคือ
ส่วนใหญ่เราจำลองมาจากระบบงานจริงๆนั่นเอง แต่เราอาจจำเป็นต้องมี class สำหรับการทำงานด้วยเช่น ProductManager เป็นต้น
Primitive Type
สิ่งนี้เองที่ทำให้ Java ไม่เป็น pure OOP แต่ก็จำเป็นต้องมี Data type เหล่านี้เพื่อเก็บข้อมูลพื้นฐานต่างๆ
โดยที่ jvm สามารถนำไปคำนวณได้อย่างรวดเร็ว
โดยแบ่งประเภทได้ดังนี้
จำนวนเต็ม byte, short, int, long
จำนวนจริง float, double
อักขระ char
และ boolean
เราสามารถประกาศให้เป็น Data member ได้ดังนี้
class Primitive {
byte b; //1 Bytes [-128,127]
short s; //2 Bytes [-32,768, 32,767]
int i; //4 Bytes [-2,147,483,648, 2,147,483,647]
long l;//8 Bytes [-9,223,372,036,854,775,808, 9,223,372,036,854,775,807]
float f;//4 Bytes
double d;//8 Bytes
char c; // 2 Bytes
boolean bl; // true/false
}
เราอาจกำหนดค่าให้ตั้งแต่ประกาศตัวแปรเช่น
byte b=0;
float f=0.1f;
double d=0.5d;
char c='a';
boolean x=true;
คำถาม
- หากเราไม่กำหนดค่าเริ่มต้นให้แก่ Data member ค่า default ของมันจะเป็นอะไรสำหรับ byte, char, float, double และ boolean
- ผลลัพท์ของโปรแกรมนี้คืออะไร
class A {
public static void main(String[]args) {
int a;
System.out.println(a*2);
}
}
- ผลลัพท์ของโปรแกรมนี้คืออะไร
class A {
public static void main(String[]args) {
int a;
a=3;
System.out.println(a*2);
}
}
เราสามารถนำชื่อเหล่านี้มาตั้งเป็นตัวแปร หรือ ชื่อ class ได้หรือไม่
| abstract |
assert |
boolean |
break |
byte |
| case |
catch |
char |
class |
const |
| continue |
default |
do |
double |
else |
| enum |
extends |
final |
finally |
float |
| for |
goto |
if |
implements |
import |
| instanceof |
int |
interface |
long |
native |
| new |
package |
private |
protected |
public |
| return |
short |
static |
strictfp |
super |
| switch |
synchronized |
this |
throw |
throws |
| transient |
try |
void |
volatile |
whil |
Object Types
class ทุก class ใน java จะถูก inherite มาจาก Object นั่นหมายถึงทุก class นั้นเป็น Object นั่นเอง
java api จะมี class String ให้เราใช้สำหรับเก็บข้อมูลที่เป็น String ยาวๆ เราสามารถประกาศได้ดังนี้
class B {
String text="hello";
A a = new A();
}
ความต่างระหว่าง Primitive Types กับ Object Types คือ Primitive Type
ตัวแปรจะเก็บค่าของข้อมูลนั้นขณะที่ Object Types ตัวแปรจะเก็บค่า address ของ instance นั้น
การสร้าง instance ของ class จะใช้ keyword new
ทุกๆ class ที่ไม่ใช่ String และ Wrapper class (อธิบายภายหลัง) จะต้องใช้ keyword new เท่านั้น
ในการสร้าง instance
class A {
int i;
String name;
}
class B {
public static void main(Strings[]args) {
A a = new A();
System.out.println(a);
System.out.println(a.i);
System.out.println(a.name);
}
}
จากตัวอย่างจะเห็นว่าเราใช้ . ในการอ้างถึงข้อมูลภายใน instance สังเกตุว่าผลลัพท์ที่ได้จะมี null ซึ่งหมายถึง reference ที่ไม่ได้อ้างอิงถึง address ใดๆ ซึ่ง null จะเป็นค่า default ของ reference ของ Data Member
Array
การประกาศ Array ของ Java ทำได้โดย
class A {
int[]i = new int[3];
int[]j = {1,2,3};
public static void main(String[]args) {
System.out.println(i.length);
System.out.println(j.length);
System.out.println(i[0]+","+i[1]+","+i[2]);
System.out.println(j[0]+","+j[1]+","+i[2]);
System.out.println(j[3]);
k[0] = new int[2];
}
}
จากตัวอย่างข้างต้นจะเห็นว่าค่า default ของ i[0] ถึง i[2] เป็น 0 และที่ statement สุดท้ายแสดง error ออกมาเมื่อพยายามอ้างอิงถึงตำแหน่งที่ไม่มีใน array
คำถาม
- จากตัวอย่างต่อไปนี้ คิดว่าผลลัพท์คืออะไร
class B {
public static void main(String[]args) {
String[]h = new String[3];
System.out.println(h[0]);
h[0] = "hello";
h[1] = new String("thanks");
System.out.println(h[0]+" "+h[1]+" "+h[2]);
}
Array หลายมิติ
เราสามารถประกาศ Array หลายมิติได้ดังนี้
int[][]k = new int[5][];
int[][]l = {{1,2,3},{4,5},{6}};
int[][][]m = new int[3][][];
int[][][]n = {
{
{0,1,2},
{0}
},
{
{0,1},
{0,1,3},
{0,1,2,3}
},
{
{0}
},
};
สอนพื้นฐาน Java
Line: wizarud
Gmail: [email protected]