Bài giảng Kỹ thuật phần mềm - Chương 3: Lập trình hướng đối tượng trong java

pdf 68 trang Hùng Dũng 04/01/2024 360
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật phần mềm - Chương 3: Lập trình hướng đối tượng trong java", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_ky_thuat_phan_mem_chuong_3_lap_trinh_huong_doi_tuo.pdf

Nội dung text: Bài giảng Kỹ thuật phần mềm - Chương 3: Lập trình hướng đối tượng trong java

  1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG JAVA
  2. 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
  3. 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 High-level Assembly languages Machine languages language duytrung.tcu@gmail.com
  4. 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
  5. 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
  6. 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
  7. 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
  8. Procedural languages duytrung.tcu@gmail.com
  9. 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
  10. Object-oriented languages duytrung.tcu@gmail.com
  11. Đố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
  12. Đố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 Sủa Màu lông, Vẫy Ăn cân nặng, đuôi uống tên, đói, buồn Chạy nhảy duytrung.tcu@gmail.com
  13. Đối tượng thế giới thực duytrung.tcu@gmail.com
  14. Mô tả đối tượng trong lập trình duytrung.tcu@gmail.com
  15. 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 Danh từ - 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() Động từ - Phanh() - Dừng() duytrung.tcu@gmail.com
  16. Đị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
  17. Lớp và Đối tượng duytrung.tcu@gmail.com
  18. Cú pháp khai báo Lớp duytrung.tcu@gmail.com
  19. Ví dụ về khai báo lớp duytrung.tcu@gmail.com
  20. Ví dụ về tạo đối tượng Default Constructor • 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
  21. Đị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
  22. 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
  23. Tạo phương thức duytrung.tcu@gmail.com
  24. 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ự) 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){ } } duytrung.tcu@gmail.com
  25. Nạp chồng phương thức (overloading) duytrung.tcu@gmail.com
  26. 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
  27. 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
  28. 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 đó public class Employee{ public class Employee{ public class Employee{ String fullname; double salary; String fullname; double salary; String fullname; double salary; public Employee() public Employee() // không có hàm khởi tạo { { } this.fullName = null; } this.salary = 0.0; } } } duytrung.tcu@gmail.com
  29. 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
  30. Biến và phương thức của lớp I belong to the class Lion Lions have 4 legs I belong to a lion I have 4 legs duytrung.tcu@gmail.com
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. Đặ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
  37. Đặc tả truy xuất (Access modifier) class duytrung.tcu@gmail.com
  38. Đặc tả truy xuất (Access modifier) duytrung.tcu@gmail.com
  39. Quy ước định danh trong Java 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
  40. duytrung.tcu@gmail.com
  41. 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
  42. CÁC NGUYÊN LÝ CỦA OOP TRONG JAVA
  43. Ư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
  44. 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
  45. 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
  46. 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
  47. 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
  48. Encapsulation – che giấu dữ liệu duytrung.tcu@gmail.com
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. Sử dụng “super” Animals can move Dogs can walk and run duytrung.tcu@gmail.com
  55. 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
  56. Ghi đè phương thức – Overriding Animals can move Dogs can walk and run duytrung.tcu@gmail.com
  57. 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
  58. 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
  59. Lớp trừu tượng Hình Chữ nhật Tam giác Tròn Vuông Viên chức Nhân viên Trưởng phòng Giám đốc duytrung.tcu@gmail.com
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. Runtime polymorphism duytrung.tcu@gmail.com
  67. 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
  68. 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