Từ Khóa: super (super Keywords)
"Trong Java, từ khóa super là một công cụ quan trọng trong lập trình hướng đối tượng, cho phép một lớp con truy cập trực tiếp vào các thành phần của lớp cha. Điều này giúp bạn mở rộng chức năng một cách linh hoạt và tái sử dụng mã nguồn hiệu quả. Dưới đây là những điều cơ bản bạn cần biết về từ khóa super trong Java."
Trong lập trình hướng đối tượng của Java, super là một từ khóa đặc biệt dùng để truy cập lớp cha (superclass) từ trong một lớp con(subclass). Nó hoạt động như một biến tham chiếu đặc biệt, giúp chúng ta truy cập các thuộc tính và phương thức của lớp cha ngay cả khi lớp con đã định nghĩa lại chúng. Từ khóa super có 3 cách sử dụng như sau:
↳ Từ khóa super được sử dụng để tham chiếu trực tiếp đến biến instance của lớp cha.
↳ Từ khóa super được sử dụng để gọi trực tiếp phương thức của lớp cha.
↳ Từ khóa super() được sử dụng để gọi trực tiếp Constructor 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.
Nếu lớp con và lớp cha có cùng một thuộc tính, bạn có thể dùng super để truy cập thuộc tính của lớp cha.
Ví dụ: khi không sử dụng từ khóa super
Ví dụ: Example.java
class SuperClass {
String Money = "200 USD";
}
class SubClass extends SuperClass {
String Money = "100 USD";
void printMoney() {
// khi sử dụng từ khóa super
System.out.println("Money của lớp con: "+ Money);
}
}
public class Example {
public static void main(String args[]) {
SubClass sub = new SubClass();
sub.printMoney();
}
}
Kết quả của chương trình là:
Ví dụ: khi sử dụng từ khóa super
Ví dụ: Example.java
class SuperClass {
String Money = "200 USD";
}
class SubClass extends SuperClass {
String Money = "100 USD";
void printMoney() {
// khi sử dụng từ khóa super
System.out.println("Money của lớp con: "+ super.Money);
}
}
public class Example {
public static void main(String args[]) {
SubClass sub = new SubClass();
sub.printMoney();
}
}
Kết quả của chương trình là:
Trong ví dụ trên, cả hai lớp Superclass và Subclass đều có biến thể hiện (biến instance) chung là money. Nếu chúng ta in biến money, nó sẽ in số tiền của từng lớp hiện tại theo mặc định. Để truy cập biến từ lớp cha (Superclass), lớp con (Subclass) cần phải sử dụng từ khóa super.
Ⅱ. Từ khóa super được sử dụng để gọi trực tiếp phương thức của lớp cha.
Bạn có thể sử dụng từ khóa super để gọi các phương thức được định nghĩa trong lớp cha, ngay cả khi chúng đã được ghi đè trong lớp con. Điều này cho phép bạn gọi trực tiếp phương thức của lớp cha từ lớp con, giúp truy cập và sử dụng các hành vi của lớp cha mà không bị ảnh hưởng bởi các phương thức đã được ghi đè.
Dưới đây là một ví dụ minh họa việc sử dụng từ khóa super để gọi phương thức của lớp cha từ lớp con:
Ví dụ: Example.java
class SuperClass {
void Message() {
System.out.println("Xin chào, đây là Phương thức Message() của lớp cha");
}
}
class SubClass extends SuperClass {
void Message() {
System.out.println("Xin chào, đây là Phương thức Message() của lớp con");
}
void display() {
Message();
super.Message();
}
}
public class Example {
public static void main(String args[]) {
SubClass sub = new SubClass();
sub.display();
}
}
Kết quả của chương trình là:
Xin chào, đây là Phương thức Message() của lớp cha
Lưu ý:
Bạn không thể sử dụng từ khóa super trong một phương thức tĩnh (static method). Lý do là bởi vì các phương thức tĩnh thuộc về lớp, không thuộc về đối tượng (instance) của lớp. Từ khóa super được sử dụng để tham chiếu đến lớp cha của đối tượng hiện tại, do đó không thể sử dụng trong ngữ cảnh của một phương thức tĩnh.
Ⅲ. Từ khóa super() được sử dụng để gọi trực tiếp constructor của lớp cha.
Từ khóa super thường được sử dụng trong lớp con để gọi hàm khởi tạo của lớp cha. Điều này rất quan trọng khi bạn muốn đảm bảo rằng các thành phần của lớp cha được khởi tạo đúng cách trước khi tiếp tục khởi tạo các thành phần của lớp con.
↳ Quy tắc bắt buộc: Khi sử dụng super() để gọi constructor của lớp cha, nó phải là lệnh gọi đầu tiên trong constructor của lớp con.
↳ Lý do: Constructor của lớp cha sẽ được gọi để khởi tạo các thuộc tính kế thừa trước khi lớp con tiến hành khởi tạo các thuộc tính riêng.
Ví dụ: Main.java
class Hinh {
String ten;
String mauSac;
Hinh(String ten, String mauSac) {
this.ten = ten;
this.mauSac = mauSac;
System.out.println("constructor của lớp cha(Hinh)");
}
}
class HinhChuNhat extends Hinh {
int chieuDai;
int chieuRong;
HinhChuNhat(String ten, String mauSac, int chieuDai, int chieuRong) {
// Gọi constructor của lớp cha để khởi tạo tên và màu sắc
super(ten, mauSac);
this.chieuDai = chieuDai;
this.chieuRong = chieuRong;
System.out.println("constructor của lớp con(HinhChuNhat)");
}
void display(){
System.out.println("Tên hình: " + ten);
System.out.println("Màu sắc: " + mauSac);
System.out.println("Chiều dài: " + chieuDai);
System.out.println("Chiều rộng: " + chieuRong);
}
}
public class Main {
public static void main(String[] args) {
HinhChuNhat hinh = new HinhChuNhat("Hình chữ nhật", "Đỏ", 10, 5);
hinh.display();
}
}
Kết quả của chương trình là:
constructor của lớp con(HinhChuNhat)
Tên hình: Hình chữ nhật
Màu sắc: Đỏ
Chiều dài: 10
Chiều rộng: 5
Trong ví dụ trên minh họa cách sử dụng từ khóa super để gọi constructor của lớp cha từ constructor của lớp con, đảm bảo rằng các thuộc tính được thừa kế từ lớp cha được khởi tạo đúng cách. Phương thức display() sau đó hiển thị thông tin của đối tượng HinhChuNhat.
Trong Java, nếu bạn không cung cấp bất kỳ constructor nào trong lớp con, thì trình biên dịch sẽ tự động thêm một constructor mặc định và gọi super() để gọi constructor mặc định của lớp cha. Điều này đảm bảo rằng lớp cha được khởi tạo đúng cách trước khi lớp con khởi tạo.
↳ Dưới đây là một ví dụ cụ thể minh họa điều này:
Ví dụ: Example.java
// Lớp cha (SuperClass)
class SuperClass {
// Constructor mặc định của SuperClass
SuperClass() {
System.out.println("Constructor của SuperClass đã được tạo");
}
}
// Lớp con (SubClass) không có constructor nào
class SubClass extends SuperClass {
// Trình biên dịch sẽ tự động thêm constructor mặc định với super()
/*
SubClass() {
super(); // Gọi constructor của SuperClass
System.out.println("Constructor của SubClass");
}
*/
}
public class Example {
public static void main(String[] args) {
// Tạo một đối tượng của SubClass
SubClass sub = new SubClass();
}
}
Kết quả của chương trình là:
Điều này cho thấy rằng super() được trình biên dịch ngầm cung cấp khi không có constructor nào được định nghĩa trong lớp con, đảm bảo rằng lớp cha luôn được khởi tạo trước.
