Access Modifiers
ในบทนี้ เราจะพูดเกี่ยวกับ Access Modifiers ในภาษา Java ซึ่งเป็นคำสั่งที่ใช้กำหนดการเข้าถึงในโปรแกรม
Access Modifiers เป็นคำสั่งในการควบคุมระดับการเข้าถึงของตัวแปรหรือเมธอดที่อยู่ภายในคลาส เหมือนที่คุณได้เห็นในการสร้างคลาสหลัก ชื่อของคลาสและไฟล์ต้องตรงกัน และต้องกำหนดการเข้าถึงให้เป็นแบบ public
ซึ่งทำให้คลาสนี้สามารถเข้าถึงได้จากที่ทุกของโปรแกรม นอกจากนี้ Access Modifiers ยังเป็นคำสั่งที่ใช้ในการกำหนดการเข้าถึงของออบเจ็คต่างๆ ใน Package เช่น คลาส และ Interfaces เป็นต้น
ต่อมาเราจะมาพูดถึงระดับสมาชิก (member level) ซึ่งมันจะมาพร้อมกับการกระกาศตัวแปรที่คุณเคยเห็นในตัวอย่างก่อนหน้าแล้ว เช่น
private int width;
private int height;
public int calArea () {
return width * height;
}
ในภาษา Java นั้นมีคำสั่งในการควบคุมระดับการเข้าถึงอยุ่ 4 ระดับด้วยกัน คือ public, protected, private และ no modifier (ไม่ต้องกำหนด) โดยแต่ละรูปแบบนั้นมีความหมายดังนี้
- public: คลาสหรือสมาชิกสามารถเข้าถึงได้จากที่ส่วนของโปรแกรม
- protected: คลาสหรือสมาชิกสามารถเข้าถึงได้ภายใน package เดียวกันและ sub class ของมัน
- no modifier (ไม่กำหนด): คลาสหรือสมาชิกสามารถเข้าถึงได้ภายใน package เดียวกัน และภายในคลาสเดียวกันเท่านั้น
- private: คลาสหรือสมาชิกสามารถเข้าถึงได้ภายในคลาสเดียวกันเท่านั้น
จากคำอธิบายข้างบน เราสามารถนำมาเขียนเป็นตารางการเข้าถึงของคำสั่งทั้งหมดได้ดังนี้ โดยที่ public เป็นการเข้าถึงที่เป็นสาธารณะมากที่สุด และ private นั้นปิดกั้นที่สุด
Modifiers | Class | Package | Sub class | World |
---|---|---|---|---|
public | Yes | Yes | Yes | Yes |
protected | Yes | Yes | Yes | No |
no modifier | Yes | Yes | No | No |
private | Yes | No | No | No |
ต่อไปมาดูตัวอย่างการใช้งาน Access Modifier กับการเขียนโปรแกรมในภาษา Java
public class TestFruit {
public static void main (String[] args) {
Fruit fr = new Fruit();
fr.name = "Grape";
fr.flavor = "sour";
fr.setColor("green");
System.out.println("Fruit name: " + fr.name);
System.out.println("Flavor: " + fr.flavor);
System.out.println("Color: " + fr.getColor());
}
}
class Fruit {
public String name;
String flavor;
private String color;
public String getColor () {
return color;
}
public void setColor (String c) {
color = c;
}
}
ในตัวอย่าง เป็นการใช้ access modifier แบบต่างๆ ในตอนแรก เราได้สร้างคลาส Fruit
ที่มีสมาชิกทั้งตัวแปรและเมธอดที่มีระดับการเข้าถึงในแบบต่างๆ
Fruit fr = new Fruit();
fr.name = "Grape";
fr.flavor = "sour";
fr.setColor("green");
ต่อมาเราสร้างออบเจ็ค Fruit ที่มีชื่อว่า fr
โดยคุณสังเกตุว่าออบเจ็คที่เราสร้างนั้นอยู่ในคลาส TestFruit นั่นหมายความว่าเราไม่สามารถเข้าถึงตัวแปร color
ได้ เพราะมันมี access modifier แบบ private ซึ่งสามารถเข้าถึงได้ภายในคลาสเท่านั้น เราจึงเข้าถึงมันผ่าน public เมธอด getColor ()
และ setColor ()
ซึ่งอยู่ภายในคลาสเดียวกัน
สำหรับตัวแปร name
และ flavor
เราสามารถเข้าถึงได้ผ่านตัวแปรออบเจ็คโดยตรง เพราะพวกเขามี access modifier เป็นแบบ public
ซึ่งสามารถเข้าถึงจากภายนอกได้
Fruit name: Grape
Flavor: sour
Color: green
และนี่เป็นผลลัพธ์ของโปรแกรม
การเข้าถึงแบบ Public
ต่อไปเป็นตัวอย่างเพิ่มเติมในการใช้ Access modifiers รูปแบบต่างๆ ในการกำหนดการเข้าถึงของโปรแกรมภายในคลาส โดยเราจะเริ่มกับคำสั่ง public ซึ่งเป็นการกำหนดการเข้าถึงแบบสาธารณะ
class Person {
public String firstName;
public String lastName;
protected int age;
private int height;
public String getFullname() {
return firstName + " " + lastName;
}
public void setHeight(int h) {
height = h;
}
public int getHeight() {
return height;
}
}
public class PublicExample {
public static void main(String[] args) {
Person p1 = new Person();
p1.firstName = "Shawn";
p1.lastName = "Roberts";
p1.age = 32;
p1.setHeight(178);
System.out.println(p1.getFullname());
System.out.println("Age " + p1.age + " years");
System.out.println("Height " + (p1.getHeight() / 100.0f) + " m");
}
}
ในตัวอย่าง เราได้สร้างคลาส Person
สำหรับเก็บข้อมูลของบุคคล ที่ประกอบไปด้วยตัวแปร firstName
และ lastName
ที่มีการกำหนดการเข้าถึงเป็นแบบ public
และเมธอดภายในคลาสนั้นเป็นแบบ public
ทั้งหมด จึ่งทำให้พวกมันสามารถเข้าถึงผ่านออบเจ็คได้ เช่น p1.firstName
เป็นต้น
การเข้าถึงแบบ Protected และ Private
ต่อไปเป็นการใช้งานตัวแปร age
ซึ่งมีการกำหนดการเข้าถึงแบบ protected
การกำหนดการเข้าถึงแบบนี้ใช้กับการใช้งานในการสืบทอดของคลาส เมื่อคุณได้ทำการสืบทอดคลาสใดๆ สมาชิกทั้งหมดของคลาสยกเว้นที่มีการกหนดการเข้าถึงเป็นแบบ Private จะไม่ถูกสืบทอด ดังนั้นในตัวอย่างเราไม่สามารถเข้าถึงสมาชิกที่เป็น Private ผ่านตัวแปรออบเจ็ค p1
ได้
Shawn Roberts
Age 32 years
Height 1.78 m
นี่เป็นผลลัพธ์การทำงานของโปรแกรม ในการกำหนดการเข้าถึงของโปรแกรม
ในบทนี้ คุณได้เรียนรู้กับ access modifier แบบต่างๆ ในภาษา Java ซึ่งจะมีการกำหนดการเข้าถึงตัวแปรในระดับที่ต่างกัน โดยเนื้อหาในบทนี้นั้นสำคัญกับแนวคิดในการทำ Encapsulation (การห่อหุ้มข้อมูล)