Có một mã được đưa ra như một nhiệm vụ cho một nhà phát triển Java cơ sở. Tôi sử dụng Java trong năm năm và đoạn mã này hoàn toàn khó hiểu cho tôi:Java: chuỗi khởi tạo của đối tượng
public class Main {
String variable;
public static void main(String[] args) {
System.out.println("Hello World!");
B b = new B();
}
public Main(){
printVariable();
}
protected void printVariable(){
variable = "variable is initialized in Main Class";
}
}
public class B extends Main {
String variable = null;
public B(){
System.out.println("variable value = " + variable);
}
protected void printVariable(){
variable = "variable is initialized in B Class";
}
}
Kết quả sẽ là:
Hello World!
variable value = null
Nhưng nếu chúng ta thay đổi String variable = null;
-String variable;
chúng ta sẽ có:
Hello World!
variable value = variable is initialized in B Class
Kết quả thứ hai rõ ràng hơn đối với tôi. Vì vậy, như xa như tôi biết trình tự của inizialisation trong Java như thế này:
- Chúng tôi đi vào thư mục gốc của hệ thống phân cấp lớp (cho Java nó luôn Object class), khi chúng tôi đến lớp cha mẹ gốc này :
- Tất cả các trường dữ liệu tĩnh được khởi tạo;
- Tất cả các bộ khởi tạo trường tĩnh và khối khởi tạo tĩnh được thực thi;
- Tất cả các trường dữ liệu không tĩnh được khởi tạo;
- Tất cả các trình khởi tạo trường không tĩnh và các khối khởi tạo không tĩnh được thực thi;
- Hàm tạo mặc định được thực hiện;
- Sau đó, chúng tôi lặp lại quy trình cho lớp con cơ bản.
Cũng có bài trong đó mô tả hành vi của các từ khóa this
trong bối cảnh của một lớp cha - Calling base class overridden function from base class method
Dựa trên các quy tắc đưa ra ở trên, tôi giả sử có chuỗi như thế này:
- Chúng ta sẽ tạo một thể hiện mới của lớp
B
; - Chúng tôi chuyển đến lớp học
Main
; - Khởi tạo
main.variable
bằng không; - Sau đó, chúng tôi chuyển sang hàm tạo mặc định của lớp
Main
; - Phương thức gọi phương thức xây dựng
b.printVariable()
trong lớpMain
; (Tại sao nó không gọimain.printvariable
Chúng tôi không cóthis
từ khóa ở đây?). - Trường
b.variable
"biến được khởi tạo trong B Class" - Bây giờ chúng ta trở về với lớp
B
; - Chúng tôi phải khởi tạo trường
b.variable
với giá trị null, tôi có đúng không ?; - Các constructor mặc định của lớp
B
thực hiện
Xin vui lòng, ai đó có thể đưa ra một giải thích đầy đủ và đầy đủ về cách chuỗi inizialisation thừa kế này làm việc.Và tại sao thay đổi String variable = null;
thành String variable;
dẫn đến đầu ra khác.
printVariable() là một tên phương pháp khá gây hiểu nhầm - nên được nhiều hơn như setVariable () – Jimmt
Bạn đã viết java được 5 năm và bạn không biết cách sử dụng trình gỡ rối? (Bước qua mã của bạn sẽ cho bạn thấy chính xác những gì đang xảy ra và theo thứ tự nào). –
@BrianRoach Chắc chắn tôi có thể sử dụng trình gỡ lỗi và tôi cũng đã thử javap -v -c B.class. Nhưng mỗi khi tôi thấy các nhiệm vụ như vậy đối với một nhà phát triển java hoặc câu hỏi phỏng vấn, tôi cố gắng dự đoán đầu ra và hiểu nó, tại sao nó hoạt động như thế này và điều gì sẽ xảy ra nếu tôi sửa đổi mã một chút. Bước qua không giải thích quy tắc và lý do của quá trình thực hiện. – INlHELL