เหตุใด Strings จึงไม่เปลี่ยนรูปใน Java
Source: Dev.to ก่อนที่จะทำความเข้าใจว่าทำไม Strings ถึงไม่เปลี่ยนรูปใน Java เราต้องคิดก่อนว่าทำไมเราถึงสร้างบางสิ่งที่ไม่เปลี่ยนรูป ไม่เปลี่ยนรูป หมายความว่า เมื่อสร้างขึ้นแล้ว เราไม่สามารถเปลี่ยนแปลงมันได้ เหตุผลเดียวที่เรานึกถึงการสร้างสิ่งที่ไม่เปลี่ยนรูปได้ก็เพื่อการซิงโครไนซ์เมื่อใช้ร่วมกัน นี่คือสาเหตุที่ทำให้สตริงไม่เปลี่ยนรูป ใน Java อ็อบเจ็กต์Stringจะถูกแชร์และแคชใน String Pool เป็นตำแหน่งเฉพาะบนฮีปที่เก็บสตริงและใช้ร่วมกันระหว่างหลายเธรดหากมีค่าเท่ากัน ตัวอย่างเช่น: ในพูลสตริง หากมีสตริงที่มีค่า "test" อยู่แล้ว และโปรแกรมต้องการสร้างออบเจ็กต์สตริงอื่นที่มีค่าเดียวกัน ก็จะได้รับการอ้างอิงเดียวกันแทนที่จะสร้างออบเจ็กต์สตริงใหม่ ตอนนี้เรารู้แล้วว่าสตริงถูกจัดเก็บบนฮีปอย่างไร มาดูกันว่าทำไมพวกเขาถึงไม่เปลี่ยนแปลง-
เหตุผลแรกของความไม่เปลี่ยนรูปคือความปลอดภัยของเธรด เนื่องจากแถวต่างๆ ถูกใช้ร่วมกันระหว่างหลายๆ เธรดในพูลแถว เราจึงต้องจำกัดเธรดแบบสุ่มใดๆ เพื่อเปลี่ยนแปลง การเปลี่ยนแปลงแถวอาจส่งผลต่อเธรดอื่นที่เข้าถึงแถวเดียวกัน หากเธรดต้องการอัพเดตค่าของแถว เธรดนั้นจำเป็นต้องสร้างแถวอื่นและอ้างอิงเธรดนั้น
-
โดยปกติ แล้วเราใช้Stringเป็นกุญแจสำคัญในMap หากสตริงไม่แน่นอน ใครๆ ก็สามารถเปลี่ยนค่าของสตริงได้ และเราจะสูญเสียคีย์จริงไป
อินเทอร์เฟซใน Java และการสืบทอดหลายรายการ
ที่มา: Dev.to มาทำความเข้าใจกันว่า Multi Inheritance คืออะไร การสืบทอดหลายรายการเป็นคุณลักษณะของภาษาโปรแกรมเชิงวัตถุบางภาษา ซึ่งวัตถุหรือคลาสสามารถสืบทอดฟังก์ชันการทำงานจากวัตถุหลักหรือคลาสหลักมากกว่าหนึ่งรายการได้ ดังที่แสดงในภาพด้านบน คลาสลูกที่สืบทอดหลายคลาสสามารถมีคลาสพื้นฐานได้ตั้งแต่สองคลาสขึ้นไป แต่เพื่อให้บรรลุเป้าหมายนี้ เราจำเป็นต้องมีอินเทอร์เฟซอินเตอร์เฟซ
อินเทอร์เฟซใน Java คือพิมพ์เขียวของคลาส มีค่าคงที่คงที่และวิธีการเชิงนามธรรม นั่นคืออินเทอร์เฟซสามารถมีเมธอดและตัวแปรเชิงนามธรรมเท่านั้น ไม่สามารถมีเนื้อความของเมธอดได้ ไม่สามารถสร้างได้ในลักษณะเดียวกับคลาสนามธรรมแล้วเราจะประกาศเนื้อหาของวิธีการเหล่านี้ที่ไหน?
เนื้อความของวิธีการถูกประกาศภายในคลาสที่ต้องการวิธีการตามความต้องการของโปรแกรมเมอร์จะประกาศอินเทอร์เฟซได้อย่างไร?
สามารถประกาศอินเทอร์เฟซได้โดยใช้ คีย์เวิร์ด อินเทอร์เฟ ซ ไวยากรณ์:interface interface_name {abstract methods}
บันทึก
เพื่อที่จะใช้อินเทอร์เฟ ซ ที่ประกาศไว้ในคลาส เราต้องใช้ คีย์เวิร์ด Implementsการนำไปปฏิบัติ?
อันดับแรก เราจะสร้างprint interface และภายในนั้น เราจะสร้าง abstract print() method ;interface printgib{
void print();
}
ตอนนี้เรามีอินเทอร์เฟซที่พร้อมสำหรับคลาสที่จะใช้ ดังนั้นเรามาสร้างคลาสabcและgkและใช้งานอินเทอร์เฟซในคลาสเหล่านั้นกันดีกว่า
public class abc implements printgib{
public void print(){ //1st implementation of print
System.out.println("I love you 3000");
}
public static void main(String[] args){
abc obj = new abc();
gk obj1 = new gk();
obj.print();
obj1.print();
}
}
class gk implements printgib{
public void print(){ //2nd implementation of print
System.out.println("I am Gk");
}
}
ดังที่แสดงในโค้ดข้างต้น เราได้รับมรดกหลายรายการและใช้งานอินเทอร์เฟซ ตอนนี้เพื่อรันโค้ด บันทึกไฟล์และ...
javac file_name.java
java abc
GO TO FULL VERSION