Bài giảng Ngôn ngữ lập trình Java: Phần 1 cung cấp cho người học những kiến thức như: Tổng quan về lập trình hướng đối tượng và ngôn ngữ lập trình java; lớp và đối tượng trong java; tính kế thừa và đa hình trong java. Mời các bạn cùng tham khảo!
BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THƠNG TS VŨ HỮU TIẾN ThS ĐỖ THỊ LIÊN BÀI GIẢNG NGƠN NGỮ LẬP TRÌNH JAVA Mã học phần: INT13108 (03 tín chỉ) Hà Nội, 11/2019 MỤC LỤC MỤC LỤC .2 DANH SÁCH HÌNH VẼ CHƯƠNG TỔNG QUAN VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ NGƠN NGỮ LẬP TRÌNH JAVA 1.1 Các phương pháp tiếp cận lập trình ứng dụng 1.2 Các khái niệm lập trình hướng đối tượng 1.2.1 Lớp đối tượng 1.2.2 Phương thức thông điệp 1.2.3 Tính đóng gói 1.2.4 Kế thừa 1.2.5 Đa hình 1.3 Giới thiệu ngơn ngữ lập trình hướng đối tượng Java 1.3.1 Lịch sử Java 1.3.2 Đặc trưng ngôn ngữ Java 10 1.3.3 Các công nghệ Java 12 1.3.4 Áp dụng Java thực tế .12 1.3.5 Mơi trường lập trình Java 12 1.3.6 Cấu trúc chương trình Java .13 1.3.7 Chương trình Java : .14 1.4 Các kiểu liệu Java 16 1.5 Các phép toán Java 17 1.5.1 Biến 17 1.5.2 Phép toán số học .18 1.5.3 Phép toán bit 19 1.5.4 Phép toán mối quan hệ 19 1.5.5 Phép toán logic 20 1.5.6 Độ ưu tiên phép toán 21 1.6 Cấu trúc lệnh Java .21 1.6.1 Lệnh in liệu hình 21 1.6.2 Lệnh nhập liệu từ bàn phím 23 1.6.3 Các lệnh điều khiển Java 24 BÀI TẬP CHƯƠNG 28 CHƯƠNG LỚP VÀ ĐỐI TƯỢNG TRONG JAVA 29 2.1 Cơ lớp .29 2.1.1 Khai báo lớp 29 2.1.2 Mô tả lớp UML 30 2.1.2.1 Mơ tả thuộc tính có cú pháp sau: 31 2.1.2.2 Mơ tả hành vi (operation) có cú pháp sau: .32 2.1.3 Phương thức lớp 32 2.1.4 Truyền tham số cho phương thức .34 2.1.5 Phương thức khởi tạo (Constructor) 36 2.1.6 Khai báo khởi tạo đối tượng 36 2.1.7 Lớp lồng lớp nội .38 2.2 Phân loại biến Java 40 2.3 Một số thư viện Java .42 2.3.1 Lớp bao (Wrapper class) 42 2.3.2 ArrayList 43 2.3.3 Lớp xử lý chuỗi String 44 2.3.4 Lớp java.lang.Math 45 BÀI TẬP CHƯƠNG 46 CHƯƠNG TÍNH KẾ THỪA VÀ ĐA HÌNH TRONG JAVA 47 3.1 Mối quan hệ lớp .47 3.1.1 Mối quan hệ “Phụ thuộc” – Dependency 47 3.1.2 Mối quan hệ “Kết nối” – Association: 47 3.1.3 Mối quan hệ “Kết nối hai chiều” – Bidirectional Association 49 3.1.4 Mối quan hệ “Thành phần” – Aggregation .49 3.1.5 Mối quan hệ “Hợp thành” – Composition 50 3.1.6 Mối quan hệ “Kế thừa” – Inheritance .51 3.1.7 Kế thừa phương thức khởi tạo lớp cha .53 3.1.8 Thiết kế kế thừa 54 3.2 Tính đa hình Java 57 3.2.1 Tính đa hình 57 3.2.2 Cài đè phương thức (Override) 59 3.2.3 Cài chồng phương thức (Overload) 60 3.2.4 Lớp trừu tượng phương thức trừu tượng 61 3.2.5 Lớp giao diện (interface) 62 BÀI TẬP CHƯƠNG 65 CHƯƠNG XỬ LÝ NHẬP/XUẤT TRONG .67 4.1 File luồng liệu .67 4.2 Lớp File 68 4.3 Kiến trúc luồng xuất liệu file 69 4.3.1 Dữ liệu dạng byte 70 4.3.2 Dữ liệu dạng văn 71 4.4 Ghi/đọc chuỗi ký tự tệp văn 71 4.5 Đọc/ghi liệu luồng byte 73 4.5.1 Đọc/ghi liệu dạng .73 4.5.2 Đọc/ghi liệu đối tượng .74 BÀI TẬP CHƯƠNG 78 CHƯƠNG XỬ LÝ NGOẠI LỆ TRONG JAVA 79 5.1 Xử lý ngoại lệ .79 5.2 Khối try/catch .83 5.2.1 Hoạt động khối try/catch 83 5.2.2 Xử lý nhiều ngoại lệ 85 5.3 Ném ngoại lệ 86 5.4 Lan truyền lỗi ngoại lệ 86 5.5 Ngoại lệ kiểm tra không kiểm tra 87 5.6 Lỗi người dùng định nghĩa 88 BÀI TẬP CHƯƠNG 89 CHƯƠNG LẬP TRÌNH ĐA LUỒNG 90 6.1 Đa luồng (Multithreading) 90 6.2 Các cách tạo luồng .90 6.3 Vòng đời luồng .94 6.4 Tạm ngừng, chạy lại ngừng luồng 95 6.5 Mức độ ưu tiên lập lịch cho luồng 96 6.6 Đồng (Synchronization) 98 6.7 Tương tác luồng 100 BÀI TẬP CHƯƠNG 104 CHƯƠNG LẬP TRÌNH GIAO DIỆN TRONG JAVA 105 7.1 Lập trình giao diện với đối tượng .105 7.2 Container 106 7.2.1 Frame 107 7.2.2 Panel 107 7.2.3 Dialog 108 7.3 Component 109 7.3.1 Label .109 7.3.2 TextField 110 7.3.3 TextArea 111 7.3.4 Button 111 7.3.5 Checkbox RadioButton 113 7.3.6 Choice .113 7.4 Layout 115 7.4.1 FlowLayout Manager 115 7.4.2 BorderLayout Manager 115 7.4.3 GridLayout Manager .116 7.5 Xử lý kiện 118 7.5.1 Khái niệm xử lý kiện 118 7.5.2 Các bước lập trình xử lý kiện .120 7.5.3 Các lớp xử lý kiện 120 7.6 Applet 123 7.6.1 Khái niệm Applet 123 7.6.2 Cấu trúc Applet 123 7.7 Lập trình giao diện với Swing 127 7.7.1 Tạo thành phần giao diện với Java Swing 127 7.7.2 Một số ví dụ với Swing 128 BÀI TẬP CHƯƠNG 129 TÀI LIỆU THAM KHẢO 130 DANH SÁCH HÌNH VẼ Hình 1 Biên dịch chương trình theo cách truyền thống 11 Hình Biên dịch chương trình Java .11 Hình Cấu trúc chương trình Java 13 Hình Cách khai báo lớp 13 Hình Cách khai báo phương thức 14 Hình Các lệnh phương thức 14 Bảng Các từ khóa mô tả phạm vi truy nhập 33 Bảng 2 Các lớp bao liệu 42 Bảng So sánh Array ArrayList 44 Bảng Một số phương thức lớp file 68 Bảng Một số lớp ngoại lệ thường gặp 83 Bảng Luồng xử lý try/catch/finally 85 Bảng Một số phương thức Label 110 Bảng Một số phương thức TextField .111 Bảng Một số phương thức TextArea .111 Bảng Một số lớp xử lý kiện .121 CHƯƠNG TỔNG QUAN VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ NGƠN NGỮ LẬP TRÌNH JAVA 1.1 Các phương pháp tiếp cận lập trình ứng dụng Lập trình công đoạn quan trọng chủ chốt thiếu để tạo sản phẩm phần mềm Phần mềm trở nên đa dạng ngành công nghiệp phần mềm phát triển người ta thấy rõ tầm quan trọng phương pháp lập trình Phương pháp lập trình tốt khơng đảm bảo tạo phần mềm tốt mà cịn hỗ trợ thiết kế phần mềm có tính mở hỗ trợ khả sử dụng lại module Nhờ dễ dàng bảo trì, nâng cấp phần mềm giảm chi phí phát triển phần mềm Trong thập kỷ 1970, 1980, phương pháp phát triển phần mềm chủ yếu lập trình có cấu trúc (structured programming) Cách tiếp cận cấu trúc việc thiết kế chương trình dựa chiến lược chia để trị: Để giải tốn lớn, tìm cách chia thành toán nhỏ giải riêng bài; để giải bài, coi tốn tiếp tục chia thành toán nhỏ hơn; cuối cùng, ta đến tốn giải mà không cần phải chia tiếp Cách tiếp cận gọi lập trình từ xuống (top-down programming) Lập trình từ xuống phương pháp tốt áp dụng thành công cho phát triển nhiều phần mềm Tuy nhiên, với đa dạng va phức tạp phần mềm, phương pháp bộc lộ hạn chế Trước hết, đáp ứng việc tạo lệnh quy trình để giải tốn Dần dần, người ta nhận thiết kế cấu trúc liệu cho chương trình có tầm quan trọng không việc thiết kế hàm/thủ tục cấu trúc điều khiển Lập trình từ xuống khơng quan tâm đủ đến liệu mà chương trình cần xử lý Thứ hai, với lập trình từ xuống, khó tái sử dụng phần chương trình cho chương trình khác Bằng việc xuất phát từ toán cụ thể chia thành mảnh cho thuận tiện, cách tiệp cận có xu hướng tạo thiết kế đặc thù cho tốn Chúng ta khó có thả lấy đoạn mã lớn từ chương trình cũ lắp vào dự án mà sửa đổi Thứ ba, môi trường hoạt động thực tế ứng dụng thay đổi Dẫn đến việc yêu cầu phần mềm phải liên tục thay đổi theo để đáp ứng nhu cầu người dùng không muốn phần mềm bị đào thải Do đó, thiết kế linh hoạt mềm dẻo mà nhà phát triển phầm mềm mong muốn Phương pháp tiếp cận từ lên (bottom-up) hỗ trợ tốt cho tính linh hoạt mềm dẻo Trong thực tế, thiết kế lập trình từ xuống thường kết hợp với thiết kế lập trình từ lên Trong tiếp cận từ lên, từ vấn đề mà ta biết cách giải có sẵn thành phần tái sử dụng xây dựng dần theo hướng lên trên, hướng đến giải pháp cho toán tổng Các thành phần tái sử dụng nên có tính module hóa cao Mỗi module thành phần hệ thống lớn hơn, tương tác với phần cịn lại hệ thống theo cách đơn giản quy ước chặt chẽ Chi tiết xảy bên module không cần xem xét đến hệ thống nói chung Đây gọi che giấu thơng tin, nguyên lý quan trọng công nghệ phần mềm Các module hỗ trợ dạng che giấu thông tin bắt đầu trở nên phổ biến ngơn ngữ lập trình đầu thập kỷ 80 Từ đó, hình thức tiên tiến ý tưởng lan rộng ngành cơng nghệ phần mềm Cách tiếp cận gọi lập trình hướng đối tượng (object-oriented programming) 1.2 Các khái niệm lập trình hướng đối tượng 1.2.1 Lớp đối tượng Trong thực tế, vật có thuộc tính hay trạng thái ta nhóm chung vật vào nhóm hay cịn gọi lớp vật Ví dụ lớp động vật bốn chân gồm động vật bốn chân, lớp phương tiện giao thông gắn máy gồm phương tiện gắn máy, v.v Trong lớp đó, vật coi đối tượng cụ thể lớp Trong ứng dụng Java, đối tượng có đặc điểm tương tự xếp vào nhóm, lớp (class) Mỗi lớp mơ tả đặc điểm chung cho đối tượng lớp Cụ thể, định nghĩa lớp mơ tả tất thuộc tính đối tượng thành viên lớp phương thức thực thi hành vi đối tượng Các đối tượng tạo chương trình chạy lớp khn mẫu mà từ tạo đối tượng thuộc lớp Mỗi đối tượng tạo từ lớp gọi thực thể (instance) lớp 1.2.2 Phương thức thơng điệp Trong Java, hành vi đối tượng lớp gọi phương thức lớp Ví dụ, thấy đối tượng tơ có chức chuyển số lớp tơ tạo phương thức chuyển số cho lớp Các đối tượng dùng thông điệp (message) để liên lạc với Nhìn từ phương diện lập trình, việc gửi thơng điệp tới đối tượng gọi phương thức đối tượng đó, cịn việc đối tượng nhận thơng điệp việc phương thức đối tượng khác gọi Ví dụ người dùng click chuột vào nút bấm cửa sổ chương trình thông điệp gửi đến đối tượng điều khiển nút bấm để thơng báo nút bấm click 1.2.3 Tính đóng gói Dữ liệu đối tượng thay đổi đối tượng Đặc tính gọi tính bao đóng Chúng ta tạo lớp bao đóng hồn tồn Java việc tạo tất thành viên liệu lớp hoạt động phạm vi lớp Đối tượng giao tiếp với phần khác chương trình thơng qua phương thức cụ thể gọi giao diện (interface) 1.2.4 Kế thừa Là quan hệ mang tính phân cấp mà hành viên lớp kế thừa lớp dẫn xuất trực tiếp gián tiếp từ lớp Đây chế cho phép định nghĩa lớp dựa định nghĩa lớp có sẵn, cho tất thành viên lớp cha có mặt lớp đối tượng thuộc lớp sử dụng thay cho đối tượng lớp cha đâu 1.2.5 Đa hình Đa hình khả tồn nhiều hình thức khác Trong hướng đối tượng, đa hình kèm với quan hệ kế thừa có nghĩa tên hiểu theo cách khác tùy tình Ví dụ có lớp Hình Vng, Hình Trịn lớp lớp Hình Học Khi ta sử dụng đối tượng Hình Học, đối tượng hiểu Hình Vng Hình Trịn tùy theo ngữ cảnh cụ thể 1.3 Giới thiệu ngơn ngữ lập trình hướng đối tượng Java 1.3.1 Lịch sử Java Cho đến tận ngày nay, đóng góp quan trọng cách mạng vi xử lý việc cho đời hệ máy tính cá nhân Ngồi ra, vi xử lý cịn có tác động mạnh mẽ tới việc phát triển thiết bị điện tử dân dụng thông minh Nhận thức điều này, Sun microsystems vào năm 1991 phát triển dự án nghiên cứu nội công ty James Gosling dẫn đầu, kết ngôn ngữ lập trình hướng đối tượng dựa C ++ mà Sun gọi Java đời Mục tiêu Java viết chương trình chạy nhiều hệ thống máy tính thiết bị điện tử khác Điều gọi “viết lần, chạy đâu” Công nghệ Web phát triển bùng nổ vào năm đầu thập niên 90 Sun thấy tiềm việc sử dụng Java để thêm nội dung động tính tương tác hình ảnh động vào trang web Nhờ vào phát triển hướng này, Java thu hút ý cộng đồng doanh nghiệp, khách hàng thường xuyên phải sử dụng web Java sử dụng để phát triển ứng dụng doanh nghiệp quy mô lớn, để tăng cường chức máy chủ web, để cung cấp ứng dụng cho thiết bị tiêu dùng (ví dụ: điện thoại di động, điện thoại thông minh, thiết bị thu giải mã tín hiệu truyền hình (set-top box),…) cho nhiều mục đích khác Sun microsystems Oracle mua lại vào năm 2009 Tại hội nghị JavaOne 2010, Oracle thơng báo 97% máy tính để bàn doanh nghiệp, ba tỷ thiết bị cầm tay 80 triệu thiết bị truyền hình sử dụng Java Hiện có triệu nhà phát triển Java so với 4,5 triệu năm 2005 Java ngôn ngữ phát triển phần mềm sử dụng rộng rãi giới 1.3.2 Đặc trưng ngôn ngữ Java Đơn giản: Các nhà thiết kế ngôn ngữ Java cố gắng phát triển ngơn ngữ lập trình dễ dàng cho người học Họ muốn tạo ngôn ngữ thân thiện với hầu hết lập trình viên Do vậy, họ loại bỏ khái niệm phức tạp C C++ trỏ, struct, union,… Hướng đối tượng: Tất thứ đề cập đến Java liên quan đến đối tượng định nghĩa trước, chí hàm chương trình viết Java (đó hàm main) phải đặt bên lớp Dữ liệu (Data) phương thức (Method) xử lý liệu khái niệm nhắc nhiều đến Java Dữ liệu mô tả trạng thái đối tượng, phương thức mô tả hành vi đối tượng Độc lập với tảng (Platform independent): Độc lập với tảng coi khả chương trình chạy hệ điều khác (Windows, Unix, Linux,…) Java độc lập với tảng mức chương trình (source code level) mức nhị phân (byte code) Độc lập mức chương trình có nghĩa chương trình chuyển từ hệ điều hành sang hệ điều hành khác, biên dịch chạy ln hệ điều hành Độc lập mức nhị phân có nghĩa chạy file biên dịch nhiều hệ điều hành khác mà không cần phải biên dịch lại Đối với ngôn ngữ trước C C++, trình biên dịch làm nhiệm vụ chuyển lệnh chương trình thành lệnh vi xử lý máy tính hay cịn gọi mã máy Các mã máy thay đổi tùy theo vi xử lý Do vậy, chương trình muốn chạy tảng khác cần phải biên dịch lại chương trình cho phù hợp với tảng Hình 1.1 mơ tả việc biên dịch chương trình C++ để chạy tảng khác 10 System.out.println("Publication"); } } Book class: public class Book extends Publication{ Book(){ System.out.println("Book"); } } Ví dụ : Ví dụ : 52 3.1.7 Kế thừa phương thức khởi tạo lớp cha Mỗi lớp (cho dù lớp hay lớp cha) có riêng hàm khởi tạo để thiết lập trạng thái ban đầu đối tượng tạo Hàm khởi tạo lớp cha có trách nhiệm khởi tạo trạng thái chung Mỗi lớp có hàm khởi tạo riêng để tạo trạng thái cụ thể đối tượng Thông thường, hàm khởi tạo lớp gọi hàm khởi tạo lớp cha Việc thực cách sử dụng từ khóa super Nếu từ khóa super gọi, phải đứng dòng hàm khởi tạo lớp Thông thường, số biến lớp trùng với biến lớp cha Do đó, biến trùng truyền vào hàm super Ví dụ: public class Publication { String title; double price; int coppies; Publication(String pTitle, double pPrice, int pCoppies){ title = pTitle; price = pPrice; coppies = pCoppies; } } public class Book extends Publication{ String author; Book(String pTitle, String pAuthor, double pPrice, int pCoppies){ super(pTitle,pPrice,pCoppies); author = pAuthor; } } Nguyên tắc gọi hàm khởi tạo lớp cha: - Nếu lớp cha có hàm khởi tạo khơng có tham số hàm khởi tạo lớp cha mặc định gọi hàm khởi tạo lớp Nếu lớp cha có hàm khởi tạo có tham số hàm super bắt buộc phải gọi lớp Ví dụ: 53 Hình bên trái: Lớp khơng có hàm khởi tạo thay vào hàm khởi tạo lớp cha mặc định gọi lớp Tuy nhiên khuyến nghị nên có hàm khởi tạo lớp Hình giữa: Lớp cha có hàm khởi tạo Nếu hàm khởi tạo lớp khơng có từ khóa super hàm khởi tạo không tham số lớp cha mặc định gọi lớp Hình bên phải: Lớp cha có hàm khởi tạo có tham số Do từ khóa super bắt buộc phải sử dụng hàm khởi tạo lớp Từ khóa super dùng số tình sau : - Dùng phương thức khởi tạo lớp trường hợp hàm khởi tạo lớp cha có tham số Dùng để gọi biến lớp cha Ví dụ lớp cha lớp có biến count kiểu int Trong lớp muốn sử dụng biến lớp cha ta dùng từ khóa super sau : super.hunger 3.1.8 Thiết kế kế thừa Giả sử ta phải thiết kế chương trình mô động vật rừng Chúng ta cung cấp thông tin số loại vật ban đầu bao gồm sư tử, hà mã, hổ, chó, mèo, sói phải xếp chúng thành nhóm động vật có tính chất Sau đó, người lập trình khác thêm động vật khác vào chương trình tận dụng đoạn mã viết sẵn cho nhóm động vật thêm vào Việc thiết kế bao gồm bước sau : Bước : Xác định đối tượng có chung thuộc tính hành động Giả sử nhóm động vật cung cấp có thuộc tính chung bao gồm : - Picture : tên file ảnh (.jpeg) đại diện động vật Food : loại thức ăn động vặt ăn : meat (thịt) grass (cỏ) 54 - Hunger : biến kiểu int biểu diễn mức độ đói vật Boundaries : Giá trị biểu diễn khu vực vật di chuyển Location : Tọa độ vật di chuyển khu vực Các phương thức chung bao gồm : - Makenoise() : Hành vi vật phát tiếng kêu Eat() : Hành vi vật gặp cỏ thịt Sleep() : Hành vi vật ngủ Roam() : Hành vi vật di chuyển Bước : Thiết kế lớp chung để mơ tả thuộc tính phương thức chung Do vật động vật nên ta gọi lớp chung lớp Animal Lớp Animal có biến phương thức mơ tả bước Animal Picture Food Hunger Boundaries MakeNoise() Eat() Sleep() Roam() Lion Hippo Tiger Cat Bước : Xác định xem lớp có cần hành vi (phương thức) đặc thù lớp không Chúng ta thấy rằng, động vật có hành vi kêu, tiếng kêu sư tử phải khác với tiếng kêu chó Hoặc kiểu ăn sư tử phải khác với kiểu ăn hà mã Vì vậy, động vật phải cài đè (override) phương thức ăn phương thức kêu để mô tả đặc trưng riêng 55 Animal Picture Food Hunger Boundaries MakeNoise() Eat() Sleep() Roam() Lion MakeNoise() Eat() Sleep() Roam() Hippo MakeNoise() Eat() Sleep() Roam() Tiger Cat MakeNoise() Eat() Sleep() Roam() MakeNoise() Eat() Sleep() Roam() Bước : Tiếp tục dùng trừu tượng hóa để tìm nhóm động vật có hành vi giống để phân nhóm mịn Trong nhóm động vật trên, thấy Sói Chó nhóm vào nhóm, Sư tử, Hổ Mèo nhóm vào nhóm Trong nhóm thuộc họ Chó (canines), Chó Sói kiểu kêu kiểu di chuyển khác (chó Sói thường di chuyển theo bầy) Vì vậy, phương thức roam() chuyển lên lớp Canines Tương tự với lớp thuộc họ Mèo (Feline) Vì vậy, có kế thừa phát triển sau : Animal Picture Food Hunger Boundaries MakeNoise() Eat() Sleep() Roam() Feline Hippo MakeNoise() Eat() Sleep() Roam() MakeNoise() Lion Eat() Sleep() Roam() Hippo Eat() Sleep() Roam() Tiger Eat() Sleep() Roam() 56 3.2 Tính đa hình Java 3.2.1 Tính đa hình Giả sử ta khai báo khởi tạo đối tượng Cat sau : Cat myCat = new Cat() ; Như phần 2.1.6, việc khai báo khởi tạo đồng nghĩa với việc JVM tạo biến tham chiếu myCat có kiểu Cat tham chiếu đến đối tượng Cat Cat myCat Cat Đối tượng Cat Như vậy, ta thấy kiểu biến tham chiếu kiểu đối tượng Cat Tuy nhiên, Java cho phép khai báo kiểu biến tham chiếu khác với kiểu đối tượng Ví dụ, ta khai báo sau : Animal C = new Cat() ; Cat C Animal Đối tượng Cat Với đa hình, biến tham chiếu thuộc kiểu lớp cha lớp đối tượng khởi tạo Khi ta khai báo biến tham chiếu thuộc kiểu lớp cha, gắn với đối tượng thuộc lớp Như vậy, để dễ quản lý nhiều loại đối tượng lớp con, ta sử dụng tính đa hình để định nghĩa mảng lớp cha Mỗi phần tử mảng tham chiếu tới đối tượng lớp Ví dụ, ta khai báo mảng kiểu Animal Mỗi phần tử mảng tham chiếu đối tượng Dog, Cat, Wolf,… 57 Kết : Lưu ý : Trong việc gọi phương thức lớp tham chiếu lớp cha, biến tham chiếu gọi phương thức mà lớp cha có phương thức lớp cài đè Biến tham chiếu gọi phương thức lớp có mà lớp cha khơng có Ví dụ : Trong ví dụ trên, tham chiếu animals gọi phương thức eat() lớp Animal phương thức Nhưng lớp Animal có thêm phương thức makeSound() mà lớp khơng có tham chiếu gọi phương thức makeSound() lớp Animal Ngồi ra, tính khác đa hình Java tham số phương thức có kiểu lớp cha nhận giá trị truyền vào đối tượng lớp Như vậy, ta cần viết phương thức lần dùng cho lớp lớp cha Ví dụ : Ta cần tạo thêm lớp nhân viên quản lý vườn thú AnimalManager Trong lớp có phương thức cho thú ăn AnimalFeed Vì động vật có kiểu ăn khác nên ăn, phương thức eat() động vật gọi Vì vậy, phương thức AnimalFeed phải nhận giá trị truyền vào đối tượng động vật cụ thể Dog, Cat,… để sử dụng phương thức eat() đối tượng Để làm điều này, ta phải sử dụng tính đa hình Java tham số phương thức AnimalFeed có kiểu Animal 58 Kết : 3.2.2 Cài đè phương thức (Override) Khi cài đè phương thức lớp cha, lớp phải tuân thủ số quy tắc sau : - - Danh sách tham số phải trùng nhau, kiểu giá trị trả phải tương thích : Phương thức lớp cha có danh sách đối số danh sách đối số lớp phải Phương thức lớp cha khai báo trả kiểu phương thức lớp phải khai báo kiểu trả Phương thức cài đè không giảm quyền truy nhập so với phiên lớp cha Ví dụ, phương thức lớp cha public lớp khơng private Ngược lại phép 59 Car Public boolean Starting() Vios Vios private boolean Starting(int distance) Public boolean Starting(int distance) Khơng hợp lệ phương thức override không giảm quyền truy nhập Trường hợp khơng phải overload khơng sửa tham số - Khơng hợp lệ phương thức override sửa tham số Trường hợp overload Nếu kế thừa có lớp cha phía cịn lớp phía gọi phương thức, phiên thấp gọi Animal makeNoise() eat() sleep() roam() Wolf w = new Wolf(); w,makeNoise(); w.roam(); w.eat(); w.sleep(); Canine roam() Wolf makeNoise() eat() 3.2.3 Cài chồng phương thức (Overload) Cài chồng phương thức tình lớp có nhiều phương thức tên khác danh sách đối số Cài chồng phương thức có số đặc điểm sau : 60 - Kiểu trả khác với điều kiện danh sách đối số phải khác Có thể thay đổi mức truy nhập phương thức cài chồng cách tùy ý 3.2.4 Lớp trừu tượng phương thức trừu tượng Trong ví dụ nhóm động vật phần trước, ta hồn tồn khai báo khởi tạo đối tượng cho lớp với tên tuổi Ví dụ : Dog d = new Dog(‘‘Jack ’’, 3) ; Cat c = new Cat(‘‘Tom’’,4) ; Trong trường hợp ta muốn tạo đối tượng kiểu Animal hàm khởi tạo phải ? Rõ ràng, Animal động vật trừu tượng khơng có tên, tuổi, đặc điểm cụ thể để ta khởi tạo đối tượng cụ thể kiểu Animal Trong trường hợp này, ta gọi lớp Animal lớp trừu tượng Ví dụ khai báo lớp trừu tượng : Như vậy, việc sử dụng lớp trừu tượng có mục đích sau : - Khi ta muốn tạo lớp không muốn sử dụng để tạo đối tượng cụ thể Khi ta muốn sử dụng tính đa hình cho nhóm lớp ta cho lớp kế thừa lớp trừu tượng Khơng có lớp, ta cịn khai báo phương thức trừu tượng lớp trừu tượng Một lớp trừu tượng có nghĩa phải tạo lớp cho nó, cịn phương thức trừu tượng có nghĩa phải cài đè lớp Như vậy, ta muốn tất lớp lớp trừu tượng bắt buộc phải viết lại cụ thể phương thức lớp cha ta để phương thức phương thức trừu tượng Ví dụ, lớp lớp Animal có phương thức “kêu” Tuy nhiên, phương thức “kêu” lớp Dog, Cat, Lion,… khác Do ta để phương thức “kêu” lớp Animal phương thức trừu tượng 61 Java quy định phương thức trừu tượng thân phương thức Dịng khai báo phương thức kết thúc dấu chấm phảy khơng có cặp ngoặc {} Ví dụ khai báo phương thức trừu tượng : public abstract void eat() ; Trong lớp trừu tượng có phương thức cụ thể phương thức trừu tượng 3.2.5 Lớp giao diện (interface) Lớp giao diện tập phương thức public đưa để người dùng tương tác với đối tượng Lớp giao diện bao gồm số phương thức trừu tượng Phương thức trừu tượng phương thức có khai báo mà khơng có triển khai Lớp giao diện dùng thiết kế lớp có phương thức chung Các lớp triển khai lớp giao diện bắt buộc phải tuân thủ phương thức chung Ví dụ: Lớp giao diện Độngvật có phương thức kêu() có nghĩa tất lớp động vật phải kêu kêu với cách implement khác Lớp người nói, lớp chó sủa, lớp hổ gầm,… Khai báo lớp giao diện : interface MyInterface { public void method1(); public void method2(); } Lớp triển khai : class Demo implements MyInterface { public void method1() { System.out.println("implementation of method1"); } public void method2() { System.out.println("implementation of method2"); } public static void main(String arg[]) { MyInterface obj = new Demo(); obj.method1(); } } 62 Complexity + getComplexity() : int + setComplexity(int) : void MiniQuiz Question + main(args: String[]): void + getQuestion(): String + getAnswer(): String Hình 10 Ví dụ mơ tả lớp giao diện UML Lớp giao diện có số đặc điểm sau : - Lớp giao diện cho lớp giao diện khác kế thừa Lớp giao diện chứa phương thức trừu tượng mà khơng có phương thức cụ thể Các phương thức trừu tượng lớp giao diện public Lớp giao diện chứa biến loại public static final Vấn đề đa kế thừa : Ta có lớp b lớp c kế thừa từ lớp a Java không cho phép lớp kế thừa từ hai lớp đồng thời Cụ thể, lớp d kế thừa đồng thời lớp b lớp c Lý d muốn sử dụng liệu hay phương thức lớp a Java khơng biết liệu kế thừa theo hướng từ b xuống đến d hay từ c xuống đến d Để tránh tình trạng kế thừa đồng thời nhiều lớp, đồng thời đảm bảo việc sử dụng hiệu tính kế thừa, Java cung cấp khái niệm lớp giao diện (Interface) Cụ thể, trường hợp này, hai lớp b c phải lớp giao diện Giả sử lớp c lớp giao diện lớp d kế thừa từ a b, đồng thời có phương thức lớp c cách cài đè phương thức lớp c Ví dụ sử dụng đa hình thơng qua lớp giao diện : Trong ví dụ mơ động vật trên, ta biết vai trị đa hình thơng qua việc truyền tham số Animal cho phương thức AnimalFeed() Giả sử, tốn phát sinh thêm tình có động vật 63 Dog Cat có thêm phương thức playing() Khi ta nhóm lớp vào nhóm cách tạo thêm lớp giao diện Pet cho lớp kế thừa lớp Pet Khai báo lớp giao diện Pet : Định nghĩa lớp feedingAnimal : Tại phương thức main lớp AnimalManager : 64 BÀI TẬP CHƯƠNG Bài : Viết chương trình quản lý lương nhân viên cơng ty theo biểu đồ lớp sau : Bài 2: Viết chương trình tính diện tích chu vi hình chữ nhật Lớp Shape lớp trừu tượng 65 66 ... TextField 11 0 7.3.3 TextArea 11 1 7.3.4 Button 11 1 7.3.5 Checkbox RadioButton 11 3 7.3.6 Choice .11 3 7.4 Layout 11 5 7.4 .1 FlowLayout... 1. 3.2 Đặc trưng ngôn ngữ Java 10 1. 3.3 Các công nghệ Java 12 1. 3.4 Áp dụng Java thực tế .12 1. 3.5 Mơi trường lập trình Java 12 1. 3.6 Cấu trúc chương trình. .. .13 1. 3.7 Chương trình Java : .14 1. 4 Các kiểu liệu Java 16 1. 5 Các phép toán Java 17 1. 5 .1 Biến 17 1. 5.2 Phép toán số học .18 1. 5.3 Phép