| 
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)
 | 
  
 แนะนำเว็บ (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
- ตัวอย่าง .java ที่กำหนดให้อยู่ใน package ชื่อ v1
 package v1;
 public class x { public static void main(String [] args) {}}
 - ถ้าไม่กำหนด public ให้กับ class จะเรียกได้เฉพาะใน package เดียวกัน
 - javac -d . x.java จะสร้างห้อง v1 เป็นชื่อ package และส่ง x.class เข้าไปในห้อง v1
 - javac -d .. x.java จะสร้างห้อง v1 นอกห้องปัจจุบัน 1 ระดับ และเก็บแฟ้ม x.class ในห้องนั้น
 - คำสั่ง compile package ใน package folder คือ ..\javac x.java จะได้ .class เก็บในห้องที่เก็บ .java
 - ถ้าเขียน y.java เพื่อเรียกใช้ x.class ใน package ทำได้ 2 วิธี
 วิธีที่ 1 คือ v1.x myobj = new v1.x();
 วิธีที่ 2 คือ import v1.*; แล้วใช้ x a = new x();
 - โดยปกติจะ import java.lang.* เข้ามาอัตโนมัติ จึงเรียกใช้ String, System, Wrapper, Object .. ได้ทันที
 - การ import package จะไม่นำ sub-package เข้ามาด้วย ต้องทำ 2 รอบ
 import java.awt.*; และ import java.awt.event.*;
 - กำหนด classpath ขณะประมวลผลด้วย java -cp c:\;.;d:\ x
 Data Types
 - byte a = 5; หรือ byte a = 5 + 5; จะไม่ error 
 แต่ a = a + 5; จะ compile error : posible loss of precision
 - Compile error on (Integer)(12.6f) but will ok on (Integer)(int)(12.6f) // 12
 - Compile ok on Byte a = 5 or Integer a = 5; but error on Double a = 5; ต้องใช้ new Double(5); 
 - 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
 - static จะถูก load หลัง load class ทันที และมีเพียงค่าเดียวในหน่วยความจำ ไม่ขึ้นกับจำนวน object ที่ถูกสร้าง
 - static initializer หรือ static block ถูกเรียกมาใช้หลังโหลด static member เข้าสู่หน่วยความจำ
 - 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
 }
 - กำหนด System Property ให้ static เรียกใช้ได้ ด้วย java -Dtax=10 caltax
 ใน caltax.java เขียนว่า String tax = System.getProperty("tax");
 - ตัวอย่างการใช้ 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
 } }
 - ตัวแปรที่เป็น 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
 } }
 - กำหนด 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); } 
 } 
 - local variable เป็น static ไม่ได้ เป็นได้เฉพาะ instance หรือ global variable
 static int a(){ 
 // static int b = 1;  // compile error : illegal start of expression
 return 5; }
 Var Args
 - method ที่กำหนดการรับค่าแบบ Var Args จะรับค่าได้ไม่จำกัด หรือไม่รับก็ได้
 - กำหนดหลายตัวแปรใน Arguments ได้ แต่ต้องกำหนด Var Args เป็นตัวสุดท้าย และมี ... 3 จุด
 - method หนึ่งมี Var Args ได้เพียง 1 ตัว เช่น void a(int b, int c, String... d) { }
 2. Flow Control 
 try {} catch() {} finally {}
 - finally จะทำงานทุกครั้ง แม้เข้าไปใน catch แต่จะไม่ทำถ้าพบ System.exit(0)
 - แม้มี return ใน catch หรือ try ก็ยังต้องทำ finally ก่อนอยู่ดี
 - ถ้าเขียน finally ก็จะต้องเขียนเป็นลำดับสุดท้าย
 - finally {} หรือ catch() { } ต้องใช้คู่กับ try {}
 - try {} ต้องคู่กับ finally {} หรือ catch() {} อย่างใดอย่างหนึ่ง
 - ถ้าจับหลาย Exception ตัว Super ต้องอยู่ล่างสุด มิเช่นนั้น Compile ไม่ผ่าน
 - Override โยน Exception ในตัว father ต้องแคบ แล้ว child กว้างกว่าได้ เช่นของ child โยน Exception
 - try ต้องอยู่คู่กับ catch หรือ finally อย่างน้อย 1 ตัว
 - ตัวอย่างการเกิด 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() ซ้ำ
 - class x { } compile ผ่าน แต่จะพบ Exception in thread "main" java.lang.NoSuchMethodError: main เมื่อ run
 - เมื่อพบ 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"); }
 } 
 }
 - ถ้าคิดว่ามี 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"); }
 } 
 }
 - ถ้าคิดว่ามี 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"); }
 } 
 }
 - การสั่งให้เกิด 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
 - การใช้ 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
 - ค่าเหมือนกัน แต่ 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
 - การเปรียบเทียบวัตถุที่มีค่าเป็น 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
 - primitive กับ null ใช้ร่วมกันไม่ได้
 //char a = null;  compile error
 //int x = null; compile error
 - การใช้ 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
 - พิมพ์อักษร \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 บรรทัด
 - ถ้าใช้ \ ให้ใช้ \\ เช่นการใช้ 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
 - 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
 - constructor ต้องไม่เป็น private ถ้ามีการเรียกผ่าน subclass เพราะจะ compile error
 - การใช้ 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
 }
 - ถ้า super มี constructor ที่มี argument แต่ไม่มี default constructor ทำให้ subclass compile error เพราะเรียกหา default constructor ไม่พบ
 - this() หรือ super() ต้องอยู่ใน constructor ที่ถูก overload ได้ และต้องเป็นบรรทัดแรก และต้องไม่อยู่คู่กัน 2 ตัว
 - ถ้าเรียกใช้ 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
 }
 - ถ้าไม่มี 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
 - การเรียกใช้ 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(); }
 }
 - การเรียกใช้ 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
 }
 - การใช้ 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
 - wait()/notify()/notifyAll(): ต้องถูกเรียกจากใน synchronized context
 - notify(): ปลุกให้เทรดเดียวที่คอยวัตถุอยู่ตื่น
 - notifyAll(): ปลุกให้ทุกเทรดที่คอยวัตถุอยู่ตื่น
 - yield(): ทำให้เทรดปัจจุบันหยุดชั่วคราว และอนุญาตให้เทรดอื่นประมวลผล ถ้าไม่มีตัวเองก็จะทำงานต่อตามปกติ
 - wait(): บอกให้เทรดหยุดรอจนกว่าจะมีเทรดอื่นมาปลุกด้วย notify() หรือ notifyAll() ในอีกเทรดหนึ่ง
 - wait(long timeout): บอกให้เทรดหยุดรอจนกว่าจะมีเทรดอื่นมาปลุก หรือครบตามเวลา 
 - sleep(): หลับอย่างน้อยเท่าช่วงเวลาหนึ่งที่กำหนด (least the time specified in the argument)
 - join(): เทรดหนึ่งเข้าขัดบอกว่าขอทำก่อน และให้รอจนกว่าตนจะทำเสร็จ 
 - interrupt(): ขัดจังหวะไม่ให้ thread ทำงานต่อ คล้าย stop() suspend()
 - sleep() ต้องส่ง milisecond เข้าไปมิเช่นนั้น compile error ต้องมี exception จับ หรือ throws ระดับ method
 - wait() หรือ notify() หรือ join() ต้องมี exception จับ มิเช่นนั้น compile error
 - yield() หรือ interrupt() ไม่ต้องมี exception จับก็ได้
 - ถ้า start() ถ้าสั่ง process ใน run() อาจไม่ประมวลผลในทันที
 - ถ้า 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(); 
 - ถ้า start() เทรดเดิมซ้ำ จะพบ java.lang.IllegalThreadStateException และยังคงมีเพียง Thread เดียวที่ประมวลผล
 - การใช้ Thread.sleep() ต้องใช้ throw exception อาจใช้ตอนประกาศ method หรือใน method ก็ได้
 - การ catch ต้องจับให้ตรง ถ้าใช้ sleep แล้วไปจับ IOException จะ compile ไม่ผ่าน
 เช่น try{ Thread.sleep(1000); } catch(Exception e) { }
 เช่น try{ Thread.sleep(1000); } catch(InterruptedException e) { }
 - การสั่งให้ 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(); 
 } 
 } 
 - การสั่งให้ 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();
 }
 }
 - การสั่งให้ 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();
 }
 }
 - การสั่งให้ Thread ประมวลผลผ่าน Thread แบบ Anonymous Inner Class
 class x{
 public static void main(String[] args) {
 new Thread() {
 public void run(){ while(true) System.out.print("."); }
 }.start();
 }
 }
 - ถ้าสั่ง start() แล้วสั่งพิมพ์ข้อความ โดยปกติพิมพ์ข้อความจะถูกกระทำก่อนการทำงานใน run()
 - แสดงการใช้ 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
 - แสดงการ 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
 } } 
 - ความสัมพันธ์ของ 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
 - 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
 - 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
 - กำหนดรับ 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
 - ใน interface มีได้เฉพาะ abstract method ที่เป็นแบบ public หรือ default เท่านั้น
 - interface กำหนดค่าให้กับ instance variable ได้
 - interface สามารถ extends interface ได้พร้อมกันหลาย interface
 - interface สามารถถูก implements จาก class ได้พร้อมกันหลาย interface
 - interface ไม่สามารถมี constructor หรือสร้าง object 
 - ถ้า class มี extends และ implements ต้องทำการ extends ก่อน
 6. Collections /Generics 
 Generic (type safe)
 - Generic ตรวจ Type Safe ในส่วนของ Compile ไม่ทำงานในส่วนของ Runtime
 - ถ้า define หรือ new object มี <Object> กำหนดไม่ครบคู่ จะเป็น warning compile
 เช่น  Set<Object> vals = new TreeSet<Object> (); 
 - When we use wildcard(?) to catch the collection , then modifications(add) are not allowed in that collection
 - Can not compiled : Basket <?> b = new Basket <Apple>(); เพราะใช้ Wildcard ที่นี่ไม่ได้
 - warning Compile เพราะไม่แน่ใจว่าส่ง Apple เข้าไปแล้ว จะไม่มีปัญหา
 Basket b = new Basket();
 b.addbasket(new Apple());     
 - 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"));
 } 
 } 
 - 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); } 
 } 
 - 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
 - ถ้าไม่ใช้ 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
 - List : sorted, can same (ArrayList, LinkedList, Vector:Thread-Safe)
 - Set : unsorted, not same (HashSet, LinkedHashSet, TreeSet)
 - Map : key sorted, key not same (HashMap, HashTable:Thread-Safe, LinkedHashMap, TreeMap)
 - 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
 - การสร้าง และใช้ ArrayList ถ้า add จะพบ warning compile : unchecked or unsafe operations.
 ถ้าไม่ add จะไม่พบ error และถ้าเติม Generic Object จะรับแบบใดก็ได้
 ArrayList a = new ArrayList();
 a.add("a");
 a.add(new String("a"));
 - ต้องกำหนดทั้ง ประกาศ และสร้างวัตถุ จึงจะไม่มี 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
 - 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;
 - HashSet เป็นแม่ของ LinkedHashSet
 HashSet x = new LinkedHashSet(); x.add(new String("def")); x.add(new String("abc"));
 System.out.println(x); // [def, abc]
 - Set เป็นแม่ของ TreeSet และจัดเรียงอัตโนมัติ
 Set x = new TreeSet(); x.add(new String("def")); x.add(new String("abc"));
 System.out.println(x); // [abc, def]
 enum
 - ถ้ากำหนด enum นอก class จะกำหนด modifier ไม่ได้
 - มี constructor ใน enum ได้ แต่มี modifier หน้า enum ที่เป็น constructor ไม่ได้
 - enum นอก class กำหนด static ไม่ได้ แต่ใน class สามารถมี static หรือ public ได้
 - การเขียน enum นอก class เมื่อ compile จะได้ .class สำหรับ enum ชื่อ enum จึงซ้ำชื่อ class ไม่ได้
 enum y{a,b,c}
 class x {
 static{	
 System.out.println(y.a); // a
 System.exit(0);
 }}
 - enum กำหนดนอก class หรือใน class หรือเป็น inner class ได้ แต่กำหนดใน method ไม่ได้
 class Outer {
 static enum OuterEnum { OUT, OUTTER; }                                                        
 static class Inner { enum InnerEnum { IN, INNER;} }
 }
 - 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 (ผู้ได้รับมอบอำนาจ).
 - ค่าที่เป็นไปได้ใน switch ต้องเป็นค่าตาม enum มิเช่นนั้นจะเกิด unqualified enumeration constant name เมื่อ compile
 enum a{a,b,c} ไว้นอก class
 a b= a.a;
 switch(b){ case d:; }
 - 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
 - ชุด 1 : FileReader, BufferedReader, .readLine
 - ชุด 2 : FileWriter, BufferedWriter, .write, .close
 - ชุด 3 : FileInputStream, ObjectInputStream, .readObject
 - ชุด 4 : FileOutputStream, ObjectOuputStream, .writeObject, .close
 - ถ้าไม่ import java.io.* ก็ต้องกำหนดเต็มหน้า Class เช่น IOException FileBuffer BufferedReader
 - ใช้ Exception แทน IOException ได้ แต่ใช้ java.io.Exception ไมได้เพราะ Exception อยู่ใน java.lang
 - การใช้ 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); }
 }
 }
 - การใช้ 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();
 }}
 - การใช้ Scanner ต้อง import java.util.*;
 - ถ้าไม่กำหนด 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());
 - instance ที่เขียนลง Storage ต้องกำหนดเป็น Serializable โดย Class ต้อง implements Serializable 
 - primitive เป็น Serializable โดยอัตโนมัติ
 - Object ที่ไม่สามารถกำหนดเป็น Serializable เช่น Thread, InputStream ให้เติม transient หน้าแบบของ Object
 private transient Thread t;
 - primitive หรือ Object ใดที่กำหนด transient หมายถึงไม่เขียนลง Storage
 - เขียนข้อมูลแบบ 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");
 } 
 }
 - อ่านข้อมูลแบบ 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
 - สร้าง 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);
 } 
 }
 - สร้าง 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());
 } }
 - ถ้า 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
 - สร้าง class ชื่อ x และมี inner class ชื่อ y จะได้ x.class และ x$y.class
 class x { class xxx{ } }
 - ทั้ง static และ public ต่างเป็น modifier 2 ตัวนี้สลับที่ได้
 static public void a(){	}
 - Boxing คือแปลง Primitive เป็น Object เช่น int x = 5; Integer y = new Integer(x);
 - Unboxing คือแปลง Object เป็น Primitive เช่น Integer x = new Integer("5"); int y = x.intValue();
 - Autoboxing คือแปลง Primitive เป็น Object เช่น int x = 5; Integer y = x;
 - Autounboxing คือแปลง Object เป็น Primitive เช่น Integer x = new Integer("5"); int y = x;
 - ใช้ Integer แปลง String เป็นตัวเลข และ Autounboxing
 String x = "5";
 System.out.println((new Integer(x)) + 5 + Integer.valueOf(x) + x); // 155
 - ถ้าข้อมูลไม่เกินขอบเขตก็จะทำ 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
 - 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
 - assert จะทำงานเมื่อเป็นเท็จ หยุดการทำงานทันที และรายงาน java.lang.AssertionError: break here
 assert(false):"break here";
 System.out.println("test");
 - การส่งค่าของ 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
 - การใช้ 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
 - ใช้ .equals กับ null ไม่ได้ เกิด exception
 Object x = null;
 System.out.println(x==null); // true
 // System.out.println(x.equals(null)); // java.lang.NullPointerException
 - การส่งค่าให้ 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);  }
 - เมื่อ 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"); }
 - Local Object ต้องประกาศค่า เช่น Integer i = null; จึงจะ compile ผ่าน และพิมพ์ได้ 
 - Local Object หรือ primitive ที่ไม่ประกาศค่า เช่น Integer i; หรือ int j; จะ compile ผ่านถ้าไม่เรียกใช้ และ run ได้ปกติ
 - Local Object ที่ประกาศค่าเป็น null จะ compile ผ่าน แต่ใช้ .equals หรือ .hashCode จะพบ  java.lang.NullPointerException
 - 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");
 }
 - 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(); }
} 
 
 |  
 |