เรียน Java เพื่อนำไปสร้าง Application ระดับโลก


นี่ก็เป็นบทความแรกของผมที่ลงใน 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}
                    },
                };



คำสำคัญ (Tags): #java#open source
หมายเลขบันทึก: 385495เขียนเมื่อ 17 สิงหาคม 2010 10:04 น. ()แก้ไขเมื่อ 22 พฤศจิกายน 2023 14:42 น. ()สัญญาอนุญาต: ครีเอทีฟคอมมอนส์แบบ แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกันจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท