Tất cả các ngôn ngữ lập trình hướng đối tượng đều có các cơ chế cho phép bạn triển khai các mô hình hướng đối tượng. Đó là tính đóng gói, kế thừa, và tính đa hình.
a. Tính đóng gói (Encapsulation)
Đây là cơ chế dùng một vỏ bọc kết hợp phần dữ liệu và các thao tác trên dữ liệu đó (phần mã lệnh) thành một thể thống nhất, tạo nên sự an toàn, tránh việc sử dụng không đúng thiết kế, bảo vệ cho mã lệnh và dữ liệu chống việc truy xuất từ những đoạn mã lệnh bên ngoài
Lớp (Class)
Trong Java tính đóng gói thể hiện qua khái niệm lớp (Class). Lớp là hạt nhân của Java, tạo nền tảng cho lập trình hướng đối tượng trong Java.
Lớp định nghĩa hai phần chính là dữ liệu (các thuộc tính) và hành vi (các phương thức), gọi là các thành viên của lớp, dùng chung cho các đối tượng cùng loại. Từ sự phân tích hệ thống, người ta trừu tượng nên các lớp. Sau đó các đối tượng được tạo ra theo khuôn mẫu của lớp. Mỗi đối tượng thuộc một lớp có dữ liệu và hành vi định nghĩa cho lớp đó, giống như là sinh ra từ một khuôn đúc của lớp đó. Vì vậy mà lớp là khuôn mẫu của đối tượng, đối tượng là thể hiện của một lớp. Lớp là cấu trúc logic, còn đối tượng là cấu trúc vật lý. Phương thức định nghĩa cho việc sử dụng dữ liệu như thế nào. Điều này có nghĩa là hoạt động của lớp được định nghĩa thông qua phương thức.
Giả sử bạn phải tạo ra giao diện với người dùng và cần có những nút nhấn (Button). Vậy thì trước hết bạn xây dựng lớp Button với các thuộc tính như nhãn ghi trên nút, chiều rộng, chiều cao, màu của nút, đồng thời quy định hành vi của nút nhấn, nghĩa là nút nhấn cần phản ứng như thế nào khi được chọn, phát yêu cầu gì, có đổi màu hay nhấp nháy chi không. Với lớp Button như vậy, bạn có thể tạo ra nhanh chóng những nút nhấn cụ thể cho các mục đích khác nhau
Xét hệ thống bán xe hơi, các hành động và các thuộc tính sau là chung cho mọi hóa đơn cho khách hàng mua xe. Vì thế, chúng có thể được nhóm lại thành một lớp
Lớp
Hóa đơn |
Các
thuộc tính |
Tên
của khách hàng
Địa
chỉ của khách hàng
Kiểu
xe bán
Tên
nhân viên bán xe
Giá
tiền |
Các
hành động |
Nhập
tên khách hàng
Nhập
địa chỉ khách hàng
Nhập
kiểu xe
Nhập
tên nhân viên bán xe
Nhập
giá tiền
Xuất
hóa đơn |
Những thuộc tính và những hành động chung của các đối tượng hóa đơn được nhóm lại để tạo nên một đơn vị duy nhất gọi là một lớp Hóa đơn
Gói (Package)
Gói là kỹ thuật của Java, dùng để phân hoạch không gian tên lớp, giao diện thành những vùng dễ quản lý hơn, thể hiện tính đóng gói của Java.
Đối tượng (Object)
Một lớp là một nguyên mẫu phác họa những thuộc tính và những hành động có thể của một thực thể. Để có thể sử dụng thực thể mà lớp định nghĩa, chúng ta phải tạo một đối tượng từ lớp đó.
Lớp là một khái niệm, khuôn mẫu, còn đối tượng là một thể hiện, một trường hợp cụ thể của lớp.
Khi một người mua một xe hơi ở một cửa hàng, cửa hàng ấy có một khách hàng mới. Vào thời điểm ấy, một đối tượng giống như lớp Hóa đơn được tạo ra. Đối tượng này sẽ phải có những giá trị thực đối với các thuộc tính. Chẳng hạn như một khách hàng có tên là ‘Xuân’, sống ở ‘Đà nẵng’ đã mua một xe kiểu ‘Honda Civic’ từ nhân viên bán hàng tên là ‘Đông’ với giá tiền là 50 triệu
Kể từ lúc một đối tượng hiện hữu, những thuộc tính của nó là những giá trị xác định, và những hành động được định nghĩa cho đối tượng này được thực thi.
Mỗi đối tượng có những đặc tính riêng mô tả đối tượng ấy là gì, hoặc hành động ra sao.
Thuộc tính (Attribute)
Mỗi thuộc tính là một đặc tính mô tả đối tượng. Như thế, các thuộc tính nắm giữ các giá trị dữ liệu trong một đối tượng, chúng định nghĩa một đối tượng cụ thể.
Bởi vì một lớp là một khuôn mẫu cho nên các thuộc tính trong một lớp không thể nắm giữ các giá trị. Một thuộc tính có thể được gán một giá trị chỉ sau khi một đối tượng dựa trên lớp ấy được tạo ra.
Để có thể lưu giữ những chi tiết của một hóa đơn, một thể hiện (đối tượng) của lớp ‘Hóa đơn’ phải được tạo ra. .
Phương thức (Method)
Phương thức là sự xác định về cách thức thực thi một hoạt động được yêu cầu.
Các phương thức xác định cách thức thao tác trên các dữ liệu của một đối tượng. Bởi vì phương thức là sự thực thi thực tế một hoạt động, cho nên nó có thể được áp dụng cho một đối tượng. Một phương thức là một thuật toán xác định điều gì được thực hiện khi hoạt động ấy được yêu cầu.
Thông điệp (Message)
Để yêu cầu một hoạt động cụ thể nào đó được thực hiện, một thông điệp được gởi tới đối tượng nơi hoạt động này được định nghĩa.
Một thông điệp là một lời yêu cầu một hoạt động.
Khi một đối tượng nhận được một thông điệp, nó thực hiện một phương thức tương ứng.
Sự kiện (Event)
Một sự kiện là một sự việc xảy ra cho một đối tượng tại một thời điểm. Để đáp ứng lại sự kiện ấy, đối tượng sẽ thực hiện một hoặc nhiều phương thức.
Nói cách khác, một sự kiện do đối tượng này gây ra cho một đối tượng khác. Chẳng hạn như click chuột trái trên một nút.
Ví dụ: Một quả bóng sẽ bị xì hơi, khi xảy ra sự kiện làm thủng quả bóng
Hay sự kiện người sử dụng nhấn một nút trên bàn phím. Sự phản hồi đối với sự kiện này là việc hiển thị ký tự tương ứng trên màn hình.
b. Tính kế thừa (Inheritance)
Có các đối tượng tương tự nhau với một số thuộc tính và phương thức và cả mối quan hệ. Nếu mức độ tượng tự nhau lớn, thật là hữu ích khi dùng chung những đặc tính này. Thừa kế cho phép định nghĩa một lớp như là một lớp chung gọi là lớp cha (Super Class), các lớp thừa kế đặc tính chung từ lớp cha gọi là lớp con (Sub Class). Quá trình hình thành lớp cha gọi là khái quát hoá (Generalization) và lớp con là chuyên biệt hoá (Specialization). Lớp con thừa kế tất cả các thuộc tính, phương thức toàn cục (public), hay bảo vệ (protected), và mối quan hệ ở lớp cha, và bổ sung các thuộc tính, phương thức, mối quan hệ của riêng mình. Tuy nhiên một lớp con có thể định nghĩa lại các phương thức thừa kế.
Vậy tính kế thừa là khả năng xây dựng các lớp mới từ các lớp đã có. Khi lớp đóng gói một số dữ liệu và phương thức, lớp mới sẽ kế thừa cấu trúc dữ liệu và các phương thức của lớp mà nó kế thừa. Ngoài ra nó có thể bổ sung các dữ liệu và các phương thức của riêng mình.
Nhờ tính kế thừa mà hệ thống hướng đối tượng có thể thực hiện tái sử dụng mã. Nó rất quan trọng vì nó ứng dụng cho khái niệm cây phân cấp (mô hình Top-Down). Không sử dụng cây phân lớp, mỗi lớp phải định nghĩa tất cả các dữ liệu và phương thức của mình một cách rõ ràng. Nếu sử dụng sự kế thừa, mỗi lớp chỉ cần định nghĩa thêm những đặc trưng của mình.
Ví dụ: Lớp QuanLy và NVBanHang là lớp cụ thể, có các thuộc tính, thao tác giống nhau như lớp NhanVien, ví dụ các thuộc tính maNV, hoTen, diaChi, ngaySinh…, có các thao tác như them(), xoa(), sua(), hienThi()…, nhưng mỗi lớp có thêm những thuộc tính, thao tác và cả mối quan hệ bổ sung.
Ví dụ: Xe có thể xem như một lớp và các xe Pergout, BWM, Dream là các đối tượng của lớp xe. Các xe đều có thể lái đi, dừng lại... Từ lớp xe ở trên, ta có thể xây dựng các lớp xe đạp, xe máy, xe ôtô. Xe ôtô có thêm động cơ và có thể tự khởi động…
Có các hình thức kế thừa:
- Kế thừa đơn (Single Inheritance): là lớp con không thể thừa kế nhiều hơn một lớp cha
Ví dụ: Quan hệ tổng quát hóa giữa lớp NhanVien, QuanLy và NVBanHang
- Kế thừa bội (Multiple Inheritance): là lớp con có thể thừa kế nhiều hơn một lớp cha. Ví dụ lớp con QLBANHANG thừa kế các đặc tính từ cả hai lớp cha QUANLY và NVBANHANG. Cơ chế thừa kế bội là vấn đề khó khi phải cung cấp một phương pháp xử lý đối lập phát sinh khi các lớp cha chứa thuộc tính hay phương thức giống nhau. Không phải tất cả các ngôn ngữ hướng đối tượng và cơ sở dữ liệu nào cũng hỗ trợ thừa kế bội. Java là ngôn ngữ không hỗ trợ tính đa thừa kế
c. Tính đa hình(Polymorphism)
Trong lập trình hướng cấu trúc, một phương thức chỉ áp dụng cho một đối tượng. Chẳng hạn xét toán tử Cộng. Toán tử này chỉ tính tổng của hai số nguyên. Khi truyền hai giá trị 2 và 3 thì nó hiển thị 5. Chúng ta không thể sử dụng toán tử Cộng để tính tổng của hai chuỗi ‘Hello!’ và ‘How are you?’ để có được chuỗi kết quả ‘Hello! How are you?’
Trong hệ thống hướng đối tượng thì tình huống mô tả trên là có thể.
Tính đa hình cho phép một phương thức có các cách thể hiện khác nhau trên nhiều loại đối tượng khác nhau. Với tính đa hình, nếu cùng một phương thức ứng dụng cho các đối tượng thuộc các lớp khác nhau thì nó đưa đến những kết quả khác nhau. Tính đa hình là một trong những đặc tính quan trọng nhất của hệ thống hướng đối tượng.
Một ví dụ khác là phương thức Vẽ được chia sẻ giữa các lớp con của lớp Hình Vẽ. Tuy nhiên, phương thức Vẽ được ứng dụng cho hình hộp sẽ khác với hình elip. Xét trên mức độ người sử dụng, họ chỉ cần một phương thức Vẽ của lớp Hình Vẽ. Còn cách thức mà phương thức Vẽ được thực thi cho các trường hợp khác nhau thì họ không cần biết.
Với ngôn ngữ lập trình Java, tính đa hình thể hiện:
Ø Khi một lớp được kế thừa từ các lớp tổ tiên thì nó có thể thay đổi cách thức làm việc của lớp tổ tiên trong một số phương thức nào đó (nhưng tên, kiểu trả về, danh sách tham đối của phương thức thì vẫn giữ nguyên). Điều này gọi là viết chồng hàm (overriding method). Như vậy với một tên phương thức, chương trình có thể có các hành động khác nhau tùy thuộc vào lớp của đối tượng gọi phương thức. Đó là tính đa hình
Ví dụ: với phương thức chạy, xe ôtô, xe máy có thể tăng ga, còn xe đạp thì phải đạp…
Ø Tính đa hình còn thể hiện ở việc cho phép tên của một phương thức được dùng lại trong định nghĩa lớp, có nghĩa là một thông điệp có thể thực hiện nhiều phương thức khác nhau tuỳ vào đối tượng nhận thông điệp đó, hay nói cách khác là vào tham đối truyền cho phương thức. Điều này gọi là nạp chồng hàm (overloading method).
Ø Tính đa hình còn thể hiện ở việc một giao diện (giao tiếp - interface) có thể sử dụng cho các hoạt động của một lớp tổng quát, hay còn gọi là “một giao diện, nhiều phương thức”. Có nghĩa là có thể thiết kế một giao diện tổng quát cho một nhóm các hành vi liên quan. Điều này giảm thiểu sự phức tạp bằng cách cho phép một giao diện có thể sử dụng cho các hoạt động của một lớp tổng quát. Trình biên dịch sẽ xác định hoạt động cụ thể nào sẽ được thi hành tuỳ theo điều kiện. Bạn chỉ cần nhớ các giao diện của lớp tổng quát và sử dụng nó. Vậy tính đa hình cho phép các đối tượng khác nhau đáp ứng cùng một thông điệp theo các cách khác nhau.
Sự kết hợp đúng đắn giữa đa hình, đóng gói và kế thừa tạo nên môi trường lập trình có khả năng phát triển tốt hơn rất nhiều so với môi trường không hỗ trợ hướng đối tượng. Một cây phân cấp lớp thiết kế tốt là điều căn bản cho việc sử dụng lại những đoạn mã lệnh mà bạn đã tốn công sức nhiều cho việc phát triển và kiểm tra. Tính đóng gói cho phép bạn sử dụng các đối tượng và ra lệnh thi hành tới chúng mà không phá vỡ cấu trúc các đoạn mã lệnh đã bảo vệ bởi giao diện của các lớp. Sự đa hình cho phép bạn tạo ra những đoạn mã lệnh gọn gàng, dễ đọc, dễ hiểu và có tính ổn định.
Java là ngôn ngữ lập trình hướng đối tượng nên có đầy đủ các tính năng trên, thư viện lớp Java được cung cấp khá đầy đủ cho người lập trình để bắt đầu một dự án mới