Biến và Phương thức Lớp
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| static variable/ˈstætɪk ˈveərɪəbl/ | biến tĩnh |
| static method/ˈstætɪk ˈmeθəd/ | Phương thức tĩnh |
Hai đối tượng, một lần đếm xây dựng
- Ada và Bo có điểm số riêng, nhưng tạo bất kỳ học sinh nào cũng tăng cùng biến tĩnh,
Student.count. Sau hai lần xây dựng, số đếm là 2; thay đổi điểm của Ada không làm thay đổi điểm của Bo. - So sánh những gì mỗi giá trị mô tả: một điểm số mô tả một học sinh, trong khi bộ đếm này mô tả các lần xây dựng của lớp. Một tham chiếu sao chép của Ada không tạo ra đối tượng mới và không tăng bộ đếm.
Đặt từng trường đúng mức
- Một trường thực thể có vị trí lưu trữ riêng biệt trong mỗi đối tượng. Một trường tĩnh có một vị trí lưu trữ cho class đã tải này, ngay cả trước khi bất kỳ đối tượng nào được xây dựng;
privatekiểm soát quyền truy cập, không phải số lượng bản sao. - Trong ví dụ đơn luồng nhỏ này, constructor tăng
countmột lần cho mỗi lần xây dựng. Nó đếm các đối tượng đã được xây dựng, không phải các đối tượng vẫn còn sống: mất đi tham chiếu không tự động giảm nó.
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; }
}
Một biến đếm tĩnh dùng chung
count là một giá trị dùng chung, thuộc sở hữu của lớp.
Một biến tĩnh (lớp) là...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
static nghĩa là một bản sao dùng chung thuộc sở hữu của lớp.
Nếu constructor thực hiện count++ và count bắt đầu từ 0, count sẽ bằng bao nhiêu sau khi tạo 3 đối tượng?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Mỗi lần xây dựng tăng biến đếm dùng chung lên → 3.
Một phương thức tĩnh không có người nhận
- Một phương thức tĩnh không có đối tượng hiện tại ngầm định, vì vậy nó không thể sử dụng
thishoặc một trường thực thể không được phân qualif nhưscore.getCount()có thể đọccountvì trường đó thuộc về class. - Static không cấm làm việc với các đối tượng.
readScore(Student s)nhận được một tham chiếu đối tượng rõ ràng và đọcs.score; nó nằm bên trongStudent, nơi truy cập vào trường riêng tư đó được phép. Ở đâysphải không phải null.
return score; bên trong một phương thức tĩnh là lỗi biên dịch trong class này. return s.score; bên trong phương thức tĩnh được hiển thị là hợp lệ: tham chiếu xác định điểm số của học sinh nào cần đọc.
Bên trong class Student được hiển thị, một phương thức tĩnh có thể sử dụng return score; mà không cần chỉ định bất kỳ đối tượng Student nào.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Sai: score là trường dữ liệu thực thể và phương thức tĩnh này không có người nhận ngầm định. Với tham số s có giá trị khác null, return s.score; là hợp lệ bên trong Student.
Bên trong Student, phương thức tĩnh nào có thể đọc điểm của tham số s có giá trị khác null?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Tham chiếu rõ ràng s xác định đối tượng; chính bản thân Student có thể truy cập trường score riêng tư của đối tượng đó.
Theo dõi lời gọi class và đối tượng
- Sau
Student a = new Student(50);vàStudent b = new Student(75);,Student.getCount()là 2,a.getScore()là 50 vàb.getScore()là 75.a.setScore(60)chỉ thay đổi điểm của Ada. Student.readScore(a)sau đó trả về 60 mà không xây dựng thêm học sinh nào. Phương thức là static, nhưng tham số rõ ràng của nó xác định một đối tượng đã tồn tại mà trạng thái của nó đọc được.
Một phương thức thực thể như getScore() được gọi trên...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Các thành viên thực thể hoạt động trên một đối tượng cụ thể.
Tách cú pháp hợp lệ khỏi phong cách rõ ràng
- Prefer
Student.getCount()để cho thấy phương thức thuộc về lớp. Java cũng cho phépa.getCount()cho phương thức tĩnh này; cú pháp đó không làm cho count trở nên cụ thể cho Ada. a.getScore()là một lời gọi thực thể với Ada là đối tượng nhận.Student.getScore()không hợp lệ ở đây vì phương thức cần một đối tượng và không phải là tĩnh; hãy chọn loại trường (field) và loại phương thức dựa trên trách nhiệm của chúng.
Lời gọi nào thể hiện tốt nhất rằng getCount() là phương thức tĩnh của Student?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Student.getCount() rõ ràng đặt tên lớp. Java cũng cho phép student.getCount() cho phương thức tĩnh, nhưng cách viết này làm mờ đi ý nghĩa cấp độ lớp của nó.
Dự đoán bản sao tham chiếu
- Bắt đầu với hai sinh viên được tạo,
Student alias = a;giữ nguyên số lượng xây dựng ở mức 2.alias.setScore(90)thay đổi đối tượng hiện có của Ada, do đóa.getScore()sẽ là 90 và điểm của Bo vẫn giữ nguyên ở mức 75. - Đếm số lần thực thi
new Student(...), sau đó theo dõi trạng thái của từng đối tượng riêng biệt. Neither một lời gọi truy cập nor một phép gán tham chiếu nào đều tạo ra một sinh viên, và một phương thức tĩnh vẫn có thể đọc một đối tượng được cung cấp rõ ràng.
Các trường static lưu trữ trạng thái lớp; các trường instance lưu trữ trạng thái đối tượng. Các phương thức static không có this, nhưng có thể sử dụng các tham chiếu đối tượng rõ ràng. Ưu tiên gọi static có qualifcation bởi lớp và phân biệt số lượng khởi tạo với số lượng đối tượng đang sống.
Hai sinh viên đã được khởi tạo, nên count là 2. Sau đó chạy lệnh Student alias = a; và alias.setScore(90);. Giá trị trả về của Student.getCount() là gì?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Cả việc gán tham chiếu lẫn thay đổi điểm đều không thực thi constructor. Count vẫn giữ nguyên là 2.
Bộ đếm constructor này tự động giảm khi mất tham chiếu đến một sinh viên.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Chỉ có mã thay đổi count mới làm thay đổi nó. Ví dụ này đếm số lần khởi tạo và không cung cấp cơ chế giảm.