1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình hướng đối tượng (dùng Java) Chương 3 Trần Minh Thái (2017 P2)

132 942 4

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 132
Dung lượng 1,75 MB

Nội dung

Bài giảng Lập trình hướng đối tượng (dùng Java) Chương 3 Lập trình Hướng đối tượng với Java (P2) cung cấp cho người học các kiến thức Vấn đề tái sử dụng code, kế thừa trong Java, tính đa hình trong Java, cài đặt interface trong Java, lập trình tổng quát. Mời các bạn cùng tham khảo nội dung chi tiết.

Trang 2

Nội dung

1 Vấn đề tái sử dụng code

2 Kế thừa trong Java

3 Tính đa hình trong Java

4 Cài đặt interface trong Java

5 Lập trình tổng quát

Trang 3

VẤN ĐỀ TÁI SỬ DỤNG CODE

Trang 4

Tái sử dụng code

• Lập trình cấu trúc: chương trình con

• OOP: nhiều loại đối tượng có thuộc tính, hành vi tương

tự nhau  tái sử dụng các lớp đã viết

• Trong một lớp vẫn tái sử dụng phương thức

• Ưu điểm:

• Giảm chi phí

• Nâng cao khả năng bảo trì và khả năng mô hình hóa

Trang 6

KẾT HỢP

AGGREGATION

Trang 7

• Lớp mới: Tam giác (Triangle) có 3 điểm

Lớp chứa tái sử dụng các thành viên của lớp thành

phần thông qua đối tượng

Trang 9

public int getX() {return x;}

public void setX(int x) {this.x = x;}

public int getY() {return y;}

public void setY(int y) {this.y = y;}

public void hienThi() {

System.out.printf("(%d, %d) \n ", this.x, this.y); }

}

Trang 11

Ví dụ Lớp TamGiac …

Trang 12

Bài tập 1

Xây dựng một trò chơi xúc xắc Cách chơi như sau:

• Mỗi hạt xúc xắc được gieo sẽ có giá trị ngẫu nhiên 1 6

• Hai người lần lượt gieo 1 hạt xúc xắc

• Sau mỗi lượt gieo, số điểm của lượt đó được tích lũy vào số điểm của người chơi

• Sau các lượt gieo theo quy định, người thắng cuộc là người có tổng số điểm lớn hơn

Hãy xác định các lớp cần thiết và cài đặt

Trang 13

Xác định lớp

• Xúc xắc (XucXac)

• Fields: giá trị của mặt (giaTri)

• Methods: sinh ngẫu nhiên giá trị mặt của xúc xắc

(sinhGiaTri())

• Người chơi (NguoiChoi)

• Fields: tên (ten), điểm (diem)

• Methods: gieo xúc xắc (gieoXucXac())

Trang 14

Xác định lớp

• Trận đấu (TranDau)

• Fields: xúc xắc (xucXac), 2 người chơi (nguoiChoi),

số vòng chơi (soVong), người thắng cuộc (nguoiThang)

• Methods: bắt đầu (batDau()), kết thúc (ketThuc), hiển thị thông tin (hienThi()), thực hiện trận đấu (thucHienTranDau())

Trang 15

Xác định lớp

Trang 16

Lớp XucXac

public class XucXac {

private int giaTri;

public int getGiaTri() {

return giaTri;

}

public void setGiaTri(int giaTri) {

this.giaTri = giaTri;

}

public XucXac(){

giaTri= 1 ;

}

public void sinhGiaTri(){

Random random = new Random();

this.giaTri=random.nextInt( 5 ) + 1 ; }

}

Trang 17

Lớp NguoiChoi

public class NguoiChoi { private String ten; private int diem; public String getTen() { return ten;

} public void setTen(String ten) { this.ten = ten;

} public int getDiem() { return diem;

} public void setDiem(int diem) { this.diem = diem;

}

Trang 18

Lớp NguoiChoi

public NguoiChoi(String ten){

this.ten=ten;

this.diem+=xucXac.getGiaTri();

System.out.println(" Diem: "

+ this.diem);

}

}

Trang 19

Lớp TranDau

public class TranDau {

private XucXac xucXac;

private NguoiChoi nguoiChoi1;

private NguoiChoi nguoiChoi2;

private NguoiChoi nguoiThang;

private int soVong;

public TranDau(String ten1, String ten2,

int soVong){

this.nguoiChoi1 = new NguoiChoi(ten1); this.nguoiChoi2 = new NguoiChoi(ten2); this.xucXac = new XucXac();

this.soVong = soVong;

}

Trang 20

Lớp TranDau

public void batDau(){

System.out.println("Tran dau bat dau ");

for(int i= 1 ; i<=this.soVong; i++){

System.out.printf("***** Vong %d ***** \n ",i);

System.out.println(">" + nguoiChoi1.getTen()

+ " gieo xuc xac");

nguoiChoi1.gieoXucXac(xucXac);

System.out.println(">" + nguoiChoi2.getTen()

+ " gieo xuc xac");

nguoiChoi2.gieoXucXac(xucXac);

}

}

Trang 21

Lớp TranDau

public void ketThuc(){

int diem1= nguoiChoi1.getDiem();

int diem2=nguoiChoi2.getDiem();

Trang 22

Lớp TranDau

public void hienThi(){

System.out.println("* Ket qua tran dau *"); System.out.printf("- Diem cua %s: %d",

nguoiChoi1.getTen(), nguoiChoi1.getDiem()); System.out.printf("- Diem cua %s: %d",

nguoiChoi2.getTen(), nguoiChoi2.getDiem());

Trang 23

public class XucXacTest {

public static void main(String []args){

String ten1, ten2;

int soVong;

Scanner sn = new Scanner(System.in);

System.out.print("> Ten nguoi choi 1: "); ten1=sn.nextLine();

System.out.print("> Ten nguoi choi 2: "); ten2=sn.nextLine();

System.out.print("> So vong dau: ");

soVong=sn.nextInt();

TranDau tranDau = new

TranDau(ten1, ten2, soVong);

tranDau.thucHienTranDau();

}

}

Trang 24

Bài tập 2

Hãy viết lại các lớp trong Bài tập 1 để thoả yêu cầu sau:

• Có thêm thuộc tính soBanThang ghi lại số bàn thắng

• Cho biết số ván đấu (>2), nếu người chơi nào thắng quá bán đầu tiên thì sẽ thắng

• VD: Giả sử 2 người chơi phải chơi 3 ván đấu Nếu người chơi nào thắng trước 2 ván thì người chơi đó thắng cả trận đấu

• Nếu hòa thì tính điểm để kết luận người thắng

Trang 25

GOM NHÓM ĐỐI TƯỢNG

Trang 26

Vấn đề gom nhóm đối tượng

• Nhóm các đối tượng có cùng tập thuộc tính/ hành vi lại với nhau thành một lớp

• Nhóm các đối tượng có cùng một số thuộc tính/ hành vi

VD: nhóm tất cả xe chạy bằng động cơ thành một

nhóm, rồi phân thành các nhóm nhỏ hơn tuỳ theo loại

xe (xe gắn máy, xe ô tô, xe tải, )

Trang 27

Vấn đề gom nhóm đối tượng

• Mỗi nhóm con là một lớp các đối tượng tương tự có chung một số đặc điểm

• Quan hệ giữa các nhóm con với nhóm lớn được gọi là

quan hệ “is-a”

Trang 28

Vấn đề gom nhóm đối tượng

• Ví dụ:

o Một xe ô tô “is-a” xe động cơ

o Một xe tải “is-a” xe động cơ

o Một xe máy “is-a” xe động cơ

Trang 29

Vấn đề gom nhóm đối tượng

• Mối liên kết giữa các lớp trong quan hệ “is-a” xuất phát

Trang 30

THỪA KẾ INHERITANCE

Trang 31

Mục tiêu của thừa kế

Tạo lớp mới bằng cách phát triển từ lớp đã có

• Lớp mới kế thừa những thành viên đã có trong lớp cũ

• Lớp cũ: Lớp cha (superclass), lớp cơ sở (baseclass)

• Lớp mới: Lớp con (subclass), lớp dẫn xuất (derived class)

Trang 32

Mục tiêu của thừa kế

Ví dụ:

• Lớp cũ: Điểm (ToaDoDiem)

• Kết hợp: Tam giác (TamGiac) có 3 điểm

• Kế thừa: Tam giác vuông (TamGiacVuong)

Trang 33

Sơ đồ thừa kế của lớp

Trang 34

Lớp cơ sở

• Lớp cha – superclass (hoặc lớp cơ sở - base class)

 Lớp tổng quát hơn trong mối quan hệ “is-a”

 Các đối tượng thuộc lớp cha có cùng tập thuộc tính và hành vi

Trang 35

Lớp dẫn xuất

• Lớp con – subclass (hoặc lớp dẫn xuất – derived class)

 Lớp cụ thể hơn trong một quan hệ “is-a”

 Các đối tượng thuộc lớp con có cùng tập thuộc tính và hành vi (do thừa kế từ lớp cha), kèm thêm tập thuộc tính và hành vi của riêng lớp con

Trang 37

Phân loại thừa kế

1 Thừa kế đơn (single inheritance): chỉ có một lớp cha

2 Đa thừa kế (multiple inheritance): có nhiều lớp cha

Trang 38

Sơ đồ quan hệ đối tượng

(Object Relationship Diagram – ORD)

Trang 39

Nguyên tắc biểu diễn sơ đồ thừa kế

Các quan hệ thừa kế luôn được biểu diễn với các lớp dẫn xuất đặt dưới lớp cơ sở để nhấn mạnh bản chất phả hệ của quan hệ

Trang 40

Ưu điểm của thừa kế

1 Tiết kiệm thời gian và công sức

2 Tái sử dụng lại những lớp có sẵn

3 Giảm lượng code phải thiết kế, viết, kiểm tra

4 Tránh trùng lắp code

5 Rút ngắn thời gian giúp LTV tập trung vào mục tiêu

6 Giúp phân loại và thiết kế lớp dễ dàng, dễ quản lý

Trang 41

Quan hệ “is-a” Quan hệ “has-a”

Ví dụ: Tam giác vuông là

một loại tam giác

Ví dụ: Tam giác có 3 đỉnh

Trang 42

ĐỊNH NGHĨA LỚP THỪA KẾ

Trang 43

• Lớp con truy cập tới thành viên lớp cha qua từ khóa super

• Mọi lớp trong Java đều kế thừa từ lớp tổng quát Object

• Lớp Object cung cấp một số phương thức toString(), equals()

• Java chỉ cho phép đơn kết thừa: một lớp chỉ có thể kế thừa từ duy nhất 1 lớp khác

Trang 44

Chỉ định truy cập của lớp cha

• public: cho phép lớp con kế thừa ở bất kỳ đâu

• Không chỉ định: chỉ cho phép lớp con kế thừa khi cùng

package với lớp cha

Trang 45

Chỉ định truy cập thành viên

• public, protected: cho phép lớp con được kế thừa và

truy cập thuộc tính/phương thức trên lớp cha (!!!đối với public không cần kế thừa cũng truy cập được)

• Không chỉ định: chỉ cho phép lớp con ở cùng package

được kế thừa và được truy cập tới thuộc tính/thành viên tương ứng của lớp cha

• private: lớp con không được kế thừa thuộc tính/phương thức này, không được truy cập vào thuộc tính/thành viên tương ứng trên lớp cha

Trang 46

public int publicValue;

private void privateMethod() { }

protected void protectedMethod() { }

void noModifierMethod() { }

public void publicMethod() { }

}

Trang 47

//Gọi phương thức của lớp cha super.privateMethod(); //Lỗi super.protectedMethod(); //OK super.noModifierMethod(); //OK super.publicMethod(); //OK

} }

Trang 48

//Gọi phương thức của lớp cha super.privateMethod(); //Lỗi super.protectedMethod(); //OK super.noModifierMethod(); //Lỗi super.publicMethod(); //OK

} }

Trang 49

Ví dụ không chỉ định public class cha

• Cùng gói: tương tự chỉ định public

• Khác gói: không cho kế thừa!!!

Trang 50

KHỞI TẠO ĐỐI TƯỢNG TRONG THỪA KẾ

Trang 51

Khởi tạo đối tượng trong thừa kế

• Lớp con không thừa kế constructor của lớp cha

• Các constructor của lớp con tự động gọi default constructor của lớp cha (nếu có)

• Nếu lớp cha không có default constructor thì phải gọi

phương thức khác default constructor của lớp cha

• Cú pháp: super(parameterList)

Trang 52

!!! Lớp cha phải được gọi khởi tạo trước lớp con

Nếu không Error: call to super must be first statement in constructor

Trang 53

Ví dụ khởi tạo đối tượng trong thừa kế

Trang 54

Ví dụ khởi tạo đối tượng trong thừa kế …

Trang 55

Ví dụ khởi tạo đối tượng trong thừa kế …

Trang 56

Ví dụ khởi tạo đối tượng trong thừa kế …

Trang 57

Đối tượng cha và con

• Khi tạo đối tượng con thì đối tượng cha cũng được tạo

ra độc lập

• Đối tượng con tham chiếu tới đối tượng cha qua super

(tham chiếu này là private)

• Trong lớp con, nếu truy cập tới thành viên của lớp cha

thì được thông qua super (tường minh, hoặc không

tường minh): đối tượng con được xem như đối tượng

thuộc lớp cha (upcasting)

Trang 59

Ví dụ

Trang 60

Toán tử instanceof

• Kiểm tra một đối tượng có phải đang là thể hiện của

lớp hoặc giao diện nào đó không: true hoặc false

• Cú pháp:

objectName instanceof ClassName

objectName instanceof InterfaceName

Trang 61

CÁC BƯỚC THIẾT KẾ LỚP THỪA KẾ

Trang 62

Các bước thiết kế lớp thừa kế

B1: Xác định các lớp đối tượng trong bài toán yêu cầu

B2: Liệt kê các thành phần thuộc tính và phương thức

cho từng lớp

B3: Xác định những thuộc tính và phương thức chung

giữa các lớp và tạo thành lớp cơ sở cho những lớp này

B4: Vẽ sơ đồ lớp

Trang 64

Ví dụ

Cần quản lý thông tin của giảng viên và sinh viên trong

một trường Đại học (tạo đối tượng thông qua

Trang 66

Phân tích và thiết kế lớp

B1: Xác định lớp đối tượng

1 Lớp Sinh viên (SinhVien)

2 Lớp Giảng viên (GiangVien)

Trang 67

• Fields: hoTen (họ tên), tuoi (tuổi), hocVi (học hàm

và học vị), heSoLuong (hệ số lương), luongCB (lương cơ bản)

• Methods: hienThiGV (hiển thị thông tin giảng viên)

Trang 68

• Fields: hoTen (họ tên), tuoi (tuổi), hocVi (học hàm

và học vị), heSoLuong (hệ số lương), luongCB (lương cơ bản)

• Methods: hienThiGV (hiển thị thông tin giảng viên)

Trang 69

• Fields: hoTen (họ tên), tuoi (tuổi)

• Methods: hienThi (hiển thị thông tin: hoTen và tuoi)

Trang 70

Phân tích và thiết kế lớp

B4: Sơ đồ lớp

Trang 71

public class ConNguoi {

private String hoTen;

private int tuoi;

public String getHoTen() {

public void setTuoi(int tuoi) {

this.tuoi = tuoi;

}

Trang 72

public void hienThi() {

System.out.println("- Ho ten: "

Trang 73

public class GiangVien extends ConNguoi {

private String hocVi;

private double heSoLuong;

private int luongCB;

public GiangVien(String hoTen, int tuoi,

String hocVi, double heSoLuong,

int luongCB) { super(hoTen, tuoi);

Trang 74

public String getHocVi() {

return hocVi;

}

public void setHocVi(String hocVi) {

this.hocVi = hocVi;

Trang 75

public int getLuongCoBan() {

Trang 76

public class SinhVien extends ConNguoi {

private int soTinChi;

public int getSoTinChi() {

Trang 77

public void capNhatTinChi(int soLuong) {

this.setSoTinChi(this.getSoTinChi()

Trang 78

public class SinhVienTest {

public static void main(String []args) {

System.out.println("*Tao sinh vien An:");

SinhVien sinhVien = new SinhVien("An", 17 );

System.out.println("*Thong tin cua An:");

sinhVien.hienThiSV();

System.out.println("*An hoc xong mon OOP");

System.out.println("*Cap nhat tin chi cho An:"); sinhVien.capNhatTinChi( 4 );

System.out.println("*Thong tin cua An:");

sinhVien.hienThiSV();

}

}

Trang 79

Che thuộc tính

Trong lớp con khai báo một thuộc tính có tên giống lớp cha thì trong lớp con thuộc tính của lớp cha bị che đi

• Để truy cập tới thuộc tính trên lớp cha dùng super

• Để phân biệt trong lớp con, dùng this

Trang 80

Ví dụ

Trang 81

Ví dụ

Trang 84

Định nghĩa lại phương thức lớp cơ sở

• Lớp con có thể định nghĩa lại các phương thức kế thừa

từ lớp cha dùng kỹ thuật overriding

!!!Phương thức ở lớp cha và lớp con phải cùng nguyên

mẫu

Phân biệt Overriding với Overloading phương thức

Trang 85

public class LopCha {

private int money;

public LopCha() {

this.money = 1000 ;

}

public void rutTien(int soTien) {

this.money -= soTien;

System.out.println("Tien cua cha: "

+ this.money);

}

}

public class LopCon extends LopCha {

private int money;

public LopCon() {

this.money = 500 ;

}

public void hienThi(){

System.out.println("Tien cua con: " + this.money); }

}

Trang 86

public class NonOverrideTest {

public static void main(String []args){ LopCon lopCon = new LopCon();

lopCon.rutTien( 200 );

lopCon.hienThi();

}

}

Trang 87

public class LopCha {

private int money;

public LopCha() {

this.money = 1000 ;

}

public void rutTien(int soTien) {

this.money -= soTien;

System.out.println("Tien cua cha: "

+ this.money);

}

}

public class LopCon extends LopCha {

private int money;

public LopCon() {

this.money = 500 ;

}

public void rutTien(int soTien) {

this.money -= soTien;

System.out.println("Tien cua con: " +this.money); }

}

Trang 88

public class OverrideTest {

public static void main(String []args){ LopCon lopCon = new LopCon();

lopCon.rutTien( 200 );

}

}

Trang 89

Cấm overriding phương thức

• Đảm bảo tính đúng đắn: overrideing phương thức có thể gây ra sự sai lạc về ý nghĩa

• Tính hiệu quả: giảm thời gian xử lý lời gọi phương thức

 định nghĩa phương thức với từ khóa final

Trang 90

Ví dụ

Lỗi

Trang 91

Overriding equals()

• Không thể dùng toán tử so sánh == để so sánh 2 đối tượng

• Mọi lớp được kế thừa phương thức equals từ lớp Object

 định nghĩa lại cho phù hợp

• Hai đối tượng bằng nhau khi thỏa mãn 2 điều kiện:

• Cùng thuộc một lớp

• Giá trị của mọi thuộc tính là như nhau

!!!2 giá trị tham chiếu bằng nhau đối tượng bằng nhau

Trang 92

Overriding equals() cho lớp

ConNguoi

Trang 94

TÍNH ĐA HÌNH TRONG JAVA

Trang 95

Tính đa hình trong Java

Khái niệm

Trừu tượng hoá

Hiện thực đa hình trong Java

Trang 96

Đa hình ( poly morphism)

 poly = many

 morphism = forms

Khái niệm Đa hình

Đa hình là hiện tượng các đối tượng thuộc các lớp khác nhau có khả năng hiểu cùng một thông điệp theo các cách

Trang 97

Khái niệm Đa hình

LandRover object

Ford object

Honda object

Trang 98

Khái niệm Đa hình

• Đa hình phương thức: Cùng một phương thức có thể

được thực hiện khác nhau trên các loại đối tượng khác nhau

• Đa hình đối tượng: nhìn nhận đối tượng theo nhiều

kiểu khác nhau

Ngày đăng: 15/05/2017, 10:28

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w