Thắc mắc về thừa kế trong java
Chào mọi người, đây là topic đầu tiên của mình, mong mọi người đừng gạch đá quá nhiều.
Mình vừa mới bắt đầu học lập trình java, đang học đến phần thừa kế. Trường hợp của mình như sau:
-
Tạo một lớp cha (tên là “Super”), trong lớp Super có một thuộc tính là name, kiểu String, giá trị mặc định là “default” : “public String name = “default”;”
-
Trong lớp Super cũng tạo một constructor (hàm khởi tạo) không tham số, “public Super(){name = “Hello”;}” .Trong hàm khởi tạo này mình xét giá trị cho thuộc tính name là “Hello”.
-
Tạo một lớp con (tên là “Sub”), thừa kế từ lớp cha “extends Super”, trong lớp Sub này tạo một constructor mới, “public Sub(){}” và để nội dung hàm trống.
-
Trong hàm main, khi mình tạo một đối tượng kiểu Sub: “Sub obj1 = new Sub();” thì khi mình in giá trị của thuộc tính name ra, thì trả về là “Hello” chứ không phải là “default”.
Mình thắc mắc là mình không hề gọi hàm khởi tạo của lớp cha, vậy tại sao hàm này vẫn được gọi và xét giá trị “Hello” cho biến name ???
Bạn thử thêm dòng System.out.println(“This is constructor super”) vào trong hàm khởi tạo của lớp cha và với Sub là System.out.println(“This is constructor sub”) là bạn sẽ hiểu.
Khi khởi tạo đối tượng của cái class sub thì nó sẽ gọi hàm khởi tạo sub, bạn nghĩ hàm khởi tạo sub để trống, nhưng thực trong đó có super() là hàm để gọi constructor của lớp cha :)). Hơi rối.
Hoặc bạn có thể đọc quyển Head first Java quyển này khá lâu rồi, mình đang đọc. Nó nói củng chi tiết lằm
Chương 9 head first java bạn nhé