1. Từ khóa super trong Java dùng để làm gì?
Từ khóa super trong Java được sử dụng trong lớp con (subclass) để truy cập các thành phần trong lớp cha (superclass):
- Giúp gọi phương thức của lớp cha được ghi đè (overriding) trong lớp con
- Giúp truy cập các thuộc tính của lớp cha nếu cả lớp con và lớp cha có các thuộc tính giống tên nhau
- Giúp gọi hàm khởi tạo có tham số hoặc không có tham số của lớp cha
2. Từ khóa super giúp truy cập phương thức ghi đè của lớp cha
Khi lớp con gọi phương thức được ghi đè (overriding) có cùng tên với phương thức của lớp cha thì phương thức được gọi đó là của lớp con.
class LopCha{
protected void xuat(){
System.out.println("Lop cha.");
}
}
class LopCon extends LopCha{
@Override
public void xuat(){
System.out.println("Lop con.");
}
}
public class Test{
public static void main(String[] args) {
LopCon aaa = new LopCon();
aaa.xuat();
}
}
Kết quả
Lop con.
Chúng ta có thể gọi phương thức của lớp cha trong lớp con sau khi đã ghi đè (overriding) phương thức đó bằng cách sử dụng từ khóa super.
class LopCha{
public void xuat(){
System.out.println("Lop cha.");
}
}
class LopCon extends LopCha{
@Override
public void xuat(){
super.xuat();//gọi hàm xuat() của lớp cha
System.out.println("Lop con.");
}
}
public class Test{
public static void main(String[] args) {
LopCon aaa = new LopCon();
aaa.xuat();
}
}
Kết quả
Lop cha.
Lop con.
3. Từ khóa super giúp truy cập thuộc tính của lớp cha
Lớp cha và lớp con có thể có các thuộc tính có tên giống nhau. Chúng ta có thể sử dụng từ khóa super để gọi thuộc tính của lớp cha.
class LopCha{
protected String type="LopCha.";
}
class LopCon extends LopCha{
public String type="LopCon.";
public void xuat(){
System.out.println(type);
//gọi thuộc tính lớp cha
System.out.println(super.type);
}
}
public class Test{
public static void main(String[] args) {
LopCon aaa = new LopCon();
aaa.xuat();
}
}
Kết quả
LopCon.
LopCha.
4. Từ khóa super giúp truy cập hàm khởi tạo của lớp cha
Khi một đối tượng của lớp con được tạo ra, hàm khởi tạo mặc định (default constructor) của lớp cha cũng sẽ tự động được gọi. Trong một số trường hợp, chúng ta muốn chọn hàm khởi tạo nào trong lớp cha được gọi thì có thể sử dụng super()
.
Trong hàm khởi tạo của lớp con, chúng ta có thể gọi hàm khởi tạo của lớp cha bằng super()
. super()
chỉ có thể được gọi trong hàm khởi tạo của lớp con và phải được đặt ở dòng lệnh đầu tiên trong hàm khởi tạo của lớp con.
class LopCha{
LopCha(){
System.out.println("LopCha.");
}
}
class LopCon extends LopCha{
LopCon(){
super();
System.out.println("LopCon.");
}
}
public class Test{
public static void main(String[] args) {
LopCon aaa = new LopCon();
}
}
Kết quả
LopCha.
LopCon.
Chúng ta cũng có thể gọi hàm khởi tạo có tham số của lớp cha ở dòng lệnh đầu tiên trong hàm khởi tạo của lớp con sử dụng super()
.
class LopCha{
LopCha(){
System.out.println("LopCha.");
}
LopCha(String type){
System.out.println(type + " ke thua tu LopCha.");
}
}
class LopCon extends LopCha{
LopCon(){
super("LopCon");
System.out.println("LopCon.");
}
}
public class Test{
public static void main(String[] args) {
LopCon aaa = new LopCon();
}
}
Kết quả
LopCon ke thua tu LopCha.
LopCon.
Lưu ý: Nếu đã gọi hàm khởi tạo có tham số của lớp cha trong lớp con thì hàm khởi tạo mặc định của lớp cha sẽ không được trình biên dịch tự gọi nữa.