Lập trình Java - 11

this.canh3 = canh3;

}


public double getCanh1() { return canh1;

}

public double getCanh2() { return canh2;

}

public double getCanh3() { return canh3;

}

public TamGiac() { this.canh1=0; this.canh2=0; this.canh3=0;

Có thể bạn quan tâm!

Xem toàn bộ 267 trang tài liệu này.

}

// @Override

Lập trình Java - 11

public boolean kiemtra() {

if(((canh1>0)&(canh2>0)&(canh3>0))&((canh1 + canh2> canh3)&(canh3 + canh2> canh1)&(canh3 + canh1> canh2)))

return true; else

return false;


}

//@Override

public double tinhdientich() { double p = canh1+canh2+canh2;

return (Math.sqrt(p*(p-canh1)*(p-canh2)*(p-canh3)));


}

// @Override

public double tinhchuvi() {

return(canh1+canh2+canh2);

}


@Override

public void Inkq(){

System.out.println("Các thuộc tính của Tam giác là:"); super.Inkq();

System.out.println("Cạnh 1 = "+getCanh1()); System.out.println("Cạnh 2 = "+getCanh2()); System.out.println("Cạnh 3 = "+getCanh3());

}

public static void main(String[] args) { TamGiac tb1 =new TamGiac(); tb1.setCanh1(3);

tb1.setCanh2(4); tb1.setCanh3(5); tb1.setFillMau(true); tb1.setMau("đỏ"); tb1.Inkq(); if(tb1.kiemtra())

System.out.print("dien tich = " + tb1.tinhchuvi() + " chu vi = " + tb1.tinhdientich()); else

System.out.print("khong phai la tam giac");


}

}


Kết quả chạy chương trình được: Các thuộc tính của Tam giác là: Mau = đỏ

Dổ màu = true Cạnh 1 = 3.0

Cạnh 2 = 4.0

Cạnh 3 = 5.0

dien tich = 11.0 chu vi = 60.794736614282655

Như vậy kết quả cho thấy lớp tam giác kế thừa thuộc tính màu, đổ màu, và phương thức Inkq từ lớp cha shape của nó.

2.6.3. Tính đa thừa kế

Trong tất cả các ví dụ trên, một lớp thừa kế chỉ từ một lớp. Trường hợp như thế gọi là „thừa kế đơn‟ (single inheritance).

Trong „đa thừa kế‟, một lớp con thừa kế từ hai hay nhiều lớp cha. Hãy khảo sát ví dụ sau:


Lớp Đường thẳng

Khởi điểm Điểm tận cùng

Lớp Đường tròn

Bán kính Tâm điểm

Lớp Hình ảnh

Hình ảnh Vẽ hình ảnh

Lớp Vẽ một hình

Nhận hình vẽ Vẽ hình

+ + =


Trong hình trên, chúng ta đã xây dụng một lớp „Vẽ một hình‟, lớp này thừa hưởng ba lớp: „Đường thẳng‟, „Đường tròn‟, „Hình ảnh‟. Như thế lớp „Vẽ một hình‟ kết hợp chức năng của ba lớp trên thêm vào chức năng được định nghĩa bên trong nó.

Lớp „Vẽ một hình‟ là một ví dụ về tính đa thừa kế.

Có thể sử dụng tính đa thừa kế để xây dựng một lớp mới, lớp này dẫn xuất chức năng của nó từ một vài lớp khác. Như thế, xét theo góc cạnh của người sử dụng lớp mới này, chỉ cần một lớp mà cung cấp tất cả các chức năng. Như vậy, họ không cần phải sử dụng nhiều đối tượng khác nhau.

Sự thuận lợi quan trọng nhất của tính thừa kế là nó thúc đẩy việc tái sử dụng mã chương trình.

Trong ví dụ trên, chúng ta có ba lớp „Đường thẳng‟, „Đường tròn‟ và „Hình ảnh‟. Giả thiết rằng ba người khác nhau xây dựng ba lớp này riêng biệt. Bây giờ, người sử dụng cần xây dựng một lớp để vẽ đường thẳng, vẽ đường tròn cũng như hiển thị hình ảnh. Vì thế họ tìm kiếm xem có lớp nào đáp ứng một hoặc tất cả các yêu cầu đó. Nếu có những lớp cung cấp chức năng thỏa yêu cầu thì người sử dụng sẽ thừa kế những lớp đó để tạo một lớp mới.

Giờ đây người sử dụng chỉ còn phải viết mã chương trình cho những đặc tính chưa có sau tiến trình thừa kế. Người sử dụng có thể sử dụng chính ba lớp trên. Tuy nhiên, sự thừa kế cung cấp một bó những chức năng hỗn độn trong một lớp.

Để đảm bảo tính dễ hiểu và hạn chế xung đột ngôn ngữ Java không có đa thừa kế, nhưng chúng có khái niệm giao diện Interface. Với Interface, ta có thể có hầu hết các lợi ích mà đa thừa kế mang lại. Chi tiết về giao diện và cài đặt về giao diện sẽ được trình bày chi tiết trong chương 3.

2.6.4. Tính đa hình

Java cũng hỗ trợ tính đa hình trong lập trình hướng đối tượng, tức là Java cũng cho phép các lớp kế thừa từ một lớp đã có cùng sử dụng một phương thức, nhưng khi tạo ra các đối tượng khác nhau ở các lớp cùng gọi đến phương thức đó sẽ cho các kết quả khác nhau.

Ví dụ 2.12: Tạo lớp shape, lớp tam giác và lớp Test như sau

Tạo lớp Shape: public class Shape {

private String Mau; private boolean FillMau; public shape() {

this.Mau = "red"; this.FillMau=true;

}


public Shape(String Mau, boolean FillMau) { this.Mau = Mau;

this.FillMau = FillMau;


}


public boolean isFillMau() { return FillMau;

}

public String getMau() { return Mau;

}

public void setFillMau(boolean FillMau) {

this.FillMau = FillMau;

}


public void setMau(String Mau) { this.Mau = Mau;

}

public void Inkq()

{


System.out.println("Các thuộc tính của shape là "); System.out.println("Mau = "+ getMau()); System.out.println("Dổ màu = "+ isFillMau());

}

}


Tạo lớp tam giác:

public class TamGiac extends shape{ private double canh1;

private double canh2; private double canh3;

public void setCanh1(double canh1) { this.canh1 = canh1;

}

public void setCanh2(double canh2) { this.canh2 = canh2;

}

public void setCanh3(double canh3) { this.canh3 = canh3;

}

public double getCanh1() { return canh1;

}

public double getCanh2() {

return canh2;

}


public double getCanh3() { return canh3;

}

public TamGiac() { this.canh1=0; this.canh2=0; this.canh3=0;

}

public TamGiac(double canh1, double canh2, double canh3) { this.canh1 = canh1;

this.canh2 = canh2; this.canh3 = canh3;

}

public void Inkq(){

System.out.println("Các thuộc tính của Tam giác là:"); System.out.println("Cạnh 1 = "+getCanh1()); System.out.println("Cạnh 2 = "+getCanh2()); System.out.println("Cạnh 3 = "+getCanh3());

}

}

Tạo lớp Test:


public class Test {

public static void main(String[] args) { TamGiac tb1 =new TamGiac(3,4,5); tb1.Inkq();

shape s1 = new shape("Xanh",true); s1.Inkq();

}

}

Kết quả chạy lớp Test

Các thuộc tính của Tam giác là: Cạnh 1 = 3.0

Cạnh 2 = 4.0

Cạnh 3 = 5.0

Các thuộc tính của shape là Mau = Xanh

Đổ màu = true

Qua kết quả cho thấy cả hai đối tượng tb1 và s1 cùng gọi đến phương thức Inkq() nhưng lại cho hiển thị 2 giá trị khác nhau. Đó chính là do tính đa hình trong Java

2.6.6. Lớp trừu tượng

Trong trường hợp ta định nghĩa một lớp mà chưa xác định các vùng dữ liệu và phương thức của nó, ta khai báo lớp đó là một lớp trừu tượng. Các vùng dữ liệu và phương thức cụ thể ta sẽ khai báo ở lớp dẫn xuất. Để khai báo một lớp là abstract ta đặt từ khoá abstract trước từ khóa class theo dạng sau:

abstract class X

{

}

Trong đó X là tên của lớp trừu tượng

Ta cũng có thể khai báo một phương thức là trừu tượng trong một lớp trừu tượng (và chỉ được khai báo trong các lớp trừu tượng) các phương thức này sẽ được khai báo chồng ở các lớp dẫn xuất và giải quyết các công việc cụ thể của lớp này. Ta có thể khai báo các phương thức trừu tượng theo dạng sau:

abstract <Datatype><Method_Name> ([<parameter-list>])

Một phương thức static hay private không được định nghĩa là trừu tượng. Vì khi khai báo là static hay private các phương thức này sẽ không bị khai báo chồng bởi các lớp dẫn xuất.

Ví dụ 2.13: Xây dựng lớp trừu tượng giảng viên và lớp con cán bộ kế thừa lớp giảng viên

public abstract class GiangVien {

private String Ma; private String HoTen; private String DiaChi;

public String getDiaChi() { return DiaChi;

}

public String getHoTen() { return HoTen;

}

public String getMa() { return Ma;

}

public void setDiaChi(String DiaChi) { this.DiaChi = DiaChi;

}

public void setHoTen(String HoTen) { this.HoTen = HoTen;

}

public void setMa(String Ma) { this.Ma = Ma;

}

public GiangVien() { this.Ma =""; this.HoTen=""; this.DiaChi ="";

}

public GiangVien(String Ma, String HoTen, String DiaChi) { this.Ma = Ma;

this.HoTen = HoTen; this.DiaChi = DiaChi;

Ngày đăng: 15/07/2022