Chào bạn, khi lập trình Java hướng đối tượng có một từ khóa rất thú vị đó là từ khóa super.
Từ khóa Super trong Java
Vậy từ khóa super trong Java có tác dụng gì? Sử dụng thế nào? bla... bla... Hãy cùng mình tìm hiểu trong bài viết này nhé.
Nội dung của bài viết này gồm:
-
Từ khóa super trong Java là gì?
-
Ví dụ cách sử dụng từ khóa super trong java
-
Khi nào nên sử dụng từ khóa super trong java
1. Từ khóa super trong java là gì?
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.
Bất cứ khi nào bạn tạo ra một thể hiện (hay còn gọi là một instance) 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.
Trước khi chúng ta đi vào các ví dụ và cách sử dụng super, bạn cần có kiến thức về kế thừa ở trong Java để hiểu được các ví dụ nhé.
> Bạn có thể tìm hiểu qua bài hướng dẫn Tự học Java này nhé
2. Cách sử dụng từ khóa super trong Java qua các ví dụ
Trong java, super có 3 cách sử dụng chính:
-
Sử dụng từ khóa super để tham chiếu trực tiếp đến biến instance của lớp cha gần nhất
-
Sử dụng từ khóa super để gọi đến phương thức của lớp cha gần nhất
-
Sử dụng super() để gọi trực tiếp constructor (hàm tạo) của lớp cha gần nhất
Sau đây chúng ta cùng tìm hiểu từng trường hợp qua ví dụ cụ thể nhé.
2.1. Ví dụ sử dụng từ khóa super để tham chiếu trực tiếp đến biến instance của lớp cha gần nhất
Sau đây mình sẽ tạo ra một lớp cha là Parent, sau đó tạo ra một lớp Child kế thừa (extends) lớp Parent như bên dưới đây:
Code:
// Tạo class cha Parent
class Parent {
public String name = "Biến lớp cha";
public String address = "Hà Nội";
public Parent() {} //Hàm tạo hay Constructor
}
// Tạo class con kế thừa class Parent
class Child extends Parent{
public String name = "Biến lớp con";
public Child() {} //Hàm tạo hay Constructor
public void display1() {
// Sử dụng từ khóa super
System.out.println("Sử dụng super gọi biến name: " + super.name);
// Không sử dụng từ khóa super
System.out.println("Không sử dụng super: " + name);
}
public void display2() {
System.out.println("Nơi ở: " + address);
}
}
public class SuperInJava {
public static void main(String[] args) {
Child child = new Child();
child.display1();
child.display2();
}
}
Khi chạy chương trình, chúng ta nhận được kết quả như sau:
Sử dụng super gọi biến name: Biến lớp cha
Không sử dụng super: Biến lớp con
Nơi ở: Hà Nội
Giải thích:
Ở đoạn code trên mình khai báo 2 class đó là class Parent
(lớp cha) và class Child
(lớp con). Class Child
kế thừa class Parent
.
Trong class child có hai phương thức là display1()
và display2()
để in ra thông tin các thuộc tính của 2 class.
Với phương thức display1()
, đầu tiên mình in ra màn hình sử dụng super.name
vì vậy nó sẽ gọi đến biến name
của lớp cha gần nhất (ở đây là lớp Parent
).
Do đó nó sẽ in ra “Biến lớp cha”
.
Tương tự mình in ra màn hình chỉ sử dụng name
thì nó sẽ gọi đến biến name của lớp Child
.
Với display2()
, trường hợp này lớp Child
không có biến address
giống của lớp cha, vì vậy lớp Child
sẽ kế thừa luôn biến address
của lớp Parent
.
Do đó mình in ra biến address
mà không cần sử dụng super.address
cũng được.
2.2. Ví dụ sử dụng từ khóa super để gọi phương thức của lớp cha gần nhất
Để hiểu cách gọi phương thức của lớp cha gần nhất bằng cách sử dụng từ khóa super thì hãy xem ví dụ bên dưới đây:
Code:
class Parent {
public Parent() {}
public void printInfo() {
System.out.println("Đây là lớp cha");
}
}
class Child extends Parent{
public Child() {}
public void printInfo() {
System.out.println("Đây là lớp con");
}
public void displayUseSuper() {
// Sử dụng từ khóa super
super.printInfo();
}
public void displayNotUseSuper() {
// Không sử dụng từ khóa super
printInfo();
}
}
public class SuperInJava {
public static void main(String[] args) {
Child child = new Child();
child.displayUseSuper();
child.displayNotUseSuper();
}
}
Khi chạy chương trình, chúng ta nhận được kết quả:
Đây là lớp cha
Đây là lớp con
Giải thích:
Ở đây ta thấy hai lớp Child
và Parent
đều có phương thức printInfo
(cùng có tên là printInfo
giống nhau).
Trong lớp Child
, phương thức displayUseSuper()
sử dụng từ khóa super.printInfo()
, vì vậy trình biên dịch sẽ hiểu là cần phải gọi đến hàm printInfo
trong lớp Parent
.
Tương tự phương thức displayNotUseSuper()
không sử dụng từ khóa super nên nó trình biên dịch sẽ ưu tiên tìm đến phương thức được định nghĩa trong lớp con, nếu sẽ gọi.
Nếu không có, nó sẽ gọi đến phương thức trong lớp cha.
Vì thế, chúng ta có kết quả như trên.
2.3. Sử dụng super() để gọi trực tiếp constructor của lớp cha
Code:
class Parent {
public Parent() {
System.out.println("Hàm tạo lớp cha không tham số");
}
}
class Child extends Parent{
public Child() {
// Luôn đặt hàm super() đầu tiên
super();
System.out.println("Hàm tạo lớp con");
}
}
public class SuperInJava {
public static void main(String[] args) {
Child child = new Child();
}
}
Khi chạy chương trình trên, chúng ta nhận được kết quả:
Hàm tạo lớp cha không tham số
Hàm tạo lớp con
Giải thích:
Bạn thấy ở trong constructor của class Child
, mình có gọi super()
, . Phương thức super() là một phương thức đặc biệt của từ khóa super.
Việc sử dụng như trên trình biên dịch sẽ hiểu là bạn cần gọi đến contructor của lớp cha.
Lưu ý: Phương thức super() luôn phải đặt là câu lệnh đầu tiên.
Nhìn vào kết quả, mình tin là bạn sẽ hiểu ngay thôi.
Thông qua ba ví dụ về 3 trường hợp cụ thể trên, bây giờ chúng ta hãy cùng thực hành một ví dụ khác nhé. Cùng đoán xem đoạn code dưới đây sẽ chạy ra kết quả như thế nào?
class Person {
int id;
String name;
Person (int id, String name){
this.id = id;
this.name = name;
}
}
class Emp extends Person{
float salary;
Emp (int id, String name, float salary){
//gọi lại constructor có 2 tham số là id và name của class cha
super(id, name);
this.salary = salary;
}
void display(){
System.out.println(id + " " + name + " " + salary);
}
}
public class SuperInJava {
public static void main(String[] args) {
Emp e1 = new Emp(1, "ankit", 45000f);
e1.display();
}
}
Bạn hãy thử chạy chương trình trong Eclipse IDE (hoặc IDE nào khác) để xem kết quả như thế nào nhé.
3. Khi nào nên sử dụng từ khóa super trong Java?
Qua phần kiến thức và ví dụ mình đã trình bày ở trên, chúng ta có thể rút ra được một số trường hợp nên sử dụng super như sau:
-
Sử dụng từ khóa super khi cần truy xuất đến thuộc tính của lớp cha gần nhất. Nó được sử dụng nếu lớp cha và lớp con có cùng tên thuộc tính.
-
Sử dụng từ khóa super khi cần truy xuất đến phương thức của lớp cha gần nhất. Nó nên được sử dụng nếu lớp con chứa cùng phương thức với lớp cha. Nói cách khác, nó được sử dụng nếu phương thức bị override (ghi đè).
-
Sử dụng từ khóa super khi cần gọi đến constructor của lớp cha gần nhất.
Bạn đã hiểu từ về khóa super trong Java chưa?
Như vậy thông qua bài viết này, mình đã trình bày cho các bạn các kiến thức về từ khóa super trong Java rồi.
Học Java cũng không quá khó phải không nào? Quan trọng là bạn biết chia nhỏ ra từng phần để học và kiên trì mỗi ngày là sẽ ổn thôi.
> Nếu muốn học có sự hướng dẫn của giảng viên doanh nghiệp. Bạn có thể tham gia KHÓA HỌC JAVA (full stack) để tăng tốc độ học tập và đi làm sớm hơn bạn nhé.
Hẹn gặp lại bạn trong bài viết tiếp theo.
---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Website: https://niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
#niit #niithanoi #icthanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python