Toidicode.com

Toidicode.com

BASIC TO ADVANCE

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 XeXeDap. 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.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha