Giáo trình Kỹ thuật phần mềm - Chương 3: Lập trình hướng đối tượng Java - Phạm Duy Trung

• Tính đa hình ám chỉ việc một thực thể, một hành động có thể được biểu hiện theo nhiều dạng khác nhau • Có hai loại đa hình trong Java: đa hình trong phase biên dịch (compile time) và đa hình trong phase chạy (run time) • Đa hình trong phase biên dịch: nạp chồng phương thức (method overloading) • Đa hình trong phase chạy: ghi đè phương thức (method overriding)

pdf68 trang | Chia sẻ: huongthu9 | Lượt xem: 402 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Kỹ thuật phần mềm - Chương 3: Lập trình hướng đối tượng Java - Phạm Duy Trung, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG JAVA Lịch sử phát triển của lập trình “Không có ngôn ngữ, chỉ có dây và phích cắm” Bắt đầu hoạt động vào năm 1946, ENIAC chiếm diện tích hơn 167 𝑚2, nặng 27 tấn, không chỉ thực hiện được các phép tính cơ bản, còn cho phép chạy vòng lặp, rẽ nhánh và các thủ tục con. duytrung.tcu@gmail.com Lịch sử phát triển của lập trình • Lịch sử phát triển của lập trình chứng kiến sự từ bỏ cách lập trình từ góc nhìn của máy tính để xây dựng những khái niệm và nguyên lý phản chiếu (gần như) chính xác sự cảm nhận thế giới thực của con người. • Sự “tiến hóa” của ngôn ngữ lập trình Machine language Assembly languages High-level languages duytrung.tcu@gmail.com Machine languages • Chỉ gồm 0 và 1 – mã nhị phân • Là ngôn ngữ “tự nhiên” với máy tính, liên hệ chặt chẽ với phần cứng máy tính • Độ khó lập trình: God level - chỉ đặt sai giá trị một bit có thể làm sai tất cả chương trình. • Ví dụ về ngôn ngữ máy: 00110010 00001110 00010010 00000000 duytrung.tcu@gmail.com Assembly languages • Là một bước tiến để lập trình trở nên dễ hơn • Bao gồm tập các câu lệnh cơ bản được xây dựng cho một bộ xử lý cụ thể • Mã Assembly cần được dịch thành mã máy để máy tính có thể hiểu được • Mỗi lệnh Assembly được ánh xạ 1-1 thành một chỉ dẫn NN máy • Ví dụ: XOR CL, [12H] duytrung.tcu@gmail.com High-level languages • Là một bước nhảy vọt trong lịch sử lập trình • Cú pháp rất giống với ngôn ngữ tự nhiên của con người • Trên quan điểm lịch sử, được phân chia làm 2 nhóm chính: - Các ngôn ngữ hướng thủ tục / hướng cấu trúc (procedural) - Các ngôn ngữ hướng đối tượng (object-oriented) duytrung.tcu@gmail.com Procedural languages • Các ngôn ngữ bậc cao thời kỳ đầu là các ngôn ngữ hướng thủ tục: C, COBOL, Fortran, LISP, PERL, HTML, VBScript • Các ngôn ngữ loại này tập trung vào cấu trúc của một chương trình: đặc trưng bởi các câu lệnh tuyến tính, chương trình xử lý theo logic tuần tự từ trên xuống duytrung.tcu@gmail.com Procedural languages duytrung.tcu@gmail.com Object-oriented languages • Mục tiêu của các ngôn ngữ hướng đối tượng không phải là cấu trúc của chương trình, mà là mô hình hóa dữ liệu • Lập trình viên sử dụng các “thiết kế” mô hình hóa dữ liệu gọi là các lớp (class), từ đó sinh ra các đối tượng (object) có các thuộc tính (attributes) riêng biệt và tác động nội ngoại thông qua các phương thức (methods) • Ví dụ ngôn ngữ: C++, VB .NET, C#, Java, Kotlin, Swift, Objective- C duytrung.tcu@gmail.com Object-oriented languages duytrung.tcu@gmail.com Đối tượng (object) là gì? • Object (n) a thing that could be seen and touched (Oxford Dict) • Tất cả những gì ta thấy xung quanh đều là đối tượng • Trong sự vận động của thế giới, các đối tượng luôn tương tác với nhau. Con người trong các công việc, hoạt động của mình cần tương tác với vô vàn sự vật, hiện tượng khác • Với yêu cầu “dạy” cho máy tính thực hiện công việc, cần tìm cách mô tả quy trình con người làm công việc đó trên máy tính -> mô tả các đối tượng tham gia công việc -> thế giới thực có thể được mô tả lại chính xác thông qua tập hợp các “đối tượng” có tương tác duytrung.tcu@gmail.com Đối tượng thế giới thực • 2 đặc tính của đối tượng thế giới thực: trạng thái và hành vi Màu lông, cân nặng, tên, đói, buồn Sủa Vẫy đuôi Chạy nhảy Ăn uống duytrung.tcu@gmail.com Đối tượng thế giới thực duytrung.tcu@gmail.com Mô tả đối tượng trong lập trình duytrung.tcu@gmail.com Mô tả đối tượng trong lập trình • Mô tả trạng thái của đối tượng thông qua các trường / thuộc tính (fields/attributes) -> các biến - Hãng sản xuất - Lượng xăng - Màu - Tốc độ hiện tại • Mô tả hành vi của đối tượng thông qua các phương thức hành động (methods) -> các hàm - Khởi động() - Đổ xăng() - Phanh() - Dừng() Danh từ Động từ duytrung.tcu@gmail.com Định nghĩa Lớp • Lớp (Class) là một khuôn mẫu được sử dụng để mô tả các đối tượng cùng loại • Một lớp có tên xác định, chứa trong nó các thuộc tính và các phương thức • Mỗi đối tượng được tạo ra từ một lớp được gọi là một thực thể (instance) của lớp đó • Việc ấn định giá trị cho các thuộc tính và sử dụng các phương thức sẽ tạo nên đặc trưng trạng thái và hành vi cho một đối tượng cụ thể duytrung.tcu@gmail.com Lớp và Đối tượng duytrung.tcu@gmail.com Cú pháp khai báo Lớp duytrung.tcu@gmail.com Ví dụ về khai báo lớp duytrung.tcu@gmail.com Ví dụ về tạo đối tượng • Từ khóa new được sử dụng để tạo đối tượng • Biến emp chứa tham chiếu tới đối tượng • Sử dụng toán tử (.) để truy xuất đến các thành viên của đối tượng (trường và phương thức) duytrung.tcu@gmail.com Default Constructor Định nghĩa phương thức • Cú pháp: giống như viết hàm • Phương thức có thể nhận không hoặc nhiều tham số đầu vào • Phương thức có thể có kiểu trả về hoặc không (void) • input() và output() trong class Employee duytrung.tcu@gmail.com Tạo phương thức Xây dựng phương thức cho lớp Employee: • setInfo(String, double): cho phép gán giá trị cho các thuộc tính fullname và salary, không có kiểu trả về • incomeTax(): trả về giá trị tiền thuế thu nhập dựa trên thuộc tính salary của đối tượng -salary < 5000000 : miễn thuế -salary ≥ 5000000 : thuế bằng 10% lương duytrung.tcu@gmail.com Tạo phương thức duytrung.tcu@gmail.com Nạp chồng phương thức (overloading) • Trong một lớp, có thể có nhiều phương thức cùng tên, miễn là phân biệt với nhau về tham số (kiểu, số lượng, thứ tự) duytrung.tcu@gmail.com public class Employee{ void setInfo() {...} void setInfo(String val) {...} void setInfo(double val) {...} void setInfo(String val1, double val2){...} void setInfo(double val1, String val2){...} } Nạp chồng phương thức (overloading) duytrung.tcu@gmail.com Hàm khởi tạo (Constructor) • Là một phương thức đặc biệt: lấy tên của lớp và không có kiểu trả về, dùng để tạo một thực thể từ lớp qua từ khóa new • Tương tự như phương thức, có thể có nhiều constructor, mỗi hàm cung cấp một cách khởi tạo đối tượng khác nhau duytrung.tcu@gmail.com Từ khóa “this” • this được sử dụng để ám chỉ đối tượng hiện tại • this được sử dụng trong lớp để tham chiếu đến các thành viên trong lớp duytrung.tcu@gmail.com Hàm khởi tạo mặc định • Khi lớp không được khai báo bất kỳ hàm khởi tạo nào, Java sẽ sinh ra một hàm khởi tạo mặc định cho lớp đó • Hàm khởi tạo này không có tham số (no-argument constructor) • Hàm khởi tạo này sẽ đặt giá trị cho tất cả các trường chưa được khởi tạo về giá trị mặc định của kiểu dữ liệu của trường đó duytrung.tcu@gmail.com public class Employee{ String fullname; double salary; public Employee() { this.fullName = null; this.salary = 0.0; } } public class Employee{ String fullname; double salary; public Employee() { } } public class Employee{ String fullname; double salary; // không có hàm khởi tạo } Biến và phương thức của lớp • Mỗi đối tượng có các giá trị ở các thuộc tính là khác nhau • Nếu ta mong muốn tạo ra một biến số chung của lớp mà tất cả các đối tượng đều có thể thấy và dùng? tương tự đối với phương thức? • Sử dụng từ khóa static trước biến và phương thức để khai báo sở hữu của lớp, không phải của đối tượng • Để gọi đến biến và phương thức của lớp, gọi . duytrung.tcu@gmail.com Biến và phương thức của lớp duytrung.tcu@gmail.com I belong to the class Lion Lions have 4 legs I belong to a lion I have 4 legs Biến của lớp và biến của đối tượng • Biến của lớp chỉ có 1 bản sao duy nhất thuộc về lớp, bất kể bao nhiêu đối tượng được sinh ra từ lớp đó. • Biến của lớp được tất cả các đối tượng dùng chung, được khai báo static và thường phạm vi là public • Biến của đối tượng, ngược lại, được sinh ra riêng cho mỗi một đối tượng, thay đổi giá trị biến này trong đối tượng này không ảnh hưởng gì đến giá trị biến cùng tên trong đối tượng khác • Thường được khai báo private (Xem thêm Encapsulation) duytrung.tcu@gmail.com Từ khóa “final” • Khi một lớp được khai báo final, lớp đó sẽ không có khả năng được lớp khác kế thừa • Khi một biến được khai báo final, biến đó sẽ trở thành hằng số, do đó các biến static thường đi kèm với final, bởi biến của lớp thường chứa các giá trị hằng số cho phép công khai public static final double PI = 3.14; • Khi một phương thức được khai báo final, phương thức đó sẽ không thể bị ghi đè bởi phương thức khác duytrung.tcu@gmail.com Package • Package là một tập hợp các class, interface, enum và annotation có liên quan đến nhau • Package được sử dụng để chống xung đột định danh, kiểm soát truy cập, giúp tìm kiếm và sử dụng các class, interface, enum và annotation dễ dàng và hiệu quả hơn • Package có thể chứa nhiều package khác • Các package của Java: package java chứa trong nó các package java.util, java.lang, java.awt, java.sql, java.beans duytrung.tcu@gmail.com Package • Khi tạo package, ta chọn tên cho package và phải đặt từ khóa package đi kèm với tên này ở đầu các file code nào có các class, interface, enum và annotation cần đưa vào package • Mỗi một file source code chỉ chứa 1 câu lệnh package, và thường là câu lệnh đầu tiên trong file • Một kinh nghiệm là đặt tên package bằng chữ thường để tránh xung đột với tên các thành phần package đó chứa duytrung.tcu@gmail.com Import package • Khi 1 class gọi đến 1 class khác trong cùng package thì không cần dùng đến tên package • Để gọi đến 1 class ở package khác, có thể thực hiện theo 1 trong những cách sau: - Gọi đầy đủ tên package khi cần sử dụng: payroll.Employee; - Sử dụng từ khóa import và dấu *: import payroll.*; - Chỉ import đến class cần dùng: import payroll.Employee; duytrung.tcu@gmail.com Đặc tả truy xuất (Access modifier) • Java cung cấp các từ khóa đặc tả truy xuất để kiểm soát phạm vi truy cập cho các class, biến và phương thức duytrung.tcu@gmail.com Đặc tả truy xuất (Access modifier) duytrung.tcu@gmail.com class Đặc tả truy xuất (Access modifier) duytrung.tcu@gmail.com Quy ước định danh trong Java duytrung.tcu@gmail.com Loại tên Quy ước Class Bắt đầu bằng chữ hoa, là danh từ , ví dụ: String, Color, Button, System, Thread... Interface Bắt đầu bằng chữ hoa, thường là tính từ, ví dụ: Runnable, Remote, ActionListener Phương thức Băt đầu bằng chữ thường, thường là động từ, ví dụ: actionPerformed(), main(), print(), println()... Biến Bắt đầu bằng chữ thường, ví dụ: firstName, orderNumber ... Package Viết bằng chữ thường ví dụ: java, lang, sql, util .... Constant Viết toàn bộ bằng chữ hoa. e.g. RED, YELLOW, MAX_PRIORITY etc. duytrung.tcu@gmail.com Bài tập • Xây dựng lớp Hình tròn có một biến tĩnh tên PI là hằng số pi, một trường lưu bán kính của hình tròn, một hàm khởi tạo cho phép khởi tạo bán kính của hình tròn, một phương thức tính diện tích của hình tròn. duytrung.tcu@gmail.com CÁC NGUYÊN LÝ CỦA OOP TRONG JAVA Ưu điểm của OOP • Tính tái sử dụng code • Tính dễ bảo trì code • Tính linh hoạt khi sử dụng đối tượng • Tính mô đun hóa cao • Tính bảo mật duytrung.tcu@gmail.com Các nguyên lý của OOP • Encapsulation – Tính bao gói và che giấu dữ liệu • Abstraction – Tính trừu tượng • Inheritance – Tính kế thừa • Polymorphism – Tính đa hình duytrung.tcu@gmail.com Encapsulation • Bao gói các trường và phương thức vào trong một lớp như một “hộp đen”: sử dụng mà không cần/được biết cơ chế bên trong • Che giấu dữ liệu và che giấu cách thực hiện • Kiểm soát truy cập thông qua các đặc tả truy xuất  Quy định người sử dụng được làm gì và không được làm gì,  Xây dựng phần giao tiếp tách biệt hoàn toàn với phần thực thi duytrung.tcu@gmail.com Encapsulation – che giấu dữ liệu • Giả sử ta có lớp SinhVien và công khai họ tên và điểm như sau: • Điều gì xảy ra nếu như người dùng tùy ý gán điểm âm hoặc điểm lớn hơn 10? duytrung.tcu@gmail.com Encapsulation – che giấu dữ liệu • Để che giấu dữ liệu, đặt phạm vi truy cập cho các trường là private • Người dùng chỉ có thể tương tác với các trường private thông qua giao diện là các phương thức getter và setter kiểu như: duytrung.tcu@gmail.com duytrung.tcu@gmail.com Encapsulation – che giấu dữ liệu Abstraction – tính trừu tượng • Một thực thể thế giới thực có thể có trạng thái và hành vi rất phức tạp • Tính trừu tượng nhấn mạnh vào việc lựa chọn những kiến thức vừa đủ để mô tả thực thể trong một ngữ cảnh xác định, chứ không cần phải liệt kê tất cả các thuộc tính, hành vi của nó => Tạo ra một phản chiếu trừu tượng của thực thể thực tiễn, người dùng chỉ cần biết đủ về đối tượng để sử dụng nó duytrung.tcu@gmail.com Abstraction – tính trừu tượng • Ví dụ: Mô tả đối tượng SinhVien để sử dụng cho một phần mềm quản lý sinh viên. Sinh viên có rất nhiều thông tin và hành vi. Ta chỉ quan tâm đến các thuộc tính như: tên, năm sinh, giới tính, ngành học, quê quán chứ không cần quan tâm đến chiều cao, cân nặng, thói xấu, hát, nói, nhảy lò cò, đi chơi duytrung.tcu@gmail.com Inheritance – Tính kế thừa • Là nguyên lý then chốt cho phép tái sử dụng và bảo trì code trong Java • Khi đã tồn tại một lớp có nhiều đặc điểm mà ta mong muốn, ta có thể kế thừa lớp đó để tạo nên lớp mới để không phải viết (và cả debug!) lại các trường và phương thức chung nữa • Trong Java, lớp mà kế thừa từ lớp khác được gọi là subclass (lớp con), còn lớp được kế thừa gọi là superclass (lớp cha) • Theo cây phân cấp, tất cả các lớp đều là “hậu duệ” của lớp Object trong package java.lang duytrung.tcu@gmail.com Inheritance – Tính kế thừa • Java chỉ cho phép đơn thừa kế (single inheritance) • Lớp con sẽ được sở hữu các tài sản từ lớp cha: - Các tài sản public hoặc protected - Các tài sản default nếu lớp con và lớp cha thuộc cùng package • Lớp con không truy cập được các tài sản private của lớp cha • Lớp con không kế thừa các hàm khởi tạo của lớp cha duytrung.tcu@gmail.com Sử dụng “super” • Truy cập đến các thành viên của lớp cha bằng cách sử dụng từ khóa super • Có thể sử dụng super để gọi hàm khởi tạo của lớp cha duytrung.tcu@gmail.com Sử dụng “super” duytrung.tcu@gmail.com Animals can move Dogs can walk and run Ghi đè phương thức – Overriding • Overriding được thực hiện khi lớp con và lớp cha có phương thức cùng cú pháp • Lớp Child và Parent đều có phương thức method() cùng cú pháp nên method() trong Child sẽ ghi đè lên method() trong Parent • Sử dụng từ khóa super để truy cập đến phương thức bị ghi đè của lớp cha duytrung.tcu@gmail.com Ghi đè phương thức – Overriding duytrung.tcu@gmail.com Animals can move Dogs can walk and run Lưu ý khi ghi đè phương thức • Danh sách đối số giữa 2 PT phải giống nhau • Kiểu trả về phải tương thích với kiểu trả về của PT gốc (chính kiểu đó hoặc kiểu con của kiểu đó) • Phạm vi truy cập của của PT ghi đè không được nhỏ hơn phương thức gốc • Không thể ghi đè lên PT được khai báo final • Không thể ghi đè lên hàm khởi tạo • Nên sử dụng chỉ dẫn @Override đặt trước PT ghi đè duytrung.tcu@gmail.com Lớp trừu tượng • Nhiều trường hợp, ta cần tập trung mô tả ý tưởng, cách tổ chức hơn là cách thực thi - Đã là hình thì sẽ có diện tích và chu vi, nhưng tính thế nào còn phụ thuộc xem hình là tam giác, chữ nhật mới có thể xác định cụ thể; - Ai trong công ty cũng có thu nhập, nhưng để tính được thu nhập cần biết được chức vụ, số ngày công, chế đô chính sách với từng nhóm người; • Lớp trừu tượng là lớp có các hành vi chưa được xác định rõ ràng • Lớp Hình và lớp Nhân viên là các lớp trừu tượng vì các phương thức tính chu vi, diện tích và tính điểm chưa được xác định cụ thể duytrung.tcu@gmail.com Lớp trừu tượng Hình Chữ nhật Vuông Tam giác Tròn duytrung.tcu@gmail.com Viên chức Nhân viên Trưởng phòng Giám đốc Từ khóa “abstract” • Một lớp được khai báo kèm từ khóa abstract sẽ trở thành một lớp trừu tượng • Một phương thức được khai báo kèm từ khóa abstract sẽ trở thành một phương thức trừu tượng duytrung.tcu@gmail.com Tính chất của lớp và PT trừu tượng • Một PT trừu tượng không có phần thân hàm • Một lớp trừu tượng có thể không có PT trừu tượng nào • Tuy nhiên, một khi đã chứa một PT trừu tượng thì bắt buộc phải khai báo lớp đó là abstract • Không thể tạo đối tượng từ lớp trừu tượng • Để sử dụng lớp trừu tượng, phải kế thừa nó ở 1 lớp khác. Lớp kế thừa phải cung cấp phần thân hàm (thực thi) cho tất cả các PT trừu tượng trong lớp trừu tượng được kế thừa duytrung.tcu@gmail.com Nội dung tự tìm hiểu • Tìm hiểu về interface trong Java • Ý tưởng đa thừa kế được thực hiện thông qua interface được không? Nếu được cho một ví dụ • So sánh giữa abstract class và interface duytrung.tcu@gmail.com Bài tập • Tạo lớp trừu tượng Hình với 2 phương thức tính chu vi và diện tích, sau đó xây dựng các lớp Chữ nhật, Tròn, Tam giác kế thừa lớp Hình. Thêm thuộc tính cho phù hợp với mỗi lớp và hoàn thiện 2 phương thức trên ứng với mỗi loại hình. • Tạo lớp trừu tượng Viên chức với 2 thuộc tính là tên và hệ số lương theo tháng và PT tính thu nhập theo năm. Xây dựng các lớp Nhân viên, Trưởng phòng và Giám đốc kế thừa lớp Viên chức. Hoàn thiện phương thức tính thu nhập, biết: - Hệ số lương của Nhân viên là 3.5, Trưởng phòng là 5.0, Giám đốc là 8.0, lương cơ bản là 1.500.000đ. - Trưởng phòng và Giám đốc có thêm hệ số trách nhiệm lần lượt là 1.0 và 3.3 theo tháng - Tính thu nhập theo năm thì Nhân viên, Trưởng phòng và Giám đốc lần lượt được thưởng thêm 1, 2 và 3 tháng lương không kèm trách nhiệm duytrung.tcu@gmail.com Polymorphism – Tính đa hình • Tính đa hình ám chỉ việc một thực thể, một hành động có thể được biểu hiện theo nhiều dạng khác nhau • Có hai loại đa hình trong Java: đa hình trong phase biên dịch (compile time) và đa hình trong phase chạy (run time) • Đa hình trong phase biên dịch: nạp chồng phương thức (method overloading) • Đa hình trong phase chạy: ghi đè phương thức (method overriding) duytrung.tcu@gmail.com Runtime polymorphism • Việc gọi đến phương thức ghi đè được thực hiện khi chương trình đã chạy. • PT này được gọi thông qua biến tham chiếu của lớp cha, việc xác định PT phù hợp phụ thuộc vào đối tượng được biến tham chiếu trỏ đến. duytrung.tcu@gmail.com Runtime polymorphism duytrung.tcu@gmail.com Tổng kết nội dung bài học • Đặc điểm ngôn ngữ hướng đối tượng • Khái niệm object • Class trong Java • Các nguyên lý cơ bản của lập trình hướng đối tượng duytrung.tcu@gmail.com Yêu cầu về nhà • Ôn bài, tham chiếu với các nguồn tài liệu tham khảo • Chạy các ví dụ trong bài, tìm và chạy các ví dụ trong các tài liệu • Làm bài tập và tự tìm hiểu nội dung đã yêu cầu • Tìm hiểu trước về exception trong Java duytrung.tcu@gmail.com

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_ky_thuat_phan_mem_chuong_3_lap_trinh_huong_doi_tu.pdf