Nếu các phương thức của chúng ta ghi đè lên các phương thức của lớp cha, chúng ta có thể gọi lại chính các phương thức đã bị ghi đè đó ở lớp cha thông qua từ khóa super
. Ngoài ra chúng ta cũng có thể tham chiếu trực tiếp tới các thuộc tính bị che giấu. Ví dụ:
public class Superclass { public void print() { System.out.println("Printed in Superclass."); } }
Đoạn code trên định nghĩa lớp Superclass
có một phương thức print()
. Tiếp theo chúng ta định nghĩa lớp con như sau:
public class Subclass extends Superclass { @Override public void print() { super.print(); System.out.println("Printed in Subclass"); } public static void main(String[] args) { Subclass s = new Subclass(); s.printMethod(); } }
Chúng ta định nghĩa lớp Subclass
kế thừa lớp Superclass
, chúng ta cũng định nghĩa phương thức print()
ghi đè phương thức print()
của lớp Superclass
. Tuy nhiên chúng ta vẫn có thể gọi tới phương thức print()
của lớp Superclass
từ lớp Subclass
thông qua từ khóa super
.
Printed in Superclass. Printed in Subclass
Gọi phương thức khởi tạo
Chúng ta cũng có thể gọi lại phương thức khởi tạo của lớp cha bằng cách dùng từ khóa super
. Giả sử chúng ta có lớp Blog
với phương thức khởi tạo như sau:
public class Blog { private String title; public Blog(String title) { this.title = title; } }
Phương thức khởi tạo của lớp Blog
nhận vào một biến String
. Tiếp theo chúng ta định nghĩa lớp PhoCodeBlog
kế thừa từ lớp Blog
như sau:
public class PhoCodeBlog extends Blog { private DateTime createdAt; public PhoCodeBlog(DateTime createdAt, String title) { super(title); this.createdAt = createdAt; } }
Phương thức khởi tạo của lớp PhoCodeBlog
cũng nhận vào một đối tượng String
, ngoài ra còn có một dối tượng DateTime
dành riêng cho lớp này. Bên trong chúng ta gọi tới phương thức khởi tạo của lớp cha là Blog
bằng cách gọi super()
và truyền vào tham số là giá trị của đối tượng String title
.
Lưu ý là nếu chúng ta có gọi tới phương thức super()
thì luôn luôn đặt super()
làm dòng đầu tiên.
Một lưu ý khác là bản thân các lớp sẽ có một phương thức khởi tạo không có tham số nếu chúng ta không khai báo phương thức khởi tạo nào. Nếu trong lớp con chúng ta không gọi tới các phương thức super()
thì trình biên dịch sẽ tự động gọi tới phương thức super()
không có tham số ở lớp cha, và do đó ở lớp cha phải có định nghĩa một phương thức khởi tạo không có tham số, nếu không trình biên dịch sẽ báo lỗi.
Và tất nhiên là điều đó có nghĩa là trình biên dịch sẽ lần lượt gọi ngược lại các phương thức khởi tạo của các lớp cha, dần dần quay về lớp gốc là lớp Object
, trong Java thì quy trình này còn được gọi là chuỗi khởi tạo (constructor chaining).