Từ khóa super trong java là một biến tham chiếu được sử dụng để tham chiếu trực tiếp đến đối tượng của lớp cha gần nhất.
Khi một lớp được kế thừa từ lớp cha trong cả lớp cha và lớp con đều có một phương thức trùng tên nhau, thế thì làm thế nào có thể gọi phương thức trùng tên đó của lớp cha, java cung cấp cho ta từ khoá super dùng để chỉ đối tượng của lớp cha.
Bất cứ khi nào bạn tạo ra instance(thể hiển) của lớp con, một instance của lớp cha được tạo ra ngầm định, nghĩa là được tham chiếu bởi biến super.
Super tham chiếu đến biến instance của lớp cha
Từ khóa super được sử dụng để tham chiếu trực tiếp đến biến instance của lớp cha.
Ví dụ: xe đạp thừa kế lớp cha, tốc độ của lớp cha là 50, tốc độ lớp con là 100, nếu không sử dụng super thì khi in tốc độ ra chúng ta sẽ được kết quả là của lớp con
class Xe { int speed = 50; } public class XeDap extends Xe { int speed = 100; void display() { System.out.println(speed); // speed của lớp con } public static void main(String args[]) { Bike b = new Bike(); b.display(); } }
Ví dụ: nếu chúng ta sử dụng super thì sẽ in ra được tốc độ của lớp cha
class Xe { int speed = 50; } public class XeDap extends Xe { int speed = 100; void display() { System.out.println(super.speed); // speed của lớp cha } public static void main(String args[]) { XeDap b = new XeDap(); b.display(); } }
Sử dụng super() để gọi constructor của lớp cha
Trong java, super() được sử dụng để gọi trực tiếp constructor của lớp cha.
class Xe { Xe() { System.out.println(“Xe được tạo”); } } class XeDap extends Xe { XeDap() { super();// gọi Constructor của lớp cha System.out.println(“Xe đạp được tạo”); } public static void main(String args[]) { XeDap b = new XeDap(); } }
Như chúng ta đã biết constructor được tạo ra tự động bởi trình biên dịch nhưng nó cũng thêm super() vào câu lệnh đầu tiên. Nếu bạn tạo constructor và bạn không có this() hoặc super() ở dòng lệnh đầu tiên, trình biên dịch sẽ cung cấp super() của Constructor.
Chú ý: ta không thể dùng nhiều từ khoá này để chỉ lớp ông, lớp cụ… chẳng hạn viết như sau là sai: super.super.add(1,4);
class Xe { Xe() { System.out.println(“Xe đã được tạo”); } } public class XeDap extends Xe { int speed; XeDap(int speed) { this.speed = speed; System.out.println(speed); } public static void main(String args[]) { XeDap b = new XeDap(10); } }
Super được sử dụng để gọi phương thức của lớp cha
Từ khóa super cũng có thể được sử dụng để gọi phương thức của lớp cha. Nó nên được sử dụng trong trường hợp lớp chứa các phương thức tương tự như lớp cha như trong ví dụ dưới đây
class Nguoi { void xinChao() { System.out.println(“Xin chao”); } } public class HocSinh extends Nguoi { void xinChao() { System.out.println(“Xin chao Thaycacac”); } void display() { message();// gọi phương thức message() của lớp hiện tại super.message();// gọi phương thức message() của lớp cha } public static void main(String args[]) { HocSinh hocSinh = new HocSinh(); hocSinh.display(); } }