Class Variables and Methods
แนะนำใหม่| English | ความหมาย |
|---|---|
| static variable/ˈstætɪk ˈveərɪəbl/ | ตัวแปรสตติก |
| static method/ˈstætɪk ˈmeθəd/ | เมทโด้แบบสติก |
สองออบเจ็กต์ จำนวนการสร้างหนึ่งครั้ง
- Ada และ Bo มีคะแนนแยกกัน แต่การสร้างนักเรียนคนใดคนหนึ่งจะเพิ่ม ตัวแปร static เดียวกัน ซึ่งคือ
Student.countหลังจากการสร้างสองครั้ง ตัวนับจะเป็น 2; การเปลี่ยนคะแนนของ Ada จะไม่เปลี่ยนคะแนนของ Bo - เปรียบเทียบสิ่งที่แต่ละค่าอธิบาย: คะแนนอธิบายนักเรียนคนเดียว ในขณะที่ตัวนับนี้อธิบายการสร้างของคลาส รีเฟอเรนส์ที่ถูกคัดลอกจาก Ada ไม่ได้สร้างออบเจ็กต์ใหม่และไม่เพิ่มตัวนับ
วางฟิลด์แต่ละตัวในระดับที่เหมาะสม
- ฟิลด์แบบอินสแตนซ์มีตำแหน่งจัดเก็บแยกต่างหากในออบเจ็กต์แต่ละตัว ฟิลด์แบบ static มีตำแหน่งจัดเก็บเดียวสำหรับคลาสนี้ที่ถูกโหลด แม้ก่อนการสร้างออบเจ็กต์ใดๆ;
privateควบคุมการเข้าถึง ไม่ใช่จำนวนสำเนา - ในตัวอย่างเล็กๆ แบบ thread เดียวนี้ Constructor เพิ่ม
countครั้งละหนึ่งต่อ每一次การสร้าง มันนับจำนวนออบเจ็กต์ที่ถูกสร้าง ไม่ใช่จำนวนออบเจ็กต์ที่ยังมีชีวิตอยู่: การสูญเสียรีเฟอเรนส์จะไม่ลดตัวนับลงอัตโนมัติ
class Student {
private int score;
private static int count = 0;
public Student(int initialScore) {
score = initialScore;
count++;
}
public int getScore() { return score; }
public void setScore(int newScore) { score = newScore; }
public static int getCount() { return count; }
public static int readScore(Student s) { return s.score; }
}
One shared static count
count is one shared value, owned by the class.
A static (class) variable is...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
static means one shared copy owned by the class.
If the constructor does count++ and count starts at 0, what is count after creating 3 objects?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Each construction increments the shared count → 3.
วิธี static ไม่มีตัวรับ
- วิธีแบบ statis ไม่มีวัตถุปัจจุบันโดยนัย ดังนั้นจึงไม่สามารถใช้
thisหรือฟิลด์ของอินสแตนซ์ที่ไม่มีการระบุชื่อเช่นscoreได้getCount()สามารถอ่านcountได้เนื่องจากฟิลด์นั้นเป็นของคลาส - Statis ไม่ห้ามการทำงานกับวัตถุ
readScore(Student s)รับอ้างอิงวัตถุแบบชัดแจ้งและอ่านs.score; อยู่ภายในStudentซึ่งอนุญาตให้เข้าถึงฟิลด์ส่วนตัวนั้น ในที่นี้sต้องไม่เป็น null
return score; ภายในวิธีแบบ statisเป็นข้อผิดพลาดในการคอมไพล์ในคลาสนี้ return s.score; ภายในวิธีแบบ statisที่แสดงไว้ถูกต้อง: อ้างอิงระบุว่าจะอ่านคะแนนของนักศึกษาคนใด
ภายใน Student class ที่แสดง เมทโธด static อาจใช้ return score; โดยไม่ต้องระบุวัตถุ Student ใดๆ
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ผิด: score เป็นฟิลด์ของอินสแตนซ์ และเมทโธด static นี้ไม่มี receiver โดยนัย ด้วยพารามิเตอร์ s ของประเภท Student ที่ไม่ใช่ null return s.score; จึงถูกต้องภายใน Student
ภายใน Student เมทโธด static哪一种สามารถอ่านค่า score ของพารามิเตอร์ s ที่ไม่ใช่ null ได้?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การอ้างอิงอย่างชัดเจน s ชี้ถึงวัตถุ; ตัว Student เองสามารถเข้าถึงฟิลด์ score แบบส่วนตัวได้
ติดตามการเรียกใช้คลาสและวัตถุ
- หลัง
Student a = new Student(50);และStudent b = new Student(75);,Student.getCount()คือ 2,a.getScore()คือ 50 และb.getScore()คือ 75.a.setScore(60)เปลี่ยนเฉพาะคะแนนของ Ada Student.readScore(a)แล้วกลับค่า 60โดยไม่สร้างนักศึกษานอกเหนือไปจากเดิม วิธีนี้เป็นวิธีแบบ statis แต่พารามิเตอร์แบบชัดแจ้งระบุถึงวัตถุที่มีอยู่ซึ่งมันอ่านสถานะ
An instance method like getScore() is called on...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Instance members act on a specific object.
แยกไวยากรณ์ที่ถูกต้องออกจากสไตล์ที่ชัดเจน
- ควรเลือก
Student.getCount()เพื่อแสดงว่า该方法เป็นของคลาส Java ยังอนุญาตให้ใช้a.getCount()สำหรับวิธีแบบ statisนี้ ไวยากรณ์ดังกล่าวไม่ทำให้จำนวนนับเฉพาะสำหรับ Ada a.getScore()เป็นการเรียกใช้แบบอินสแตนซ์ที่มี Ada เป็นผู้รับStudent.getScore()ไม่ถูกต้องในที่นี้เพราะ该方法ต้องการวัตถุและไม่ใช่วิธีแบบ statis; เลือกประเภทฟิลด์และวิธีการตามความรับผิดชอบ
การเรียกใช้ใดแสดงให้เห็น最好ว่า getCount() เป็นเมทโธด static ของ Student?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Student.getCount() ชี้ชื่อคลาสอย่างชัดเจน Java ยังอนุญาตให้ใช้ student.getCount() สำหรับเมทโธด static แต่รูปแบบนี้ทำให้ความหมายระดับคลาสเบลอลง
คาดการณ์การคัดลอกอ้างอิง
- เริ่มจากนักเรียนที่สร้างมาสองคน,
Student alias = a;ปล่อยจำนวนการสร้างไว้ที่ 2.alias.setScore(90)เปลี่ยน object ของ Ada ที่มีอยู่, ดังนั้นa.getScore()คือ 90 และคะแนนของ Bo ยังคงเป็น 75 - นับจำนวนการใช้งาน
new Student(...), แล้วติดตามสถานะของแต่ละวัตถุแยกกัน การเรียกใช้ตัวเข้าถึงหรือการกำหนดค่าอ้างอิงไม่ได้สร้างนักศึกษานอกเหนือไปจากเดิม และวิธีแบบ statisยังสามารถอ่านวัตถุที่จัดส่งแบบชัดแจ้งได้
ฟิลด์แบบ statisเก็บสถานะของคลาส; ฟิลด์แบบอินสแตนซ์เก็บสถานะของวัตถุ วิธีแบบ statisไม่มี this, แต่สามารถใช้อ้างอิงวัตถุแบบชัดแจ้งได้ ควรเลือกการเรียกใช้วิธีแบบ statisที่มีคำคุณนามของคลาสและแยกแยะระหว่างจำนวนการสร้างกับจำนวนวัตถุที่มีชีวิต
มีการสร้างนักศึกษาไปแล้วสองคน ดังนั้น count คือ 2 จากนั้น executes Student alias = a; และ alias.setScore(90); ค่าที่ได้จาก Student.getCount() คืออะไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
ทั้งการกำหนดค่าอ้างอิงและการเปลี่ยนคะแนนไม่ได้เรียกใช้ constructor ค่า count ยังคงอยู่ที่ 2
ตัวนับ constructor นี้จะลดลงโดยอัตโนมัติเมื่อมีการสูญเสียการอ้างอิงไปยังนักเรียน
Difficulty 1/5 · 100 coins + a small bonus on first completion today
มีเพียงโค้ดที่เปลี่ยน count เท่านั้นที่จะทำให้มันเปลี่ยนแปลง ตัวอย่างนี้จับจำนวนการสร้างและไม่ได้มีค่าลดทอน