Quan hệ kế thừa giữa các lớp

Một phần của tài liệu Lap Trinh huong doi tuong JAVA (Trang 81 - 85)

 Java chỉ hỗ trợ kế thừa đơn (tuyến tính), nghĩa là một lớp chỉ kế thừa được từ một lớp cha.

 Mọi lớp của Java đều là lớp con cháu mặc định của Object.

Hình H6-6 Quan hệ kế thừa giữa các lớp

 Cú pháp qui định quan hệ kế thừa trong Java là sự mở rộng của lớp cha, có dạng:

<Tên lớp con> extends <Tên lớp cha> { // Các thuộc tính dữ liệu bổ sung

// Các hàm thành phần bổ sung hay viết đè }

Lưu ý:

 Mọi đối tượng của lớp con cũng sẽ là đối tượng thuộc lớp cha. Do vậy việc gán một đối tượng của lớp con sang cho biến tham chiếu đối tượng của lớp cha là sự mở rộng kiểu và do đó không cần ép kiểu.

 Ngược lại gán một đối tượng của lớp cha cho biến tham chiếu đối tượng thuộc lớp con sẽ phải thực hiện ép kiểu. Lưu ý khi đó sẽ có thể bị tổn thất thông tin. Ví dụ,

class SuperClass { /* ... */ } class SubClass { /* ... */ } class UserClass {

//

public static main(String args[]){

SuperClass super1 = new SuperClass();// Tạo ra đối tượng lớp cha SubClass sub1 = super1; // Mở rộng kiểu

SuperClass super2 = (SubClass) sub1; // Thu hẹp kiểu nên phải ép kiểu }

6.6.1 Toán tử móc xích giữa các lớp kế thừa this() và super()

 Các toán tử tạo lập không thể viết đè ở các lớp dẫn xuất (lớp con). Chúng có thể được nạp chồng nhưng phải trong cùng lớp.

 Trong Java có 2 toán tử tạo lập đặc biệt có tên là this() và super() được sử dụng để móc xích giữa các lớp có quan hệ kế thừa với nhau.

Toán tử tạo lập this()

Toán tử tạo lập này được sử dụng để tạo ra đối tượng của lớp hiện thời. Ví dụ 4.15 Nạp chồng toán tử tạo lập

// Tệp: NhaKho.java class BongDen{

// Biến thành phần (1) private int soWatts; private boolean batTat; private String viTri;

// Định nghĩa toán tử tạo lập mặc định, số 1 (2) BongDen(){

soWatts = 40; batTat = true;

viTri = new String(“XX”);

System.out.println(“Toán tử số 1”); }

// Định nghĩa toán tử tạo lập không mặc định, số 2 (3) BongDen(int w, boolean s){

soWatts = w; batTat = s;

viTri = new String(“XX”);

System.out.println(“Toán tử số 2”); }

// Định nghĩa toán tử tạo lập không mặc định, số 3 nạp chồng (4) BongDen(int soWatts, boolean batTat, String viTri){

this.soWatts = soWatts; this.batTat = batTat;

this.viTri = new String(viTri); System.out.println(“Toán tử số 3”); }

public class NhaKho{

public static void main(String args[]){ BongDen d1=new BongDen(); // OK

BongDen d2 = new BongDen(100, true, “Nha bep”); // OK BongDen d3 = new BongDen(100, true); // OK

// ... } } Ví dụ 6.16 Sử dụng toán tử this() // Tệp: NhaKho.java class BongDen{ // Biến thành phần (1) private int soWatts; private boolean batTat; private String viTri;

// Định nghĩa toán tử tạo lập mặc định, số 1 (2) BongDen(){

this(40, true);

System.out.println(“Toán tử số 1”); }

// Định nghĩa toán tử tạo lập không mặc định, số 2 (3) BongDen(int w, boolean s){

this(w, s, “XX”);

System.out.println(“Toán tử số 2”); }

// Định nghĩa toán tử tạo lập không mặc định, số 3 nạp chồng (4) BongDen(int soWatts, boolean batTat, String viTri){

this.soWatts = soWatts; this.batTat = batTat;

this.viTri = new String(viTri); System.out.println(“Toán tử số 3”); }

}

public class NhaKho{

public static void main(String args[]){ BongDen d1=new BongDen(); // OK

BongDen d2 = new BongDen(100, true, “Nha bep”); // OK BongDen d3 = new BongDen(100, true); // OK

// ... }

}

Toán tử tạo lập super()

 Toán tử super() được sử dụng trong các toán tử tạo lập của lớp con (subclass) để gọi tới các toán tử tạo lập của lớp cha (superclass) trực tiếp.

Ví dụ 6.17 Sử dụng toán tử super()

// Tệp: NhaKho.java class BongDen{

private int soWatts; private boolean batTat; private String viTri;

// Định nghĩa toán tử tạo lập mặc định, số 1 (2) BongDen(){

this(40, true);

System.out.println(“Toán tử số 1”); }

// Định nghĩa toán tử tạo lập không mặc định, số 2 (3) BongDen(int w, boolean s){

this(w, s, “XX”);

System.out.println(“Toán tử số 2”); }

// Định nghĩa toán tử tạo lập không mặc định, số 3 nạp chồng (4) BongDen(int soWatts, boolean batTat, String viTri){

this.soWatts = soWatts; this.batTat = batTat;

this.viTri = new String(viTri); System.out.println(“Toán tử số 3”); }

}

class DenTuyp extends BongDen { private int doDai;

private int mau;

DenTuyp(int leng, int colo){ // (5) this(leng, colo, 100, true, “Chua biet”); }

DenTuyp(int leng, int colo, int soWatt, boolean bt, String noi){ // (6) super(soWatt, bt, noi);

this.doDai = leng; this.mau = colo; }

}

public class NhaKho{

public static void main(String args[]){

System.out.println(“Tao ra bong đen tuyp”); DenTuyp d = new DenTuyp(20, 5);

} }

 Một số lưu ý khi sử dụng super() và this():

 Chúng chỉ sử dụng để xây dựng các toán tử tạo lập của các lớp và khi sử dụng thì chúng luôn phải là lệnh đầu tiên trong định nghĩa của toán tử tạo lập.

 This() được sử dụng để móc xích với cùng lớp chứa nó còn super() lại được sử dụng để móc xích với lớp cha của lớp đó.

Một phần của tài liệu Lap Trinh huong doi tuong JAVA (Trang 81 - 85)

Tải bản đầy đủ (DOC)

(149 trang)
w