Điện thoại/ Zalo
0389934723
Bài 14: Kế thừa class trong Java
Tiếp tục với series bài này mình sẽ giới thiệu với mọi người về Kế thừa class trong Java.
1. Kế thừa class trong Java.
Kế thừa class là sự liên hệ giữa hai class với nhau. Trong đó class được kế thừa (sub class) sẽ có toàn bộ các thuộc tính và phương thức trong class kế thừa (super class). Còn phạm vi truy cập thì tùy vào access_modifier
của thuộc tính phương thức đó (xem lại bài trước).
Để khai báo kế thừa class trong Java chúng ta sử dụng cú pháp sau:
class SubClassName extends SuperClassName {
...
}
Trong đó:
SubClassName
là tên của class con các bạn muốn khai báo.SuperClassName
là tên của class cha các bạn muốn kế thừa.
VD: Mình sẽ khai báo 2 class Xe
và XeDap
. Trong đó class XeDap
sẽ kế thừa class Xe
.
– class Xe.java
:
public class Xe {
private int soBanh;
private int tocDo;
public Xe(int soBanh, int tocDo) {
this.soBanh = soBanh;
this.tocDo = tocDo;
}
public int getSoBanh() {
return soBanh;
}
public void setSoBanh(int soBanh) {
this.soBanh = soBanh;
}
public int getTocDo() {
return tocDo;
}
public void setTocDo(int tocDo) {
this.tocDo = tocDo;
}
}
– class XeDap.java
:
public class XeDap extends Xe {
}
Lúc này class XeDap
sẽ có đầy đủ thuộc tính và phương thức của class Xe
.
VD: Mình sẽ khởi tạo class XeDap
và truy vấn các phương thức của class Xe
xem có được không.
public class Main {
public static void main(String[] args) {
XeDap xeDap = new XeDap();
xeDap.setSoBanh(2);
xeDap.setTocDo(20);
System.out.println(xeDap.getSoBanh());
System.out.println(xeDap.getTocDo());
}
}
Kết quả:
2
20
Như các bạn đã thấy đó, class XeDap
hoàn toàn không khai báo các phương thức setSoBanh
, setTocDo
, getSoBanh
, getTocDo
nhưng nó lại vẫn có thể dùng được. Dó là do class XeDap
kế thừa class Xe
. Mà trong class Xe
đã định nghĩa những phương thức, thuộc tính đó rồi.
2. Kế thừa class có constructor.
Khi kế thừa một class có khai bao constructor, thì class con bắt buộc cũng phải khai báo constructor, nếu không trình biên dịch sẽ báo lỗi.
VD: Mình sẽ khai thêm constructor cho class Xe
ở trên và kế thừa không mà không khai báo constructor.
– class Xe.java
:
public class Xe {
...
public Xe(int soBanh, int tocDo) {
this.soBanh = soBanh;
this.tocDo = tocDo;
}
...
}
– class XeDap.java
:
public class XeDap extends Xe {
}
Lúc này trình biên dịch sẽ trả về lỗi:
error: constructor Xe in class Xe cannot be applied to given types;
Để đoạn code trên được hoạt động thì bắt buộc class XeDap
phải định nghĩa lại constructor. Kiểu như sau:
– class XeDap.java
:
public class XeDap extends Xe {
public XeDap(int soBanh, int tocDo) {
super(soBanh, tocDo);
}
}
3. Từ khóa super.
Trong trường hợp class con khai báo lại các phương thức và thuộc tính trong class cha mà vẫn muốn đứng ở class con có thể gọi lại các class bị ghi đề đó trong class cha thì chúng ta sử dụng từ khóa super
.
VD: Mình có ví dụ sau cho các bạn dễ hiểu.
– class Xe.java
:
public class Xe {
public void printInfo() {
System.out.println("method printInfo cua class Xe");
}
}
– class XeDap.java
:
public class XeDap extends Xe {
public void printInfo() {
super.printInfo();
System.out.println("method printInfo cua class XeDap");
}
}
– class Main.java
:
public class Main {
public static void main(String[] args) {
XeDap xeDap = new XeDap();
xeDap.printInfo();
}
}
Kết quả:
method printInfo cua class Xe
method printInfo cua class XeDap
Trong ví dụ trên mình đã ghi đè phương thức printInfo
của class Xe và mình có thực hiện gọi lại phương thức đó của class Xe
rồi thực thi tiếp đoạn code khác.
4. Ép kiểu object.
Khi khởi tạo object từ class con chúng ta hoàn toàn có thể gán kiểu của object là class cha.
VD: với trường hợp class XeDap
ở trên chúng ta hoàn toàn có thể khởi tạo object với type là Xe
.
Xe xeDap = new XeDap();
Lúc này trình biên dịch sẽ báo lỗi:
error: incompatible types: Xe cannot be converted to XeDap
Để làm được điều trên thì chúng ta cần phải ép kiểu object khi khởi tạo class Xe
thành XeDap
.
VD:
XeDap xe = (XeDap) new Xe();
5. Lời kết.
Phần này mình có nhắc đến việc ghi đè phương thức trong kế thừa nhưng chưa giải thích mà để dành hẳn ra một bài để nói về nó cho mọi người dễ hiểu.