เตรียมสอบจาวา SCJP 5.0
Home  Contents KMArticlesMembersSponsorsAbout us

ปรับปรุง : 2556-06-20 (ปรับ template)
ขอบซ้ายขอบบน
เตรียมสอบจาวา SCJP 5.0
SCJP 5.0 (CX-310-055) (details)

The Sun Certified Programmer for Java 2 Platform 5.0 certification exam is for programmers experienced using the Java programming language. Achieving this certification provides clear evidence that a programmer understands the basic syntax and structure of the Java programming language and can create Java technology applications that run on server and desktop systems using J2SE 5.0.
- Prerequisites: None
- Exam type: Choice + drag & drop
- Pass score: 59% (43of72 ques.)
- Time limit: 175 minutes

เอกสารประกอบการเตรียมสอบ
* เอกสารเตรียมสอบ 1.4 + ใบเซ็นชื่อเข้าติว
* PDF: 310-055 Demo (180Q&A?)
* PDF: Introduction to JAVA #1 2 3
* แนวข้อสอบ (Objectives) (CX-310-055)
+ API Docs ของ Sun
+ Java Glossary
+ ตัวอย่างข้อสอบ
+ Joshua Bloch & Neal Gafter (PDF)
+ Incheon Paik (PDF)
+ IBM Education (Video)
+ Fred Swartz's Java
+ Andrea Tartaro's Java
+ Top 10 Tips for Java's OO char.
+ กระทู้น่าอ่านเกี่ยวกับ testking
? กระดาษคำตอบ 74 ข้อ
ระยะทางหมื่นลี้ เริ่มที่ก้าวแรก
ถ้าพบอะไรผิดพลาด .. ช่วยชี้แนะด้วย
อยากให้ที่นี่เป็นก้าวแรกที่ดีสำหรับคุณ .. รวมทั้งตัวผมในการเตรียมสอบ SCJP 5.0
คำแนะนำ
-
การเตรียมตัวสอบ ควรมีตัวอย่างข้อสอบ พร้อมเฉลยที่สมบูรณ์ และน่าเชื่อถือ อย่างน้อย 150 ข้อ ต้องฝึกทำตามตัวอย่าง และจำเฉลยจากตัวอย่างเหล่านั้นให้ได้
การเข้า course ติวสอบ Certification จะช่วยให้สอบผ่านได้ค่อนข้างแน่นอน และประหยัดเวลาไปศึกษาด้วยตนเอง อย่างมหาศาล แต่ที่สำคัญหลังเข้า course แล้วควรกลับไปอ่านทบทวน และทดสอบกับเครื่อง เพราะข้อสอบอาจไม่เป็นไปดังคาด แต่ถ้าความเข้าใจชัดเจน ก็จะพบปัญหาน้อยลง
? กรณีผม : สอบ 10Aug Cert ถึงบ้าน 24Aug
+ ใบ้ให้ว่า .. testking ช่วยได้เยอะ .. มากมาก
+ Free SCJP Mock Exams
+ ลองทำแบบ Online 60 Questions
ปรับปรุง : 2550-08-10
เอกสารเตรียมสอบจาวา .. มีเพื่อขาย ($69.99)
+ Testking.com : Click 310-055
Questions & Answers have 180 Q&A
With the complete collection of 180 questions and answers Testking has assembled to take you through your 310-055 Exam preparation, you will cover every field and category helping to ready you for your successful Sun Certification. Each Q & A set will test your existing knowledge of Sun fundamentals, and is complemented by our Testing Engine.
+ Whizlabs.com : ลองดู 310-055 ($44.95)
+ UCertify.com : ลองดู 310-055 ($49.99)

Exam Objectives
: e-Book by Mikalai Zaikin
1. Declarations, Init. & Scoping 
2. Flow Control 
3. API Contents 
4. Concurrency 
5. OO Concepts 
6. Collections /Generics 
7. Fundamentals

แนะนำเว็บ (Web Guides)
JavaTM 2 Platform Standard Edition 5.0 API Specification

ตัวอย่างข้อสอบ SCJP 5.0 : javabeat.net
อ่านจาก http://java.sun.com/j2se/1.5.0/docs/api/
+ http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html
+ http://yn1.yonok.ac.th/burin/javadocs/api/java/lang/Thread.html
+ http://cs.fit.edu/man/java/api/java/lang/Thread.html
+ http://www-128.ibm.com/developerworks/java/library/j-forin.html ***
+ http://www.thaiitcertify.com

    1. Declarations, Initialization and Scoping
    Package
  1. ตัวอย่าง .java ที่กำหนดให้อยู่ใน package ชื่อ v1
    package v1;
    public class x { public static void main(String [] args) {}}
  2. ถ้าไม่กำหนด public ให้กับ class จะเรียกได้เฉพาะใน package เดียวกัน
  3. javac -d . x.java จะสร้างห้อง v1 เป็นชื่อ package และส่ง x.class เข้าไปในห้อง v1
  4. javac -d .. x.java จะสร้างห้อง v1 นอกห้องปัจจุบัน 1 ระดับ และเก็บแฟ้ม x.class ในห้องนั้น
  5. คำสั่ง compile package ใน package folder คือ ..\javac x.java จะได้ .class เก็บในห้องที่เก็บ .java
  6. ถ้าเขียน y.java เพื่อเรียกใช้ x.class ใน package ทำได้ 2 วิธี
    วิธีที่ 1 คือ v1.x myobj = new v1.x();
    วิธีที่ 2 คือ import v1.*; แล้วใช้ x a = new x();
  7. โดยปกติจะ import java.lang.* เข้ามาอัตโนมัติ จึงเรียกใช้ String, System, Wrapper, Object .. ได้ทันที
  8. การ import package จะไม่นำ sub-package เข้ามาด้วย ต้องทำ 2 รอบ
    import java.awt.*; และ import java.awt.event.*;
  9. กำหนด classpath ขณะประมวลผลด้วย java -cp c:\;.;d:\ x
    Data Types
  10. byte a = 5; หรือ byte a = 5 + 5; จะไม่ error
    แต่ a = a + 5; จะ compile error : posible loss of precision
  11. Compile error on (Integer)(12.6f) but will ok on (Integer)(int)(12.6f) // 12
  12. Compile ok on Byte a = 5 or Integer a = 5; but error on Double a = 5; ต้องใช้ new Double(5);
  13. casting กับการหารที่มีเศษ จะปัดเศษทิ้ง เช่น System.out.print(5/3); จะได้ผลเป็น int 1
    System.out.print(5/(double)3); ได้ผลเป็น 1.6666666666666667 มีตำแหน่งทศนิยมถึง 16 หลัก
    System.out.print((float)5/3); ได้ผลเป็น 1.6666666 มีตำแหน่งทศนิยมถึง 7 หลัก
    Static Member
  14. static จะถูก load หลัง load class ทันที และมีเพียงค่าเดียวในหน่วยความจำ ไม่ขึ้นกับจำนวน object ที่ถูกสร้าง
  15. static initializer หรือ static block ถูกเรียกมาใช้หลังโหลด static member เข้าสู่หน่วยความจำ
  16. static block กับ System.exit(0) ทำให้ main ไม่ถูกเรียกมาทำงาน
    class y {
    static { System.out.println(1);
    System.exit(0); }
    public static void main(String [] args) { System.out.println(2); } // not work
    }
  17. กำหนด System Property ให้ static เรียกใช้ได้ ด้วย java -Dtax=10 caltax
    ใน caltax.java เขียนว่า String tax = System.getProperty("tax");
  18. ตัวอย่างการใช้ static import ผลลัพธ์คือ 3.141592653589793
    import java.lang.Math;
    class x{
    public static void main(String[] args) { System.out.println(Math.PI);}
    }
    // import static java.lang.Math.*; ok
    import static java.lang.Math.PI;
    class x{ public static void main(String[] args) {
    System.out.println(PI);
    System.out.println(Math.PI);
    // System.out.println(lang.Math.PI); package lang does not exist
    } }
  19. ตัวแปรที่เป็น static instance จะมีเพียงค่าเดียวในการถูกอ้างอิง ทำให้ค่าของ i ต่างกับ j
    class y { static int i = 0; int j = 0; }
    class x{
    public static void main(String a[]){
    y y1 = new y(); y1.i++; y1.j++;
    System.out.println("" + y1.i + y1.j); // 11
    y y2 = new y(); y2.i++; y2.j++;
    System.out.println("" + y2.i + y2.j); // 21
    } }
  20. กำหนด import static ให้กับ System.out เพราะ out เป็น members ที่เป็น static
    //http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html พบว่า out เป็น static
    import static java.lang.System.*; // import static java.lang.System.out; ok
    class x {
    public static void main(String[] args) { out.println(5); }
    }
  21. local variable เป็น static ไม่ได้ เป็นได้เฉพาะ instance หรือ global variable
    static int a(){
    // static int b = 1; // compile error : illegal start of expression
    return 5; }
    Var Args
  22. method ที่กำหนดการรับค่าแบบ Var Args จะรับค่าได้ไม่จำกัด หรือไม่รับก็ได้
  23. กำหนดหลายตัวแปรใน Arguments ได้ แต่ต้องกำหนด Var Args เป็นตัวสุดท้าย และมี ... 3 จุด
  24. method หนึ่งมี Var Args ได้เพียง 1 ตัว เช่น void a(int b, int c, String... d) { }
    2. Flow Control
    try {} catch() {} finally {}
  25. finally จะทำงานทุกครั้ง แม้เข้าไปใน catch แต่จะไม่ทำถ้าพบ System.exit(0)
  26. แม้มี return ใน catch หรือ try ก็ยังต้องทำ finally ก่อนอยู่ดี
  27. ถ้าเขียน finally ก็จะต้องเขียนเป็นลำดับสุดท้าย
  28. finally {} หรือ catch() { } ต้องใช้คู่กับ try {}
  29. try {} ต้องคู่กับ finally {} หรือ catch() {} อย่างใดอย่างหนึ่ง
  30. ถ้าจับหลาย Exception ตัว Super ต้องอยู่ล่างสุด มิเช่นนั้น Compile ไม่ผ่าน
  31. Override โยน Exception ในตัว father ต้องแคบ แล้ว child กว้างกว่าได้ เช่นของ child โยน Exception
  32. try ต้องอยู่คู่กับ catch หรือ finally อย่างน้อย 1 ตัว
  33. ตัวอย่างการเกิด Exception ขณะ Runtime
    java.lang.ArrayIndexOutOfBounds ถ้า String a[] = new String[2]; System.out.println(a[3]);
    java.lang.NumberFormat ถ้า Integer a = new Integer("a"); System.out.println(a);
    java.lang.ArithmeticException: / by zero ถ้า System.out.println(5/0);
    java.lang.IllegalThreadState ถ้า start() เทรดไปแล้ว สั่ง Start อีกครั้งติดต่อกัน แต่ไม่มีปัญหาเรื่อง run() ซ้ำ
  34. class x { } compile ผ่าน แต่จะพบ Exception in thread "main" java.lang.NoSuchMethodError: main เมื่อ run
  35. เมื่อพบ java.lang.NullPointerException จะส่งกลับทันที ถ้า class ใด catch ไว้ ก็จะแสดงรายงานออกมา (แสดงเฉพาะ error1)
    class x3{ public void x3() { String x = null; System.out.println(x.length()); System.out.print("x3");} }
    class x2{ public void x2() { x3 a = new x3(); a.x3(); System.out.print("x2"); } }
    class x1{ public void x1() { x2 a = new x2(); a.x2(); System.out.print("x1"); } }
    class x{
    public static void main(String[] args) {
    try{
    x1 a = new x1();
    a.x1();
    System.out.print("x");
    }catch (Exception e){ System.out.print("error1"); }
    }
    }
  36. ถ้าคิดว่ามี error ใน method ก็ให้ throws Exception ไว้ เพื่อบังคับให้ตัวที่ไปเรียกเขา ต้อง catch exception ไว้ ถ้าไม่ catch จะ compile ไม่ผ่าน
    class x3{ public void x3() throws NullPointerException { String x = null; System.out.println(x.length()); System.out.print("x3");} }
    class x2{ public void x2() throws Exception { x3 a = new x3(); a.x3(); System.out.print("x2"); } }
    class x1{ public void x1() throws Exception { x2 a = new x2(); a.x2(); System.out.print("x1"); } }
    class x{
    public static void main(String[] args){
    try{ x1 a = new x1(); a.x1(); }
    catch (NullPointerException e){ System.out.print("error1"); } // บรรทัดนี้ทำงาน
    catch (Exception e){ System.out.print("error2"); }
    }
    }
  37. ถ้าคิดว่ามี error แต่ไม่เกิด ก็จะทำงานตามปกติ ผลลัพธ์คือ x3x2x1
    class x3{ public void x3() throws Exception { System.out.print("x3");} }
    class x2{ public void x2() throws Exception { x3 a = new x3(); a.x3(); System.out.print("x2"); } }
    class x1{ public void x1() throws Exception { x2 a = new x2(); a.x2(); System.out.print("x1"); } }
    class x{
    public static void main(String[] args){
    try{ x1 a = new x1(); a.x1(); }
    catch (NullPointerException e){ System.out.print("error1"); }
    catch (Exception e){ System.out.print("error2"); }
    }
    }
  38. การสั่งให้เกิด exception ใน constructor
    class x2{ x2() { throw new IllegalArgumentException("test"); } }
    class x1{ public void x1() throws Exception { x2 a = new x2(); } }
    class x{
    public static void main(String[] args){
    try{ x1 a = new x1(); a.x1(); }
    catch (NullPointerException e){ System.out.print("error1"); }
    catch (Exception e){ System.out.print("error2"); } // บรรทัดนี้ทำงาน
    }
    }
    3. API Contents
    String
  39. การใช้ String.format() แปลงแบบของข้อมูล มักมีปัญหาในส่วน runtime exception มิใช่ compile error
    System.out.printf("%,.2f",35000.5);
    System.out.format("%,.2f",35000.5);
    System.out.format("%,10.2f",35000.5); // _35,000.50
    System.out.format("%.2f",(double)3);
    // System.out.format("%10,.2f",35000.5); // java.util.UnknownFormatConversionException
    // System.out.format("%.2f",3); // java.util.IllegalFormatConversionException
    // System.out.format("%d",2.1); //java.util.IllegalFormatConversionException
    System.out.print( String.format("%,.2f",35000.5) ); // 35,000.50
  40. ค่าเหมือนกัน แต่ type ไม่เหมือนกัน เทียบกันไม่ได้
    String x = null; Integer y = null;
    // System.out.println(x==y); // compile error : incomparable types
    // System.out.println(x.equals(y)); // runtime error : java.lang.NullPointerException
    // System.out.println(x.equals(null)); // runtime error : java.lang.NullPointerException
    String a = "5"; Integer b = new Integer(a);
    System.out.println(a.equals(b)); // false
    System.out.println((new Integer(a)).equals(b)); // true
    // System.out.println(a==b); incomparable type
  41. การเปรียบเทียบวัตถุที่มีค่าเป็น null แสดงค่าจากวัตถุเป็น null ได้ แต่แสดงคำว่า null จะ compile error
    String x = null;
    if (x == null) { System.out.println(x); } // null
    if (null == null) { System.out.println(x); } // null
    // System.out.println(x.hashCode()); // runtime error : java.lang.NullPointerException
    // System.out.println(x.equals(null)); // runtime error : java.lang.NullPointerException
    // System.out.println(x.length()); // runtime error : java.lang.NullPointerException
    // System.out.println(null); // Compile error
  42. primitive กับ null ใช้ร่วมกันไม่ได้
    //char a = null; compile error
    //int x = null; compile error
  43. การใช้ charAt กับ String นอกขอบเขต จะพบ StringIndexOutOfBoundsException ใน runtime
    String x = "abcd";
    System.out.println(x.charAt(0)); // a
    System.out.println(x.charAt(1)); // b
    // System.out.println(x.charAt(4)); // java.lang.StringIndexOutOfBoundsException
  44. พิมพ์อักษร \n ก็ใช้ \ ตัวเดียว และการปรับรูปแบบการแสดงผลด้วย format
    System.out.println("1\n2\n3");
    System.out.format("1\n2\n3\n%2$d%1$.2f",5.2,4); ได้ตัวเลขละบรรทัด 4 บรรทัด (45.20)
    System.out.printf("1\n2\n3\n%d",4); ได้ตัวเลขละบรรทัด 4 บรรทัด
  45. ถ้าใช้ \ ให้ใช้ \\ เช่นการใช้ split มิเช่นนั้น compile ไม่ผ่านถ้าใช้ \s แทน \\s
    http://yn1.yonok.ac.th/burin/javadocs/api/java/util/regex/Pattern.html
    String[] y = "a b c d".split("\\s");
    System.out.println(y.length); // 4
  46. Predefined character
    \t The tab character ('\u0009')
    \n The newline (line feed) character ('\u000A')
    \r The carriage-return character ('\u000D')
    \f The form-feed character ('\u000C')
    \a The alert (bell) character ('\u0007')
    \e The escape character ('\u001B')
    \d A digit: [0-9]
    \D A non-digit: [^0-9]
    \s A whitespace character: [ \t\n\x0B\f\r]
    \S A non-whitespace character: [^\s]
    \w A word character: [a-zA-Z_0-9]
    \W A non-word character: [^\w]

    super & this
  47. constructor ต้องไม่เป็น private ถ้ามีการเรียกผ่าน subclass เพราะจะ compile error
  48. การใช้ constructor จะสร้าง super() บรรทัดแรกของ constructor อัตโนมัติ ทำให้เรียก constructor ของ super ก่อน
    class y{ public y(){ System.out.println("y"); } }
    class x extends y {
    static public void main(String[] args) { new x(); } // y
    }
  49. ถ้า super มี constructor ที่มี argument แต่ไม่มี default constructor ทำให้ subclass compile error เพราะเรียกหา default constructor ไม่พบ
  50. this() หรือ super() ต้องอยู่ใน constructor ที่ถูก overload ได้ และต้องเป็นบรรทัดแรก และต้องไม่อยู่คู่กัน 2 ตัว
  51. ถ้าเรียกใช้ super ที่ถูก overload แล้ว super() ก็จะไม่ทำงาน
    class y{
    public y(){ System.out.print("y"); }
    public y(int a){ System.out.print(a); }
    }
    class x extends y {
    x(){ this(6); System.out.print("x"); }
    x(int a){ super(7); System.out.print(a); }
    static public void main(String[] args) {
    new x(); new x(); new y(9);
    } // 76x 76x 9
    }
  52. ถ้าไม่มี super() หรือ this() ใน constructor ใดก็ตาม จะมีการเพิ่ม super() ให้อัตโนมัติ
    class y{ public y(){ System.out.print("y"); } }
    class x extends y {
    x(){ this(6); System.out.print("x"); }
    x(int a){ System.out.print(a); }
    static public void main(String[] args) { new x(); }
    } // y 6 x
  53. การเรียกใช้ this. และ super. ใน constructor ไม่จำเป็นต้องอยู่ในบรรทัดแรก และใช้ทั้งคู่พร้อมกันได้
    class father { static int x = 5; }
    class y extends father{
    static int x = 6;
    y() {
    super(); // ผลการเรียก constructor ในบรรทัดนี้ไม่ส่งผลใด ๆ
    System.out.println(super.x); // 5
    System.out.println(this.x); // 6
    }
    public static void main(String [] args) { new y(); }
    }
  54. การเรียกใช้ this. และ super. นอก constructor ต้องคำนึงเรื่อง static ให้มาก
    class y { int a = 6; }
    class x extends y {
    int a = 5;
    int b(){ return this.a + super.a; };
    void c() { System.out.println(b()); }
    static public void main(String[] args) { new x().c(); } // 11
    }
  55. การใช้ this กับ encapsulation
    class y{
    private int a;
    private String b;
    y(int a,String b){ this.a = a; this.b = b;}
    int id(){ return this.a;}
    String name(){ return this.b;}
    }
    public class x{
    int c = 2000;
    int salary(){ return this.c; }
    public static void main(String[] args) throws Exception{
    y o = new y(101,"thaiall");
    System.out.println(o.id() + o.name() + (new x().salary()));
    } }
    4. Concurrency

    thread
  56. wait()/notify()/notifyAll(): ต้องถูกเรียกจากใน synchronized context
  57. notify(): ปลุกให้เทรดเดียวที่คอยวัตถุอยู่ตื่น
  58. notifyAll(): ปลุกให้ทุกเทรดที่คอยวัตถุอยู่ตื่น
  59. yield(): ทำให้เทรดปัจจุบันหยุดชั่วคราว และอนุญาตให้เทรดอื่นประมวลผล ถ้าไม่มีตัวเองก็จะทำงานต่อตามปกติ
  60. wait(): บอกให้เทรดหยุดรอจนกว่าจะมีเทรดอื่นมาปลุกด้วย notify() หรือ notifyAll() ในอีกเทรดหนึ่ง
  61. wait(long timeout): บอกให้เทรดหยุดรอจนกว่าจะมีเทรดอื่นมาปลุก หรือครบตามเวลา
  62. sleep(): หลับอย่างน้อยเท่าช่วงเวลาหนึ่งที่กำหนด (least the time specified in the argument)
  63. join(): เทรดหนึ่งเข้าขัดบอกว่าขอทำก่อน และให้รอจนกว่าตนจะทำเสร็จ
  64. interrupt(): ขัดจังหวะไม่ให้ thread ทำงานต่อ คล้าย stop() suspend()
  65. sleep() ต้องส่ง milisecond เข้าไปมิเช่นนั้น compile error ต้องมี exception จับ หรือ throws ระดับ method
  66. wait() หรือ notify() หรือ join() ต้องมี exception จับ มิเช่นนั้น compile error
  67. yield() หรือ interrupt() ไม่ต้องมี exception จับก็ได้
  68. ถ้า start() ถ้าสั่ง process ใน run() อาจไม่ประมวลผลในทันที
  69. ถ้า run() เทรดจะทำงานจนจบ ไม่เหมือน start() ที่ทำให้เทรดทำงานหลายเทรดพร้อมกันได้
    Runner r = new Runner(); // และมี run() ใน Runner Class ที่ implements Runnable
    Thread t1 = new Thread(r); t1.start();
    Thread t2 = new Thread(r); t2.start();
    Thread t3 = new Thread(r); t3.start();
  70. ถ้า start() เทรดเดิมซ้ำ จะพบ java.lang.IllegalThreadStateException และยังคงมีเพียง Thread เดียวที่ประมวลผล
  71. การใช้ Thread.sleep() ต้องใช้ throw exception อาจใช้ตอนประกาศ method หรือใน method ก็ได้
  72. การ catch ต้องจับให้ตรง ถ้าใช้ sleep แล้วไปจับ IOException จะ compile ไม่ผ่าน
    เช่น try{ Thread.sleep(1000); } catch(Exception e) { }
    เช่น try{ Thread.sleep(1000); } catch(InterruptedException e) { }
  73. การสั่งให้ Thread ประมวลผลผ่าน runnable และหยุดการทำงานเมื่อพบ interrupt()
    class Runner implements Runnable {
    public void run(){
    byte b=0;
    try{ while(true) { System.out.print(b++); Thread.sleep(100); } }
    catch(Exception e){}
    }
    }
    class x{
    public static void main(String[] args) {
    Runner r = new Runner();
    Thread t = new Thread(r);
    t.start();
    try{ Thread.sleep(1000); }catch(Exception e){}
    // ก่อนเข้า interrupt Thread จะหยุดที่นี่ เมื่อพิมพ์เลข 10 ตัวแล้ว
    // 0123456789 แล้วเลิกการทำงาน
    t.interrupt();
    }
    }
  74. การสั่งให้ Thread ประมวลผลผ่าน Thread โดยตรง
    class x extends Thread{
    public void run(){ while(true) System.out.print("."); }
    public static void main(String[] args) {
    x t = new x();
    t.start();
    }
    }
  75. การสั่งให้ Thread ประมวลผลผ่าน Runnable แบบ Anonymous Inner Class
    class x{
    public static void main(String[] args) {
    x.go();
    //new x().go(); this line ok
    }
    static void go(){
    Runnable r = new Runnable() {
    public void run(){ while(true) System.out.print("."); }
    };
    Thread t = new Thread(r);
    t.start();
    }
    }
  76. การสั่งให้ Thread ประมวลผลผ่าน Thread แบบ Anonymous Inner Class
    class x{
    public static void main(String[] args) {
    new Thread() {
    public void run(){ while(true) System.out.print("."); }
    }.start();
    }
    }
  77. ถ้าสั่ง start() แล้วสั่งพิมพ์ข้อความ โดยปกติพิมพ์ข้อความจะถูกกระทำก่อนการทำงานใน run()
  78. แสดงการใช้ join ขัดจังหวะขอทำก่อนอย่างชัดเจน
    class Runner implements Runnable {
    public void run(){System.out.print("x");}
    }
    class x{
    public static void main(String[] args) throws Exception {
    Thread t = new Thread(new Runner());
    t.start();
    System.out.print("1");System.out.print("2");System.out.print("3");
    t.join(); // thread ขอทำก่อน จึงพิมพ์ x ก่อน 4 แน่ แต่อาจพิพม์ x ก่อนหรือหลัง 3 ก็ได้
    System.out.print("4");System.out.print("5");System.out.print("6");
    }
    }
    5. OO Concepts
    Overload & Override
  79. แสดงการ Overload และ Override ทั้ง method และ variable ที่เป็น static
    class y {
    static int a=5;
    static int b(){ return 0;} }
    class x extends y{
    static int a=6;
    // private static int b(){ return 1;} // can not assign weaker access privileges
    public static int b(){ return 1;} // override
    static int b(int a){ return a;} // overload
    protected static int b(int a, int b){ return a + b;} // overload
    // static String b(int a){ return "a";} // ผิดกฎ overload เพราะมี b(int a) แล้ว
    public static void main(String[] args) {
    System.out.println(b() + b(2) + b(3,4) + a); // 16
    } }
  80. ความสัมพันธ์ของ Override ที่กว้างกว่าด้วยลูก เช่น ประกาศพ่อแล้ว return ลูกได้
    class father { } // hide
    class child extends father { } //hide
    class boy { father money(){ return new father();} }
    class x extends boy {
    child money(){ return new child();}
    father money2(){ return new child();}
    }
    Polymorphism
  81. Overriding + Polymorphism จะเรียกว่า Virtual Method Invocation ซึ่งมีช่วง Compile Time และ Run time (Dynamic Binding)
    class father { public int work() { return 1; } }
    class child extends father { public int work() { return 2; } }
    father x = new child();
    System.out.println(x.work()); // 2 แต่ตอน compile เช็คจาก father
  82. Overriding + Polymorphism + variable จะมาจากแม่อย่างเดียว ไม่มาจากลูก
    class father { int a=1; }
    class child extends father { int a=2; }
    father xx = new child();
    System.out.println(xx.a); // 1
  83. กำหนดรับ Argument เป็น super จะรับของ subclass ได้เช่นกัน
    class father { int a(){return 1;} }
    class child extends father { int a(){return 2;} }
    xx(new father());
    xx(new child());
    static void xx (father f){ System.out.print(f.a()); } // 1 2
    Interface
  84. ใน interface มีได้เฉพาะ abstract method ที่เป็นแบบ public หรือ default เท่านั้น
  85. interface กำหนดค่าให้กับ instance variable ได้
  86. interface สามารถ extends interface ได้พร้อมกันหลาย interface
  87. interface สามารถถูก implements จาก class ได้พร้อมกันหลาย interface
  88. interface ไม่สามารถมี constructor หรือสร้าง object
  89. ถ้า class มี extends และ implements ต้องทำการ extends ก่อน
    6. Collections /Generics
    Generic (type safe)
  90. Generic ตรวจ Type Safe ในส่วนของ Compile ไม่ทำงานในส่วนของ Runtime
  91. ถ้า define หรือ new object มี <Object> กำหนดไม่ครบคู่ จะเป็น warning compile
    เช่น Set<Object> vals = new TreeSet<Object> ();
  92. When we use wildcard(?) to catch the collection , then modifications(add) are not allowed in that collection
  93. Can not compiled : Basket <?> b = new Basket <Apple>(); เพราะใช้ Wildcard ที่นี่ไม่ได้
  94. warning Compile เพราะไม่แน่ใจว่าส่ง Apple เข้าไปแล้ว จะไม่มีปัญหา
    Basket b = new Basket();
    b.addbasket(new Apple());
  95. Generic เป็น object เมื่อส่งค่าให้ method จึงส่งตำแหน่งของ Object ทำให้อ้างอิงถึง Object ที่ตำแหน่งเดิม
    import java.util.*;
    class x {
    public static void main(String [] args) {
    List<Object> samples = new ArrayList<Object>();
    samples.add(new Integer("1"));
    int y = 5;
    addList(samples,y);
    System.out.print(samples +""+ y); // 1 2 5
    }
    static void addList(List <Object> o, int n) {
    n = 6;
    o.add(new Integer("2"));
    }
    }
  96. method เมื่อรับ สามารถรับได้หลายแบบด้วย ? wildcard
    import java.util.*;
    class x {
    public static void main(String [] args) {
    List<Integer> l = new ArrayList<Integer>();
    l.add(new Integer("1"));
    l.add(new Integer("2"));
    prtList(l);
    }
    // ok static void prtList(List<? extends Object> o) {
    // ok static void prtList(List<? extends Integer> o) {
    // ok static void prtList(List<? super Integer> o) {
    // error static void prtList(List<? super Object> o) {
    // error static void prtList(List<Object> o) {
    static void prtList(List<Integer> o) { for(Object x:o)System.out.print(x); }
    }
  97. Generic ชี้ไป Generic ที่ type ต่างกันไม่ได้จะเกิด incompatible types เมื่อ Compile
    HashSet<String> hs1 = new HashSet<String>();
    hs1.add("test");
    HashSet hs2 = hs1; // no problem
    // HashSet<Object> hs3 = hs1; compile error
  98. ถ้าไม่ใช้ Generic จะพบ Compile warning
    ArrayList<String> l = new ArrayList<String>();
    l.add("123");
    for(Iterator i = l.iterator();i.hasNext();){ System.out.println(i.next()); }
    Collection
  99. List : sorted, can same (ArrayList, LinkedList, Vector:Thread-Safe)
  100. Set : unsorted, not same (HashSet, LinkedHashSet, TreeSet)
  101. Map : key sorted, key not same (HashMap, HashTable:Thread-Safe, LinkedHashMap, TreeMap)
  102. Collection ที่ควรรู้จักมี 10 Classes
    List: ArrayList: Fast iteration and fast random access
    List: Vector: Like a somewhat slower ArrayList, mainly due to its synchronized methods
    List: LinkedList: Good for adding elements to the ends, i.e., stacks and queues
    Set: HashSet: Assures no duplicates, provides no ordering
    Set: LinkedHashSet: No duplicates; iterates by insertion order or last accessed (new with 1.4)
    Set: TreeSet: No duplicates; iterates in natural sorted order
    Map: HashMap: Fastest updates (key/value pairs); allows one null key, many null values
    Map: HashTable: Like a slower HashMap (as with Vector, due to its synchronized methods). No null values or null keys allowed
    Map: LinkedHashMap: Faster iterations; iterates by insertion order or last accessed, allows one null key, many null values (new with 1.4)
    Map: TreeMap: A sorted map, in natural order
  103. การสร้าง และใช้ ArrayList ถ้า add จะพบ warning compile : unchecked or unsafe operations.
    ถ้าไม่ add จะไม่พบ error และถ้าเติม Generic Object จะรับแบบใดก็ได้
    ArrayList a = new ArrayList();
    a.add("a");
    a.add(new String("a"));
  104. ต้องกำหนดทั้ง ประกาศ และสร้างวัตถุ จึงจะไม่มี warning
    ArrayList<Object> a = new ArrayList<Object>();
    a.add(new String("aa"));
    a.add("bb");
    for(Object o:a) System.out.println(o.toString()); // aa bb
  105. Generic ของ Collection ต้องมี type แบบเดียวกัน ยกเว้นไม่กำหนด type
    ArrayList<Object> a = new ArrayList<Object>();
    ArrayList<String> b = a; // compile error : incompatible types
    ArrayList<String> c = new ArrayList<String>();
    ArrayList<Object> d = c; // compile error : incompatible types
    ArrayList<String> e = new ArrayList<String>();
    ArrayList<?> f = e;
    ArrayList<? extends String> g = e;
    ArrayList h = e;
    // ArrayList<? extends Integer> r = e; // compile error : incompatible types
    e.add("abc");
    System.out.println(g.get(0)); // abc
    ArrayList h = e;
  106. HashSet เป็นแม่ของ LinkedHashSet
    HashSet x = new LinkedHashSet(); x.add(new String("def")); x.add(new String("abc"));
    System.out.println(x); // [def, abc]
  107. Set เป็นแม่ของ TreeSet และจัดเรียงอัตโนมัติ
    Set x = new TreeSet(); x.add(new String("def")); x.add(new String("abc"));
    System.out.println(x); // [abc, def]
    enum
  108. ถ้ากำหนด enum นอก class จะกำหนด modifier ไม่ได้
  109. มี constructor ใน enum ได้ แต่มี modifier หน้า enum ที่เป็น constructor ไม่ได้
  110. enum นอก class กำหนด static ไม่ได้ แต่ใน class สามารถมี static หรือ public ได้
  111. การเขียน enum นอก class เมื่อ compile จะได้ .class สำหรับ enum ชื่อ enum จึงซ้ำชื่อ class ไม่ได้
    enum y{a,b,c}
    class x {
    static{
    System.out.println(y.a); // a
    System.exit(0);
    }}
  112. enum กำหนดนอก class หรือใน class หรือเป็น inner class ได้ แต่กำหนดใน method ไม่ได้
    class Outer {
    static enum OuterEnum { OUT, OUTTER; }
    static class Inner { enum InnerEnum { IN, INNER;} }
    }
  113. enum กับเครื่องหมาย ; If an enum declares only values in it, then semi-colon is optional. If an enum declares anyother thing with values then semi-colon at the end of declared values is mandatory (ผู้ได้รับมอบอำนาจ).
  114. ค่าที่เป็นไปได้ใน switch ต้องเป็นค่าตาม enum มิเช่นนั้นจะเกิด unqualified enumeration constant name เมื่อ compile
    enum a{a,b,c} ไว้นอก class
    a b= a.a;
    switch(b){ case d:; }
  115. enum + constructor + toString เพราะ enum ใน Class ก็เสมือน inner class จะได้ x$Shape.class
    public class x {
    enum Shape { CIRCLE("zero"), RECTANGLE("four") ,SQUARE("four") ,TRIANGLE("three");
    String sides;
    private Shape(String s) { sides = s; }
    public String toString() { return sides; }
    }
    public static void main(String[] args) { System.out.println(Shape.RECTANGLE); } // four
    }
    I/O
  116. ชุด 1 : FileReader, BufferedReader, .readLine
  117. ชุด 2 : FileWriter, BufferedWriter, .write, .close
  118. ชุด 3 : FileInputStream, ObjectInputStream, .readObject
  119. ชุด 4 : FileOutputStream, ObjectOuputStream, .writeObject, .close
  120. ถ้าไม่ import java.io.* ก็ต้องกำหนดเต็มหน้า Class เช่น IOException FileBuffer BufferedReader
  121. ใช้ Exception แทน IOException ได้ แต่ใช้ java.io.Exception ไมได้เพราะ Exception อยู่ใน java.lang
  122. การใช้ FileReader อ่านแฟ้ม
    import java.io.*;
    class x {
    public static void main(String[] args) throws IOException{
    FileReader f = new FileReader("x.java");
    BufferedReader b = new BufferedReader(f);
    String r = null;
    while ((r=b.readLine()) != null){ System.out.print(r); }
    }
    }
  123. การใช้ FileWriter เขียนลงแฟ้ม
    class x {
    public static void main(String[] args) throws java.io.IOException{
    java.io.FileWriter f = new java.io.FileWriter("xx.java");
    java.io.BufferedWriter b = new java.io.BufferedWriter(f);
    b.write("aa"+"\n"); b.write("aa"+"\n");
    b.close();
    }}
  124. การใช้ Scanner ต้อง import java.util.*;
  125. ถ้าไม่กำหนด s.useDelimiter(","); จะมองหา Space เช่น "a b c d"
    String m = "a b c d";
    Scanner s = new Scanner(m);
    s.useDelimiter(",");
    while(s.hasNext()) System.out.println(s.next());
  126. instance ที่เขียนลง Storage ต้องกำหนดเป็น Serializable โดย Class ต้อง implements Serializable
  127. primitive เป็น Serializable โดยอัตโนมัติ
  128. Object ที่ไม่สามารถกำหนดเป็น Serializable เช่น Thread, InputStream ให้เติม transient หน้าแบบของ Object
    private transient Thread t;
  129. primitive หรือ Object ใดที่กำหนด transient หมายถึงไม่เขียนลง Storage
  130. เขียนข้อมูลแบบ FileOutputStream + ObjectOutputStream
    import java.io.*;
    public class x{
    public static void main(String[] args) throws Exception{
    FileOutputStream fo = new FileOutputStream("f.txt");
    ObjectOutputStream out = new ObjectOutputStream(fo);
    out.writeObject(101);
    out.writeObject("boy");
    }
    }
  131. อ่านข้อมูลแบบ FileInputStream + ObjectInputStream
    FileInputStream fi = new FileInputStream("f.txt");
    ObjectInputStream in = new ObjectInputStream(fi);
    System.out.println(in.readObject()); // 101
    System.out.println(in.readObject()); // tom
  132. สร้าง Class y ที่เป็น Serializable จึงจะ Writeobject แบบ y ลงไปได้
    import java.io.*;
    class y implements Serializable{
    private int a;
    private String b;
    y(int a,String b){ this.a = a; this.b = b;}
    int getid(){ return this.a;}
    String getname(){ return this.b;}
    }
    public class x{
    public static void main(String[] args) throws Exception{
    FileOutputStream fo = new FileOutputStream("f.txt");
    ObjectOutputStream out = new ObjectOutputStream(fo);
    y o = new y(103,"burin");
    out.writeObject(o);
    }
    }
  133. สร้าง Class y ที่เป็น Serializable ต้องตรงกับที่ Writeobject มิเช่นนั้น readObject ไม่เข้า
    import java.io.*;
    class y implements Serializable{
    private int a;
    private String b;
    y(int a,String b){ this.a = a; this.b = b;}
    int getid(){ return this.a;}
    String getname(){ return this.b;}
    }
    public class x{
    public static void main(String[] args) throws Exception{
    FileInputStream fi = new FileInputStream("f.txt");
    ObjectInputStream in = new ObjectInputStream(fi);
    Object o = in.readObject();
    y ox = (y)o;
    System.out.println(ox.getid());
    System.out.println(ox.getname());
    } }
  134. ถ้า father ไม่เป็น Serializable จะถูก catch ไว้ แม่ไม่ใช้ใน writeObject ก็ตาม
    import java.io.*;
    class father implements Serializable{}
    public class child implements Serializable{
    private father y = new father();
    public static void main(String[] args) {
    child o = new child();
    try{
    FileOutputStream fo = new FileOutputStream("f.txt");
    ObjectOutputStream out = new ObjectOutputStream(fo);
    out.writeObject(o);
    out.close();
    }catch(Exception e){e.printStackTrace();}
    } }
    7. Fundamentals
    fundamental
  135. สร้าง class ชื่อ x และมี inner class ชื่อ y จะได้ x.class และ x$y.class
    class x { class xxx{ } }
  136. ทั้ง static และ public ต่างเป็น modifier 2 ตัวนี้สลับที่ได้
    static public void a(){ }
  137. Boxing คือแปลง Primitive เป็น Object เช่น int x = 5; Integer y = new Integer(x);
  138. Unboxing คือแปลง Object เป็น Primitive เช่น Integer x = new Integer("5"); int y = x.intValue();
  139. Autoboxing คือแปลง Primitive เป็น Object เช่น int x = 5; Integer y = x;
  140. Autounboxing คือแปลง Object เป็น Primitive เช่น Integer x = new Integer("5"); int y = x;
  141. ใช้ Integer แปลง String เป็นตัวเลข และ Autounboxing
    String x = "5";
    System.out.println((new Integer(x)) + 5 + Integer.valueOf(x) + x); // 155
  142. ถ้าข้อมูลไม่เกินขอบเขตก็จะทำ Autoboxing ให้อย่างถูกต้อง
    byte b = 10;
    b = 10; // b = 128; possible loss of precision
    b = 10 + 10; // Autoboxing
    System.out.println(b); // 20
    // b = b + 10; or b = 10 + b; possible loss of precision
  143. Command line ที่ใช้ได้
    javac -source 1.5 x.java หรือ javac -cp c:\ x.java
    javac -d c:\ x.java กำหนดตำแหน่งแฟ้ม .class
    javac -s c:\ x.java กำหนดตำแหน่งแฟ้ม .java
    java -esa x หรือ java -enablesystemassertions x
    java -dsa x หรือ java -disablesystemassertions x
    java -ea x หรือ java -enableassertions x
    java -da x หรือ java -disableassertions x
    java -Dtax=10 caltax
  144. assert จะทำงานเมื่อเป็นเท็จ หยุดการทำงานทันที และรายงาน java.lang.AssertionError: break here
    assert(false):"break here";
    System.out.println("test");
  145. การส่งค่าของ boolean
    boolean a = false;
    if (a = true) System.out.println(1);
    if (a) System.out.println(2);
    if (a == true) System.out.println(3);
    if (a == false) System.out.println(4);
    System.out.println(5); // 1 2 3 5
  146. การใช้ equals และ hashCode แบบไม่ทำ Override
    String x = new String("abc");
    String y = new String("abc");
    System.out.println(x.equals(y)); // true
    System.out.println(x==y); // false
    System.out.println(x.hashCode()); // 96354
    System.out.println(y.hashCode()); // 96354
  147. ใช้ .equals กับ null ไม่ได้ เกิด exception
    Object x = null;
    System.out.println(x==null); // true
    // System.out.println(x.equals(null)); // java.lang.NullPointerException
  148. การส่งค่าให้ primitive เป็น null จะไม่ทำ Autoboxing แต่ถ้าตัวรับเป็น Object จะไม่พบปัญหา
    public static void main(String[] args) {
    Integer i = null; // เกิด Autoboxing แต่ยังเป็น null
    method(i); // i ยังเป็น null ทำให้เกิด java.lang.NullPointerException ที่บรรทัดนี้
    }
    static void method(int k){ System.out.println(k); }
  149. เมื่อ overload จะเลือกทำตาม primitive ก่อน
    public static void main(String[] args) {
    byte b = 10;
    method(b); // Primitive Type
    method(new Byte(b)); // Primitive Type by Promotion
    method(new Short(b)); // Primitive Type by Promotion
    method(new Integer(b)); // Wrapper Class
    // method(new Long(b)); Compile error
    // method(new Byte(10)); Compiler error
    }
    static void method(Integer i){ System.out.println("Wrapper Class"); }
    static void method(int i){ System.out.println("Primitive Type"); }
  150. Local Object ต้องประกาศค่า เช่น Integer i = null; จึงจะ compile ผ่าน และพิมพ์ได้
  151. Local Object หรือ primitive ที่ไม่ประกาศค่า เช่น Integer i; หรือ int j; จะ compile ผ่านถ้าไม่เรียกใช้ และ run ได้ปกติ
  152. Local Object ที่ประกาศค่าเป็น null จะ compile ผ่าน แต่ใช้ .equals หรือ .hashCode จะพบ java.lang.NullPointerException
  153. continue เพื่อไม่ทำต่อส่วนที่เหลือ ถ้าไม่อยู่ท้าย block ของ for หรือ while จะ compile error แต่ถ้าอยู่ใน if ไม่เป็นไร
    for(int i=0;i<=5;i++){
    System.out.println(i);
    if (true) continue;
    System.out.println("a");
    }
  154. break จะหยุดทำงาน แล้วออกนอก block ใช้ได้กับ case, while, for แต่ถ้าอยู่ต้น block ทันที ต้องมี if คลุม

SCJP 1.5
Object Oriented Programming - constructor เรียกชื่อกันเองไม่ได้ ถ้าเรียกต้องใช้ this(); หรือ this(5); - this() หรือ super() ต้องอยู่ในบรรทัดแรกของ Constructor - เป้าหมายของ encapsulation คือการซ่อน implement หลัง interface เช่น getter setter Overload & Override - constructor สามารถถูก overload แต่ไม่สามารถถูก override - abstract method ต้องถูก override เมื่อถูกเรียกใน sub class ที่ไม่ใช่ abstract ครั้งแรก - เมื่อ extends abstract class ใน abstract class ไม่จำเป็นต้อง override method ที่เป็น abstract - ถ้ามี method เป็น abstract ตัว class ต้องเป็น abstract ด้วย
interface - ใช้ implements เรียกจาก class แต่ extends ระหว่าง implements ได้ - สร้าง method ที่มี body ใน interface ไม่ได้ แต่สร้าง instance variable ได้ - implements หลาย interface กั้นด้วย , ได้ หรือ extends หลาย interface ก็ได้ - Variable ในหลาย interface ซ้ำกันไม่ได้ interface a1{ static int a=1; } interface a2{ static int b=2; } interface a3 extends a1,a2 { static int c=3; } interface a4{ static int d=4; } class a5 { static int e=5; } class child extends a5 implements a3,a4 { static{ System.out.println(a + b + c + d + e); // 15 System.exit(0); } }
// casting class x { public static void main(String[] args) { System.out.println(xx(9)); } static double xx(int xxx){ return xxx/2.0; // ถ้าเป็น /2 จะได้ผลลัพธ์เป็น 4 // return (double) xxx/2; หรือ return xxx / (double) 2; จะได้ 4.5 } }
// Variable Arguments (VarArgs) class x { void print(int a,int b,String... c){ a += b; for(String d : c) a+=Integer.parseInt(d); System.out.print(a); // 10 } public static void main(String[] args) { x y = new x(); y.print(1,2,"3","4"); } }
// VarArgs + Overloading class x { void print(int... a){System.out.print(1);} void print(int a){System.out.print(2);} void print(int a,int b){System.out.print(3);} public static void main(String[] args) { x y = new x(); y.print(9); y.print(9,9); y.print(9,9,9); // 231 } }
// System.arraycopy + VarArgs + foreach class x { void xx (int... xxx){ int b[] = new int[xxx.length - 1]; System.arraycopy(xxx,1,b,0,xxx.length - 1); for(int c:b) System.out.print(c); // 678 } public static void main(String[] args) { int a[] = {5,6,7,8}; x xxxx = new x(); xxxx.xx(a); } }
printf() format() in java.io.PrintStream, java.io.PrintWriter, java.lang.String class x { public static void main(String[] args) { System.out.printf("%2$.2f %<.2f %1$o %n",20,Math.PI); System.out.format("%.2f %<.2f %n",Math.PI,20); System.out.printf("%x %<b %n",20); System.out.format("%s %<c %n",65); } } 3.14 3.14 24 3.14 3.14 14 true 65 A
// Calendar : java.util.Formatter import java.util.*; class x { public static void main(String[] args) { Calendar t = Calendar.getInstance(); System.out.printf("%tY-%<tm-%<td %<tH:%<tM:%<tS",t); // 2007-07-21 04:17:02 } }
// Wrapper class + Boxing + AutoUnboxing class x { public static void main(String[] args) { int a = 5; a = Integer.parseInt("3") + Integer.valueOf("3"); Integer b = new Integer(7); // Boxing b = 8; // AutoBoxing Integer c = 9; // AutoBoxing int d = c.intValue(); // Unboxing int e = c; // AutoUnboxing System.out.println("" + a + b + c + d + e); // 6899 } }
// Autoboxing + .equals class x { public static void main(String[] args){ Integer i = new Integer(0); while(i.equals(0)) { System.out.println(i); // 0 i++; } while(i < 3){ // autoboxing System.out.println(i); // 1 2 i++; } } }
// Generics + Collection + foreach // ตรวจสอบใน compile time มิใช่ run time import java.util.*; class x { static void p(ArrayList<String> a) { for(String b:a){ System.out.println(b); } } public static void main(String[] args) { ArrayList<String> l = new ArrayList<String>(); l.add("a"); l.add("b"); // ถ้าส่งตัวอื่นจะ compile ไม่ผ่าน p(l); } }
// Assigning Reference Integer a = new Integer(1); Integer b = a; a = new Integer(2); System.out.println(""+ a + b); // 2 1
// Passing Argument (Primitive Type(By Value) & Reference Type(By Address of Object) // a เป็น primitive ส่วน b เป็น Object class x{ static int a = 1; static StringBuffer b = new StringBuffer("b"); static void c(int d,StringBuffer e){ d = 2; e.replace(0,1,"x"); } public static void main(String[] args) { c(a,b); System.out.println(a +""+ b); // 1 x } }
// immutable object = ไม่สามารถเปลี่ยนแปลงค่าได้ // String objects are immutable // StringBuffer is a thread-safe, mutable sequence of characters // StringBuilder is a mutable sequence of characters. no guarantee of synchronization. // http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuilder.html class x{ public static void main(String[] args) { String a = "abcd"; a.replace("bc","fg"); String b = "abcd"; b = b.replace("bc","fg"); StringBuffer c = new StringBuffer("abcd"); c.replace(1,2,"fg"); System.out.println(a + b + c); // abcd afgd afgcd // http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StringBuffer.html } }
// Static Member : Static Method และ Static Variable // Static คือ สิ่งที่มีได้ตัวเดียวในหน่วยความจำ ทำให้ new กี่ครั้งก็ได้ค่าเดิม class father { public static int a = 0; // static variable public static int b() { return ++a; } // static method } class child extends father { static { father f1 = new father(); System.out.println(f1.b()); System.out.println(f1.b()); father f2 = new father(); System.out.println(f2.b()); วิธีที่ 3 เรียกผ่าน instant } public static void main(String a[]){ System.out.println(new father().b()); วิธีที่ 1 เรียกผ่าน temporaly instant System.out.println(father.b()); // วิธีที่ 2 เรียกผ่าน class // 1 2 3 4 5 } }
// polymorphism + inheritance + abstract // abstract method ต้องอยู่ใน class ที่เป็น abstract // abstract class ไม่มี member เป็น abstract ก็ไม่พบปัญหาใด // ถ้ามี method มี return type ใน method ต้องมี return value // ทดสอบแล้ว b ไม่เป็น abstract ก็ให้ผลเหมือนเดิม abstract class human { public static int a = 0; abstract int b(); } class father extends human { int b() { return ++a;}; // return required } class child { public static void main(String args[]){ human h1 = new father(); System.out.println(h1.b()); System.out.println(h1.b()); human h2 = new father(); System.out.println(h2.b()); // 1 2 3 } }
// Static Initializer หรือ Static Block // Static Block ถูกทำหลัง Load Static member แล้ว // java -Dx=5 child คือ set System Property class child { static { String x = System.getProperty("x"); System.out.println(x + y()); // ถูกทำหลัง Load y() ไปแล้ว System.exit(0); } static String y () { return "y"; } // ถูกทำก่อน }
// encapsulation : setter + getter + private // Modifier ; public protected default private class father { private int a = 1; protected int geta() { return a; } protected void seta(int a) { this.a = a; } } class child { public static void main(String args[]){ father f = new father(); f.seta(5); System.out.println(f.geta()); // 5 } }
// throws Exception // ถ้า method throws ตัวนำ method ไปใช้ต้อง catch มิเช่นนั้น compile error class father { static void a() throws java.lang.Exception { System.out.println(5); } } class child extends father { public static void main(String args[]){ try { a(); } catch (java.lang.Exception e) {} } }
// super. + this. // เรียกใน method ที่เป็น static ไม่ได้ เช่น main หรือ d() ที่เติม static class father { static int a = 1; static int b() { return 2; } } class child extends father { static int c = 3; public static void main(String args[]){ new child().d(); } void d() { System.out.println(super.a + super.b()); // 3 System.out.println(this.c); // 3 } }
// polymorphism แบบ 1 (no casting) // แบบนี้ใน father มี age จึงไม่ต้อง casting class father { int age() { return 0; } } class child1 extends father { int age() { return 10; } } class child2 extends father { int age() { return 20; } } class child { public static void main(String args[]){ father f[] = new father[10]; // กำหนดไว้เกิน ต้องใช้ instanceof ตรวจ f[0] = new child1(); f[1] = new child2(); for(father a:f){ if (a instanceof father) System.out.println(a.age()); } } }
// polymorphism แบบ 2 (casting) // เพราะลูกแต่ละคนมี method ที่แตกต่างกัน class father { } class child1 extends father { String golf() { return "beginner"; } } class child2 extends father { String ball() { return "professional"; } String tennis() { return "professional"; } } class child { public static void main(String args[]){ father f[] = new father[10]; f[0] = new child1(); f[1] = new child2(); for(father a:f){ if (a instanceof child1) { child1 b = (child1)a; System.out.println(b.golf()); } if (a instanceof child2) { child2 b = (child2)a; System.out.println(b.ball() + b.tennis()); } } } }
// Exception // Override ใช้ throws Exception ที่ใหญ่กว่าได้ // catch จะทำตามเงื่อนไขของ Exception อันแรกที่พบเท่านั้น // ถ้าผิดลำดับชั้นจะ compile error เช่นนำ Exception ขึ้นก่อน // ArithmeticException คือ หารด้วย 0 // NumberFormatException คือ ส่งอักษรเข้าตัวเลข class father { static void a() throws ArrayIndexOutOfBoundsException { } } class child{ static void a() throws Exception { int a[] = new int[1]; a[5] = 0; } public static void main(String args[]){ try { a(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("error1"); } catch (Exception e) { System.out.println("error2"); } finally { System.out.println("finally"); } // error1 finally } }
// ArrayList // ArrayList เป็น Collection หนึ่งที่ต้อง import java.util.* // ถ้าไม่ใช่ Genetic จะพบ Note : Recompile with -Xlint:unchecked for details. import java.util.*; public class a { public static void main (String args[]){ ArrayList list = new ArrayList(); list.add(new Integer(5)); list.add(new Integer(6)); list.add("hello"); pout(list); } public static void pout(ArrayList ai){ ListIterator a = ai.listIterator(); while(a.hasNext()){ Object o = a.next(); if (o instanceof Integer) { Integer i = (Integer)o; System.out.println(i); } } } }
// Generic // ใช้ตรวจสอบ object ขณะ compile ไม่ใช้ runtime // อาจใช้ instanceof ตรวจสอบก่อน casting แต่ไม่สะดวก import java.util.*; public class a { public static void main (String args[]){ ArrayList <Integer> list = new ArrayList <Integer>(); list.add(new Integer(5)); list.add(new Integer(6)); pout(list); } public static void pout(ArrayList <Integer> ai){ ListIterator a = ai.listIterator(); Object o; Integer i; while(a.hasNext()){ o = a.next(); i = (Integer)o; System.out.println(i); } } }
// Generic // โปรแกรมนี้มีปัญหา 2 อย่างคือ Compile Warning + java.lang.ClassCastException // Collection ไม่เป็น Generic จึงเป็นเพียง warning compile และ Generic ไม่มีผล // Integer Casting เป็น String ไม่ได้ import java.util.*; class x { public static void main(String [] args) { List samples = new ArrayList (); samples.add("1"); samples.add(2); samples.add("3"); pout(samples); } static void pout(List <String> o) { for(String s : o) System.out.print(s + " "); } }
// Generic ต้องเป็น Object // ใช้ int แทน Integer จะ Compile ไม่ผ่าน import java.util.*; class x { public static void main(String [] args) { List<Integer> samples = new ArrayList<Integer> (); samples.add(1); // Autoboxing samples.add(2); samples.add(3); System.out.print(samples); } }
// Generic on Define Object // Compile error เพราะตรวจพบ (1) ไม่ตรงกับ String // ถ้าไม่มี (1) จะ warning compile แล้วได้ [one, two] // ถ้าไม่มี (1) และ Set<String> vals = new TreeSet<String>(); ทำให้ warning compile หายไป // ถ้าเป็น Set vals = new TreeSet<String>(); จะ warning compile แล้ว run error // ผลของ Set vals = new TreeSet<String>(); ไม่ต่างกับ Set vals = new TreeSet(); // run error ที่พบคือ java.lang.ClassCastException import java.util.*; class x { public static void main(String [] args) { Set <String> vals = new TreeSet(); vals.add("one"); vals.add(1); // ถ้าไม่มี Generic จะ compile ผ่าน vals.add("two"); System.out.println(vals); // System.out.println(vals.get(0)); // Set ไม่มี get() ให้ใช้ } }
// Generic + Collection import java.util.*; class x { public static void main(String [] args) { List <Object> vals = new LinkedList<Object>(); vals.add("one"); vals.add("two"); System.out.println(vals); System.out.println(vals.get(0)); // one } }
// Collection + Generic + pass by address of object // ในภาษา Java มีแต่ passing by value ซึ่งไม่มี passing by reference import java.util.*; class x { public static void main(String [] args) { List<Object> samples = new ArrayList<Object>(); samples.add(new Integer("1")); int y = 5; addList(samples,y); System.out.print(samples +""+ y); // 1 2 5 } static void addList(List <Object> o, int n) { n = 6; o.add(new Integer("2")); } }
// Generic + HashMap // Compile error เพราะ for(String b : bs.keySet()) // ถ้าเปลี่ยนเป็น Object b ก็จะ OK import java.util.*; class School {} class Teacher extends School {} class Student extends School {} class x { public static void main(String [] args) { Map <String, School> s = new HashMap <String, School>(); s.put("t1", new Teacher()); s.put("s1", new Student()); Map bs = addBirds(s); for(String b : bs.keySet()) System.out.print(b + " "); } static Map addBirds(Map sx) { sx.put("s2", new Object()); return sx; } }
// Collection + Generic + ? + interface // สามารถรับ interface ได้ด้วย // สามารถใช้ static void checkAnimal(List <? extends Eat> pets) { // สามารถใช้ static void checkAnimal(List <? extends Animal> pets) { // When we use wildcard(?) to catch the collection , then modifications are not allowed in that collection import java.util.*; interface Eat{} class Animal implements Eat{} class Dog extends Animal {} class Cat extends Animal {} class x { public static void main(String[] args) { List <Animal> a = new ArrayList <Animal>(); List <Dog> d = new ArrayList <Dog>(); List <Cat> c = new ArrayList <Cat>(); checkAnimal(a); checkAnimal(d); checkAnimal(c); } static void checkAnimal(List <?> pets) { System.out.print("animals checked here"); } }
// Collection + type safe + autoboxing // โปรแกรมนี้มอง a เป็น type safe จึง autoboxing ใน foreach อัตโนมัติ import java.util.*; class x { public static void main(String[] args) { List <Integer> a = new ArrayList <Integer>(); a.add(5); a.add(6); for(int aa:a)System.out.print(aa); } }
// Generic // โปรแกรมนี้ Compile warning เพราะ non-type safe ที่ ArrayList b = a; import java.util.*; class Vehicle {} class Car extends Vehicle {} class Bus extends Vehicle {} class x { public static void main(String [] args) { ArrayList<Car> a = new ArrayList<Car>(); a.add(new Car()); ArrayList b = a; ArrayList<Bus> c = (ArrayList<Bus>)b; c.add(new Bus()); for (Object d : b) System.out.println(d); } }
// enum // การสร้างประเภทของข้อมูลขึ้นใช้เอง public class a { public static enum c { a,b,c } public static void main (String args[]){ for(c x:c.values()){ System.out.println(x); // a b c } c y = c.b; System.out.println(c.a); System.out.println(y); } }
// while และ break // โปรแกรมนี้จะพิมพ์เลข 2 แล้วหยุดการทำงาน class x { public static void main(String[] args) { int a = 1; while(a++ < 5) { System.out.println(a); break; }}}
// java.lang.ClassCastException class y {} class z extends y {} class x extends y{ public static void main(String[] args) { y z1 = new z(); y z2 = new z(); z2 = (x)z1; } }
// FileReader + BufferedReader import java.io.*; class x { public static void main(String[] args) throws IOException{ FileReader f = new FileReader("x.java"); BufferedReader b = new BufferedReader(f); String r = null; while ((r=b.readLine()) != null){ System.out.print(r); } } }
// FileWriter + BufferWriter import java.io.*; class x { public static void main(String[] args) throws IOException{ FileWriter f = new FileWriter("xx.java"); BufferedWriter b = new BufferedWriter(f); b.write("aa"+"\n"); b.write("aa"+"\n"); b.close(); } }
// enum + constructor // ทำ constructor ก่อน ถ้าพิมพ์ AccountType.FIXED ก็จะได้คำว่า A FIXED enum AccountType { SAVING, FIXED, CURRENT; private AccountType() { System.out.println("A "); } }
// enum + override method : toString() // เมื่อพิมพ์ Drinks.TEA จะพบคำว่า hide value static enum Drinks { COFFEE, TEA, JUICE; public String toString() { return "hide value"; } } // enum + toString ในแต่ละค่า enum Taste { SWEET { public String toString() { return "Ok";}}, HOT { public String toString() { return "Bad";}}; }
// enum + method in enum // ประกาศใช้ Level lx = Level.BEGINNER; // line 5 // ใช้ method ใน enum ด้วย lx.checkLevel(level); // 8 enum Level { BEGINNER, INTERMEDIATE, EXPERT; // line 1 public void checkLevel(Level l) { // line 2 System.out.println(l.toString().length()); } }
// ส่ง argument ต้องมี type ตรงกัน ต่าง type ไม่ได้ // สามารถส่งค่าไปมาระหว่าง primitive และ wrapper class ได้ class x { static void aa (short a){} static void aa (Short a){} static void aa (Long a){} // static void aa (Integer a){} public static void main(String args[]){ int xxx = 5; aa(xxx); // Compile fail because aa (int a) required } }
// แสดง instance แบบ non-static และ static class x { int a; static int b; void c(int m,int n) { a += ++m; b += ++n; } void d(int m) { a += ++m; b += m; } void main(){ a++; x e = new x(); e.c(1,2); System.out.println(""+ a + b + e.a + e.b); // 1 3 2 3 e.d(1); System.out.println(""+ a + b + e.a + e.b); // 1 5 4 5 x f = new x(); f.c(1,2); System.out.println(""+ a + b + f.a + f.b); // 1 8 2 8 f.d(1); System.out.println(""+ a + b + f.a + f.b); // 1 10 4 10 } public static void main(String [] args) { new x().main(); } }
"Imagination is more important than knowledge" - Albert Einstein
Home
Thaiabc.com
Thainame.net
Lampang.net
Nation university
PHP
MySQL
Visual basic.NET
TabletPC
Linux
Online quiz
Download
Search engine
Web ranking
Add website
Blog : Education
Blog : ACLA
Blog : Lampang
Facebook.com
Twitter.com
About us
My dream
Site map
Sponsor
http://goo.gl/72BPC