Scope and Access
แนะนำใหม่| English | ความหมาย |
|---|---|
| local variable/ˈləʊkl ˈveərɪəbl/ | ตัวแปรท้องถิ่น |
| scope/skəʊp/ | สโคป |
| shadows/ˈʃædəʊz/ | การบดบังตัวแปร |
ตัวแปรท้องถิ่นรีเซ็ต; ฟิลด์จดจำ
- Method สร้าง
int count = 0;, เพิ่มมัน และคืนค่า 1. การเรียก该方法 twice จะคืนค่า 1 ทั้งสองครั้งเพราะแต่ละ invocation มี local variable ใหม่ - Method ที่เพิ่ม field ของ object แทนจะคืนค่า 1 แล้ว 2 สำหรับ object ที่มีค่าเริ่มต้นเป็นศูนย์เดียวกัน. แยกแยะว่า name ใช้งานได้ที่ไหน vs สถานะที่เก็บไว้นานเท่าไร
ขอบเขตเกี่ยวข้องกับชื่อในโค้ดต้นฉบับ
- ขอบเขตของการประกาศคือส่วนหนึ่งของโปรแกรมที่ชื่อของมันสามารถใช้ได้ ตัวแปรที่เป็น block local อยู่ในขอบเขตตั้งแต่การประกาศจนถึงส่วนที่เหลือของ block; ตัวแปรสำหรับลูปไม่สามารถใช้ได้หลังจากลูปนั้น
- ขอบเขต, สิทธิ์เข้าถึงและอายุขันธ์ตอบคำถามที่แตกต่างกัน ชื่ออาจอยู่นอกขอบเขตแม้ว่าวัตถุที่มันเคยอ้างอิงจะยังคงเข้าถึงได้ผ่านอ้างอิงอื่น; ฟิลด์ไม่ถูกควบคุมโดยกฎการประกาศเดียวกับตัวแปรที่เป็น block local
กำหนดค่าตัวแปรท้องถิ่นก่อนอ่านค่า
- ตัวแปรท้องถิ่น (local variable) ถูกประกาศภายในเมทოდหรือบล็อก Java ต้องการให้มีการกำหนดค่าที่แน่นอนก่อนจะอ่านค่า;
int x; return x;เป็นข้อผิดพลาดในการคอมไพล์ ไม่ใช่การกลับคืนค่าเป็นศูนย์โดยอัตโนมัติ - ฟิลด์ของอินสแตนซ์จะได้รับค่าเริ่มต้นในระหว่างกระบวนการสร้างวัตถุ ก่อนที่โค้ดเริ่มต้นและคอนสตรักเตอร์จะทำงาน ในตัวอย่างนี้ count เริ่มต้นที่ 0; ฟิลด์นี้เป็นของวัตถุแต่ละตัวและคงอยู่ระหว่างการเรียกใช้เมทอดต่างๆ ของวัตถุนั้น
public class ScopeCounter {
private int count;
public int localCount() {
int count = 0;
count++;
return count;
}
public int rememberedCount() {
count++;
return count;
}
public void setCount(int count) {
this.count = count;
}
public static int readCount(ScopeCounter other) {
return other.count;
}
}
การประกาศตัวแปรในท้องถิ่น int x; จะกำหนดค่าเริ่มต้นเป็นศูนย์ให้ x โดยอัตโนมัติ ดังนั้น return x; จึงสามารถคอมไพล์ได้
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ตัวแปรในท้องถิ่นต้องได้รับค่าอย่างชัดเจนก่อนนำไปใช้; ค่าเริ่มต้นของฟิลด์ไม่ครอบคลุมตัวแปรในท้องถิ่น
พารามิเตอร์สามารถบดบังชื่อฟิลด์ได้
- พารามิเตอร์
countในsetCount(int count)บดบัง (shadows) ฟิลด์สำหรับการเข้าถึงด้วยชื่อนั้นโดยไม่ระบุชื่อcount = count;จะกำหนดค่าพารามิเตอร์ให้กับตัวเอง;this.count = count;จะอัปเดตฟิลด์ของตัวรับ (receiver) - ตัวแปรท้องถิ่นก็สามารถบดบังฟิลด์ได้ เช่น localCount แสดงให้เห็น อย่าสรุปว่าทุกการประกาศตัวแปรท้องถิ่นซ้ำกันนั้นอนุญาต: การประกาศซ้ำตัวแปรท้องถิ่นที่มีอยู่ในขอบเขตแล้วในบล็อกซ้อนภายในเมทอดเดียวกันจะเป็นข้อผิดพลาดในการคอมไพล์
The scope of a variable is...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Scope is where the name is valid.
หลังจากการเรียกใช้วิธีธรรมดาเสร็จสิ้น ผู้เรียกใช้สามารถใช้ตัวแปรท้องถิ่นที่ประกาศไว้เฉพาะภายในวิธีนั้นด้วยชื่อท้องถิ่นได้หรือไม่?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ชื่อท้องถิ่น不属于ขอบเขตของผู้เรียกใช้ วัตถุที่ถูกอ้างอิงโดยชื่อนั้นแม้ว่าจะถูกส่งกลับออกมาแต่ก็ยังคงเข้าถึงได้
ประเภทของตัวแปรใดควรเก็บสถานะที่วัตถุต้องจดจำระหว่างครั้งของการเรียกใช้วิธี?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Instance variables persist for the object's lifetime.
พารามิเตอร์ที่มีชื่อเดียวกับinstance variable จะบัง (shadow) instance variable นั้นภายในวิธีการ
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ภายในวิธีการ ชื่อหมายถึงพารามิเตอร์; ใช้ this เพื่อเข้าถึงฟิลด์
เมื่อพารามิเตอร์บังinstance variable ที่มีชื่อเดียวกัน จะเรียกว่า ___ มัน (หนึ่งคำ)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Shadowing hides the field behind the local name.
การเข้าถึงขึ้นอยู่กับคลาสผู้ประกาศ
- โค้ดภายใน ScopeCounter สามารถอ่าน count แบบส่วนตัวของวัตถุ ScopeCounter อื่นผ่านอ้างอิงอย่างชัดเจน เมทოდ readCount แบบ static ที่แสดงไม่มี
thisแต่other.countนั้นถูกต้องสำหรับพารามิเตอร์ที่ไม่เป็น null - คลาสภายนอกที่ไม่เกี่ยวข้องไม่สามารถอ่านฟิลด์แบบส่วนตัวโดยตรงได้ การเข้าถึงแบบส่วนตัวไม่จำกัดอยู่ที่ "เฉพาะวัตถุของฉันเอง"; เมทอดอินสแตนซ์มีตัวรับโดยนัย ในขณะที่เมทอดแบบ static ต้องใช้อ้างอิงอย่างชัดเจนเพื่อเข้าถึงสถานะของอินสแตนซ์
อย่ารวมขอบเขตชื่อ การเริ่มต้นค่าเริ่มต้น และการเข้าถึงแบบส่วนตัวไว้ในกฎเดียว ตัวแปรท้องถิ่นไม่ได้เริ่มที่ศูนย์โดยอัตโนมัติ ฟิลด์ของอินสแตนซ์ไม่สามารถอ่านโดยไม่ระบุชื่อจากเมทอดแบบ static ได้ และฟิลด์แบบส่วนตัวของอินสแตนซ์อื่นสามารถเข้าถึงได้ภายในคลาสผู้ประกาศ
ขอบเขต (Scope), สถานะฟิลด์ และสิทธิ์การเข้าถึง
แยกแยะคำประกาศออกจากบริบทการเข้าถึง; Instance อื่นๆ ไม่ได้ถูกปิดกั้นจากการเข้าถึงโดยอัตโนมัติ
เมธอด readCount แบบสแตติกที่แสดงข้างต้นอาจอ่านค่า other.count เมื่อ other มีค่าไม่ใช่ null
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ใช้การอ้างอิงวัตถุแบบชัดเจน และอยู่ในคลาสที่ประกาศฟิลด์ส่วนตัว ไม่จำเป็นต้องใช้ this แบบอ้อม
ทำนาย new receiver และ object ที่ถูกคืนกลับ
- หลังการเรียก rememberedCount สองครั้งบน a ฟิลด์ของมันคือ 2; b ที่สร้างใหม่ยังคงมี count 0 การเรียก a.localCount() จะส่งคืน 1 โดยไม่รีเซ็ตฟิลด์ของ a เนื่องจากจำนวนนับท้องถิ่นบดบังฟิลด์นั้น
- เมทอดสามารถสร้างวัตถุในตัวแปรท้องถิ่นและส่งคืนอ้างอิงของวัตถุนั้น ชื่อท้องถิ่นจะไม่พร้อมใช้งานสำหรับผู้เรียกใช้ แต่วัตถุที่ถูกส่งคืนยังคงถูกเข้าถึงได้; akhirของขอบเขตชื่อไม่ทำลายวัตถุนั้น
ขอบเขตบอกตำแหน่งที่ชื่อสามารถใช้งานได้ ตัวปรับการเข้าถึงควบคุมสิทธิ์; สถานะของวัตถุอาจอยู่เหนืออายุการใช้งานของอ้างอิงท้องถิ่น กำหนดค่าตัวแปรท้องถิ่นก่อนอ่าน ใช้ฟิลด์สำหรับสถานะที่จดจำต่อวัตถุ และแยกแยะการบดบังจากการเข้าถึงฟิลด์แบบส่วนตัวของวัตถุอื่น
สำหรับ ScopeCounter a ที่สร้างใหม่ ให้เรียกใช้ a.rememberedCount() สองครั้ง แล้วตามด้วย a.localCount() a.localCount() จะคืนค่าอะไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
localCount มีตัวนับท้องถิ่นใหม่เริ่มต้นเป็นศูนย์; มันเพิ่มค่าขึ้นและส่งกลับ 1 โดยไม่เปลี่ยนฟิลด์