สมัครเรียนโทร. 085-350-7540 , 084-88-00-255 , ntprintf@gmail.com

Tutorial JAVA

01 install Eclipse 02 intro to programming Eclipse 03 condition 04.loop 05.array 05 2 array cont 06 01 function 06 02 function cont 07 object 08 string 09 constructor 10 01 oop 10 02 oop2 11 exception 12 reading file 13 thread 14 generic 15 01 GUI 15 02 GUI2 15 03.GUI3 16 using WindowBuilder 17 event 18 database management system 19 ER diagram 20 Relational 21 Xampp 22 JDBC 23 MVC 24 SQL

การเขียนโปรแกรมเชิงวัตถุ 2

Object Oriented Programming (OOP) 2

ตัวแปรและเมท็อดที่เป็น static

คีย์เวิร์ด static เป็นคีย์เวิร์ดที่ใช้ประกาศหน้าตัวแปรและเมท็อด ความพิเศษของ static คือว่าโดยปกติเวลาจะสร้างอ็อปเจ็คต้องทำการ new อ็อปเจ็คขึ้นมา ตัวแปรอ็อปเจ็คก็จะอ้างอิงไปที่อ็อปเจ็คที่สร้างขึ้น แล้วก็เอาตัวแปรนี้ไปเรียกใช้ตัวแปร ใช้เมท็อด แต่ถ้าตัวแปรหรือเมท็อดนั้นเป็น static ก็จะทำให้สามารถใช้ตัวแปรหรือเมท็อดนั้นได้เลยโดยไม่ต้องสร้างอ็อปเจ็คมาเรียกใช้งาน

สำหรับตัวแปรที่เป็น static นั้น จะทำให้ตัวแปรนั้นเป็นตัวแปรของคลาสไม่ได้เป็นของอ็อปเจ็คใดอ็อปเจ็คหนึ่ง ถ้ามีการเปลี่ยนแปลงขึ้นกับตัวแปร static อ็อปเจ็คอื่นๆทั้งหมดจะมองเห็นการเปลี่ยนแปลง

วิธีประกาศ

สำหรับตัวแปร    modifier static ชนิดตัวแปร ชื่อตัวแปร;

สำหรับเมท็อด    modifier static ประเภทผลลัพธ์ ชื่อเมท็อด( ) { }

                        วิธีการเรียกใช้งานเมท็อดที่เป็น static ถ้าอยู่ในคลาสเดียวกันก็ ชื่อเมท็อด(); แบบนี้ได้เลย แต่ถ้าอยู่คนละคลาสก็ ใช่ ชื่อคลาส.ชื่อเมท็อด static

            เมท็อดที่เป็น static ที่ได้ใช้มาแล้วก็คือ เมท็อด main ใน public static void main(String [] args) เพราะว่า main เป็นเมท็อดสำหรับเริ่มทำงาน ดังนั้นต้องสามารถทำงานได้เลยโดยไม่ต้องมีอ็อปเจ็คมาเรียกใช้งาน

 


รูป 10-2-1

            เมท็อดชื่อ f ในบรรทัดที่ 17 ประกาศเป็น เมท็อด static ดังนั้นในบรรทัดที่ 12 สามารถเรียกใช้เมท็อด f ได้เลย แต่บรรทัดที่ 13 มีการเรียกใช้เมท็อด println ซึ่งอยู่ในคลาส System ก็ต้องใช้งานแบบ ชื่อคลาส.เมท็อด

 


รูป 10-2-2

            สังเกตว่าเมื่อเอาคำว่า static ออกในบรรทัดที่ 17 จะเกิด error ขึ้นทันทีที่บรรทัดที่ 12 ที่เรียกเมท็อด

ตัวแปร เมท็อดและคลาสที่เป็น final

            คล้ายกับ static คีย์เวิร์ด final ใช้ประกาศหน้าตัวแปร เมท็อดและยังประกาศหน้าคลาสได้ด้วย

-          ถ้า final ไปประกาศหน้าตัวแปร ตัวแปรนั้นจะมีค่านั้นตลอดเปลี่ยนแปลงไม่ได้ เรียกว่าเป็นค่าคงที่

-          ถ้าอยู่หน้าเมท็อดแล้วคลาสนี้ถูกสืบคุณสมบัติไป เมท็อดนี้จะไม่สามารถเขียนทับแก้ไขได้หรือก็คือไม่สามารถ Overriding ได้

-          แต่ถ้าอยู่คลาส คลาสนั้นๆจะไม่สามารถเป็นคลาสแม่ได้เลย คือบางทีไม่ต้องการให้คนเอาอะไรเปลี่ยนทั้งนั้นก็ประกาศคลาสเป็น final เพราะบางทีประกาศเมท็อดเป็น final คลาสลูกก็เขียนเมท็อดใหม่ขึ้นมาได้ เช่น เราไม่ต้องการเขาเปลี่ยนชื่อ เขาก็เขียนเมท็อดสำหรับเปลี่ยนชื่อใหม่ได้

วิธีประกาศ

สำหรับตัวแปร    final ชนิดตัวแปร ชื่อตัวแปร = ค่าคงที่ ;

สำหรับเมท็อด    modifier final ประเภทผลลัพธ์ ชื่อเมท็อด( ) { }

สำหรับคลาส      modifier final class ชื่อคลาส{ }

เมท็อดและคลาส abstract

            เป็นอีกหนึ่งคีย์เวิร์ดในจาวาที่ใช้สำหรับการประกาศหน้าคลาสหรือเมท็อดใดๆให้มีคุณสมบัติเป็น abstract(นามธรรม) ซึ่งหมายถึงคลาสที่ไม่สามารถมีอ็อปเจ็คได้ หรือถ้าประกาศหน้าเมท็อดก็จะเป็นเมท็อดที่ไม่ได้กำหนดการทำงานเอาไว้ ให้คลาสลูกที่มาสืบทอดคุณสมบัติไปไปกำหนดการทำงานเอาเอง

            ทำไมต้อง abstract – ก็เพราะว่าบางครั้งมีการสืบทอดคลาสแม่ลูก สมมติว่าคลาส A เป็นคลาสแม่ มีคลาสลูก B, C, D, E มาสืบคุณสมบัติไป ปรากฏว่าคลาส B, D และ E ต้องใช้เมท็อดชื่อ show() เหมือนกัน แต่ในคลาสแม่ A ไม่มีเมท็อดนี้อยู่ ก็ให้คลาสแม่ประกาศเมท็อดเปล่าเอาไว้ คลาสลูกจะได้ใช้งาน ซึ่งคลาสลูกก็สามารถเปลี่ยนแปลงการทำงานในเมท็อด abstract ได้

            เขียนเมท็อดชื่อ show() ใหม่ไม่ได้หรอ – ได้ ก็เขียนใหม่ในคลาส B, D ,E ได้ แต่มันไม่เป็นไปตามเรื่องการสืบทอดคุณสมบัติ(inheritance)และการพ้องรูป(polymorphism) ของการเขียนจาวาแบบ OOP ก็แบบว่า ตัวแปรอ็อปเจ็คของแม่สามารถอ้างอิงอ็อปเจ็คของลูกได้ แต่ถ้าในคลาสแม่ไม่มีเมท็อด show() แม่ก็จะเรียกใช้ก็งานเมท็อดนี้ไม่ได้ ซึ่งก็ทำให้ทำงานไม่ดี

            วิธีประกาศ

สำหรับคลาส      modifier abstract class ชื่อคลาส { }

สำหรับเมท็อด    modifier abstract ประเภทผลลัพธ์ ชื่อเมท็อด(พารามิเตอร์)

ตัวอย่างเช่น

public abstract class Name

{

public abstract void setName(String name);

}

แต่ว่า

1.      ภายในคลาสที่เป็น abstract จะใช้คำสั่ง new สร้างอ็อปเจ็คของคลาสนั้นไม่ได้ เช่น new Name(); ไม่ได้

2.      ภายในเมท็อดที่เป็น abstract จะมีคำสั่งไม่ได้

3.      ใน abstract คลาส จะมีเมท็อดที่เป็นหรือไม่เป็น abstract อยู่ก็ได้

4.      แต่ abstract เมท็อดต้องอยู่ใน abstractคลาส เท่านั้น

 


รูป 10-2-3

ถ้าเอาคำว่า abstract ในบรรทัดที่ 2 ออกจะ error เพราะ บรรทัดที่ 4 กับ 7 เป็น abstract เมท็อด

5.      Abstract คลาสสามารถสืบทอดคุณสมบัติกันได้เหมือนคลาสปกติ แต่คลาสที่สืบทอดไป(คลาสลูก)จะต้องอิมพลีเมนท์(implement)[1] ทุกเมท็อดแม้จะไม่ได้ใช้งานก็ตาม

6.      คลาสธรรมดาสืบทอดคุณสมบัติจากคลาส abstract ได้

7.      มีคอนสตรัคเตอร์

Interfaces

                เป็นเรื่องต่อมาจาก abstract เพราะ interface เป็นเหมือคลาสๆหนึ่งที่ เมท็อดทุกเมท็อดเป็น abstract และตัวแปรทุกตัวก็เป็นตัวแปรแบบ public static final ด้วย

            การประกาศ

การเขียนคลาสปกติ         public class Worker { }

เขียน interface              public interface Worker { } ก็เอาคำว่า interface ไปแทน class

            ใน eclipse เวลาจะสร้างคลาส ตรงใต้ class จะมีคำว่า interface ก็กดตรงนั้นเลย

 


รูป10-2-4

            การประการตัวแปรและเมท็อดของ interface ต้องเป็น ตัวแปร public static final และ เมท็อด abstract  อยู่แล้วก็ไม่ต้องเขียนแบบรูป 10-2-4 ก็ได้ เขียนแบบข้างล่างแทน

 


รูป 10-2-5

วิธีใช้

1.      ใช้คำว่า implements ตามด้วย ชื่อinterface เช่น public class A implements interface B { } แต่อิมพลีเมนต์ interface แล้วต้องทำการ interface ทุกเมท็อดของ interface นั้นด้วย ง่ายๆคือเวลาอิมพลีเมนต์มันขึ้นขีดเส้นสีแดง error ที่ชื่อคลาส A พอกดมันก็จะอิมพลีมเนต์ให้เลยแบบนี้

 


รูป 10-2-6

2.      ค่าคงที่ เป็น public static final หมายถึงเปลี่ยนแปลงไม่ได้

3.      อิมพลีเมนต์ได้มากกว่า 1 interface  เช่น class A implements Interface1, Interface2, Interface3 { }

4.      ใช้ extends ก่อนอิมพลีเมนต์ก็ได้  เช่น class A extends B implements Interface1, Interface2, Interface3 { }

 

Abstract กับ Interface

-          เมท็อดของ abstract เป็น abstract ก็ได้ไม่เป็นก็ได้ แต่ถ้า interface นี่ไม่ได้เลยต้อง abstract เท่านั้น

-          ตัวแปรของ interface ล็อกค่า ของ abstract ไม่ล็อกเปลี่ยนแปลงได้

-          เวลามีคลาสไหนจะใช้งานเมท็อดของ abstract ต้องสืบทอดคุณสมบัติเป็นแม่ลูกกัน แต่ interface ไม่ต้องอยากใช้งานก็เอาไปใช้

-          Interface ไม่มีคอนสตรัคเตอร์ abstract มี

ทำไมต้อง interface

            เนื่องจาก interface ไม่ต้องมีความสัมพันธ์แม่ลูกกันแวลาใช้งาน ขอเปรียบเทียบว่า สมมติมีคลาสหมู กับคลาสลูกหมู แน่นอนว่าแบบนี้ต้องเป็นคลาสแม่ลูกกันเพราะนอกจากต้องจะสืบทอดคุณสมบัติทั้งรูปร่าง สีผิวแล้ว พฤติกรรมหรือนิสัยยังต้องทำอะไรคล้ายๆกันด้วย แบบนี้ก็ใช้ abstract ได้ เพราะลูกหมูหลายตัวอาจจะมีพฤติกรรมบางอย่างที่ทำเฉพาะตัวไม่เหมือนกัน ในคลาสลูกหมูก็ไปแก้เมท็อดนั้นเอา เรื่องมีอยู่ว่าแม่หมูทำงานอย่างหนึ่งคือดมกลิ่นหาเห็ดในป่ากับเก็บเห็ด วันนึงแม่หมูไม่สบายเลยจะเอาคนมาทำงานแทน แน่นอนว่าลูกหมูก็ต้องทำได้อยู่แล้วเพราะ extends สกิลดมกลิ่นเห็ดมาจากแม่ แต่เนื่องจากลูกหมูเด็กไป แม่หมูเลยให้หมีป่ามาทำงานแทน แต่หมีป่าไม่ได้เป็นลูก เป็นญาติอะไรกับหมูเลยก็จะมีสกิลไม่เหมือนกัน แต่อยากให้หมีป่าหาเห็ดเก็บเห็ดได้ ก็ไปเขียน interface มาแล้วให้หมีอิมพลีเมนต์สกิลนี้ไป หมีป่าก็จะทำงานแทนแม่หมูได้

 



[1] ใส่คำสั่งอะไรก็ได้ลงไป ไม่ใส่ก็ต้องเขียนว่างไว้ก็ได้ คือใส่ { } หลังเมท็อดไว้เฉยๆ



บทความนี้อาจจะมีที่ผิด กรุณาตรวจสอบก่อนใช้

หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor

ไม่อยากอ่าน Tutorial อยากมาเรียนเลยทำอย่างไร?

สมัครเรียน ONLINE ได้ทันทีที่ https://elearn.expert-programming-tutor.com

หรือติดต่อ

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM

แผนที่ ที่ตั้งของอาคารของเรา

C Article


C++ Article


Java Article


C#.NET Article


VB.NET Article


Python Article


Golang Article


JavaScript Article


Perl Article


Lua Article


Rust Article


Article


Python


Python Numpy


Python Machine Learning



แผนผังการเรียนเขียนโปรแกรม

Link อื่นๆ

Allow sites to save and read cookie data.
Cookies are small pieces of data created by sites you visit. They make your online experience easier by saving browsing information. We use cookies to improve your experience on our website. By browsing this website, you agree to our use of cookies.

Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com

ติดต่อเราได้ที่

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
แผนที่ ที่ตั้งของอาคารของเรา