กายวิภาคของคลาส
แนะนำใหม่| English | ความหมาย |
|---|---|
| encapsulation/ɪnˌkæpsjʊˈleɪʃn/ | การห่อหุ้ม |
| instance variables/ˈɪnstəns ˈveərɪəblz/ | ตัวแปรของอินสแตนซ์ |
-fields 私有的字段仍然需要被检查的方法
- Student 有一个私有的分数,但
public void setScore(int s) { score = s; }仍然允许调用者提供 -5。仅私有访问不能强制执行非负分数。 - 一个受保护的 setter 可以拒绝该更新。检查构造函数以及所有其他写入字段的代码;封装使验证策略更容易执行,但不会自动创建它。
การทำให้ score เป็น private จะปฏิเสธข้อมูลเชิงลบที่ถูกส่งเข้าไปใน public setter ที่ไม่มีตัวป้องกันโดยอัตโนมัติ
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ไม่ถูกต้อง: setter เป็นโค้ดระดับ class สามารถกำหนดค่าเชิงลบได้ ต้องมีการตรวจสอบ (Validation) ในตัวเอง
ส่วนประกอบสามส่วนของคลาส
- 这里的类设计包含用于数据的实例字段、用于初始设置的构造函数和用于行为的方法。这些是三个有用的部分来识别;形式上,Java 不将构造函数分类为类成员。
- 追踪一个 Student 从构造到更新:构造函数初始化其分数字段,并且一个实例方法后来读取或更改该对象的分数。静态方法则没有隐式的当前对象。
ตัวแปรออบเจกต์เก็บสถานะ
- ตัวแปรออบเจกต์ เก็บ สถานะ ของแต่ละออบเจกต์
private String name; private int score;— ประกาศภายในคลาส นอกเหนือจากเมทโอดใดๆ- แต่ละออบเจกต์ได้รับ สำเนาของตัวเอง —
scoreของนักเรียนคนหนึ่งแยกต่างหากจากของอีกคน - สิ่งเหล่านี้คงอยู่ตลอดอายุขัยของออบเจกต์ (ต่างจากตัวแปรท้องถิ่น)
私和公
- โมดิฟายเออร์การเข้าถึงควบคุมว่าใครสามารถเข้าถึงสมาชิกได้
private— 仅可在类内部使用;public— 暴露给可以访问该类的其他代码。- ตัวแปรออบเจกต์มักจะเป็น
private; เมทโอดที่ทำหน้าที่เป็นอินเตอร์เฟซจะเป็นpublic - การซ่อนข้อมูลภายในนี้เรียกว่า การห่อหุ้ม (encapsulation)
ส่วนประกอบสามส่วนใดจัดระเบียบการออกแบบ class Student ที่สอนในที่นี้?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Instance fields เก็บสถานะ Constructors เริ่มต้นวัตถุใหม่ และ Methods ให้พฤติกรรม Constructors ไม่ถือเป็นสมาชิกของ class ตามคำศัพท์ทางเทคนิคของ Java
ตัวแปรอินสแตนซ์มักถูกประกาศ...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ข้อมูลส่วนตัว + เมทอดสาธารณะ = การห่อหุ้มข้อมูล (encapsulation)
การรักษาข้อมูลให้เป็นส่วนตัวและเปิดใช้งานผ่านเมทอดเท่านั้นเรียกว่า ___ (คำเดียว)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การห่อหุ้มข้อมูลปกป้องข้อมูลของวัตถุ
วัตถุสองตัวจากคลาสเดียวกันแบ่งปันสำเนาเดียวของแต่ละตัวแปรอินสแตนซ์
Difficulty 1/5 · 100 coins + a small bonus on first completion today
วัตถุแต่ละตัวมีสำเนาของตัวเองของตัวแปรอินสแตนซ์
สำหรับ class Student ระดับบนที่แสดง اینجا Classภายนอกที่ไม่เกี่ยวข้องอาจเข้าถึง private field โดยตรง...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Private access ป้องกัน classภายนอกที่ไม่เกี่ยวข้องจากการอ่าน field โดยตรงโค้ดภายใน Student สามารถอ่าน private field ของวัตถุ Student อื่นได้
ทำไมต้องเก็บข้อมูลเป็นส่วนตัว
- 封装防止无关的外部代码直接分配私有字段。Student 内部的代码仍然可以读取或写入私有字段,包括另一个明确引用的 Student 的字段。
- ผู้ภายนอกติดต่อผ่าน เมทโอดสาธารณะ เท่านั้น ซึ่งสามารถตรวจสอบและควบคุมการเข้าถึงได้
- คุณสามารถปฏิเสธคะแนนติดลบในเมทโอดได้ แต่ตัวแปรสาธารณะไม่มีกลไกป้องกันเช่นนี้
- 具有精心选择的公共接口的私有字段支持受控更新。每个方法和构造函数仍必须实现预期的规则;返回可变内部对象也可能间接暴露更改。
เก็บตัวแปร instance private; เผยพฤติกรรมผ่าน public methods. Field public อนุญาตให้โค้ดใดๆ ตั้งค่าเป็นอะไรก็ได้ (คะแนนติดลบ, ชื่อ null) โดยไม่มีการตรวจสอบ Encapsulation ช่วยควบคุมการเข้าถึงทั้งหมดผ่าน methods ที่สามารถตรวจสอบความถูกต้องของการเปลี่ยนแปลงได้ Each object มีการจัดเก็บ instance-field แยกกัน แต่ reference fields ใน objects ที่แตกต่างกันอาจชี้ไปยัง shared object เดียวกัน ให้แยกแยะระหว่าง fields แยกต่างหากกับ objects ที่ถูก reference แยกต่างหาก
วัตถุสองวัตถุมี reference fields แยกกัน ดังนั้น fields เหล่านี้จึงต้องชี้ไปยังวัตถุที่แตกต่างกัน
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ผิด: ช่องอ้างอิงแยกต่างหากสามารถชี้ไปยังวัตถุที่เปลี่ยนแปลงได้เดียวกันได้
นักเรียนสองคนอ้างอิงถึง ArrayList ที่เริ่มต้นว่างเปล่าตัวเดียวกัน คนหนึ่งเพิ่มรายการเข้าไปหนึ่งรายการ ขนาดของรายการที่อีกฝ่ายอ้างอิงจะเห็นคือเท่าไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
การอ้างอิงทั้งสองชี้ไปยังออบเจกต์รายการเดียวกัน ซึ่งมีขนาดเป็น 1 ในตอนนี้
กายวิภาคของ Student คลัส:
- ตัวแปรออบเจกต์:
private String name; private int score; - คอนสตรัคเตอร์:
public Student(String n) { ... } - เมทโอด:
public void addScore(int s) { ... },public int getScore() { ... }
แยกการจัดเก็บ field ออกจาก objects ที่แชร์กัน
- หาก Student objects ทั้งสองจัดเก็บ reference ไปยัง ArrayList เดียวกัน field ของรายการจะแยกออกจากกันแต่รายการที่ถูก reference จะถูกแชร์ การเพิ่ม item ผ่าน reference ใดก็ตามจะเปลี่ยนรายการเดียวเท่านั้น
- การกำหนดค่าใหม่ให้ field รายการของ student คนหนึ่งไปยัง ArrayList ใหม่จะส่งผลเฉพาะต่อ field นั้นเท่านั้น เมื่อทำนายสถานะให้ติดตามลูกศร reference; private access และ object identity ตอบคำถามที่ต่างกัน
A class มี instance variables (state ของแต่ละ object), constructors (ตั้งค่า objects ใหม่), และ methods (พฤติกรรม) Instance variables มักจะเป็น private และเข้าถึงผ่าน public methods — การ encapsulation นี้ช่วยปกป้องข้อมูล Each object จัดเก็บ instance fields แยกกัน; objects ที่ถูก reference โดย fields เหล่าอาจยังคงถูกแชร์อยู่
วัตถุแต่ละตัวมีสถานะของตัวเอง
a.score และ b.score แยกกัน — วัตถุแต่ละตัวเป็นเจ้าของสถานะของตนเอง