1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài giảng: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

261 2 0

Đ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

Bài giảng: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỂN THƠNG CƠ SỞ TẠI TP HỒ CHÍ MINH Bài giảng: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Tài liệu dùng cho hệ Đại học ngành Công Nghệ Thông Tin Đã Hội đồng khoa học khoa Thông qua ngày 18/09/2010 Biên soạn :Ths Bùi Công Giao LƯU HÀNH NỘI BỘ Tp Hồ Chí Minh – Năm 2010 Lời nói đầu Lập trình kỹ cần thiết cho sinh viên ngành Công nghệ thơng tin Sau học qua lập trình với ngôn ngữ C, sinh viên tiếp cận với phương pháp lập trình theo tư mới, gần với giới thực hơn, phù hợp với dự án phần mềm lớn, lập trình hướng đối tượng Nội dung môn học bao gồm khái niệm, mơ hình đối tượng phương pháp lập trình hướng đối tượng ngơn ngữ lập trình Java Các đặc trưng quan trọng lập trình hướng đối tượng đóng gói, kế thừa, đa hình…và quan hệ lớp; xử lý vào/ra, xử lý ngoại lệ, lập trình luồng xử lý giao tiếp thể Java Bài giảng biên soạn chủ yếu dựa vào hai sách : Beginning Java Objects: From Concepts to Code, Second Edition, Apress, 2005 Jacquie Barker Bài giảng Lập trình Hướng đối tượng, Học viện Cơng nghệ Bưu Viễn thơng Trần Đình Quế Nguyễn Mạnh Hùng, Người soạn chân thành cảm ơn tác giả Mục lục Chương Tổng quan lập trình hướng đối tượng 1.1 Phương pháp tiếp cận lập trình truyền thống 1.1.1 Lập trình tuyến tính 1.1.2 Lập trình cấu trúc 1.2 Phương pháp tiếp cận lập trình hướng đối tượng 1.3 Các đặc trưng lập trình hướng đối tượng 1.3.1 Tính đóng gói liệu 1.3.2 Tính kế thừa 1.3.3 Tính đa hình 1.4 Trừu tượng hóa 1.4.1 Tổ chức trừu tượng theo phân cấp lớp 1.4.2 Trừu tượng hóa – sở phát triển phần mềm 1.5 Xu hướng phát triển lập trình hướng đối tượng 1.5.1 Lập trình hướng thành phần (Component-oriented programmingCOP) 1.5.2 Lập trình hướng tác nhân 1.5.3 Lập trình hướng khía cạnh Chương Cơ ngơn ngữ lập trình Java 2.1 Đặc trưng ngôn ngữ Java 2.2 Kiến trúc chương trình chế thực thi Java 14 2.3 Các kiểu liệu biến 18 2.3.1 Kiểu liệu 18 2.3.2 Biến 19 2.3.2.1 Khai báo biến 19 2.3.2.2 Phạm vi hoạt động biến 20 2.3.2.3 Khởi tạo biến 20 2.3.2.4 Ép kiểu 20 2.4 Các toán tử biểu thức 21 2.4.1 Các toán tử 21 2.4.2 Biểu thức 25 2.5 Các cấu trúc lệnh 26 2.5.1 Lệnh if-else 26 2.5.2 Lệnh switch-case 27 2.5.3 Vòng lặp while 28 2.5.4 Vòng lặp do-while 29 2.5.5 Vòng lặp for 29 2.6 Phong cách lập trình 31 2.7 Case Study 33 Chương Đối tượng lớp 38 3.1 Phân rã phần mềm theo cách tiếp cận hướng đối tượng 38 3.2 Khái niệm đối tượng 39 3.3 Khái niệm lớp 42 3.4 Khái niệm đóng gói 43 3.5 Biến tham chiếu 44 3.6 Khởi tạo đối tượng 45 Chương Tương tác đối tượng 50 4.1 Cộng tác đối tượng 50 4.2 Thuộc tính 51 4.3 Phương thức 52 4.3.1 Khai báo phương thức 52 4.3.2 Biến this 53 4.3.3 Gọi phương thức 53 4.3.4 Nạp chồng phương thức 54 4.3.5 Phương thức xây dựng 54 4.3.6 Che dấu thông tin 56 4.4 Truyền thông điệp đối tượng 57 Chương Quan hệ đối tượng 61 5.1 Kết hợp liên kết 61 5.2 Kế thừa 63 5.3 Đa hình 64 5.4 Lớp trừu tượng 70 5.5 Giao tiếp 73 5.6 Tính chất tĩnh 75 5.7 Kiểu liệt kê 78 5.8 Case Study 82 Chương Tập đối tượng 94 6.1 Khái niệm tập đối tượng 94 6.2 Ba kiểu tập đối tượng 94 6.3 Mảng 96 6.4 Các loại tập đối tượng thường gặp 99 6.4.1 LinkedList 99 6.4.2 HashMap 101 6.4.3 TreeMap 103 6.4.4 HashSet 105 6.4.5 TreeSet 106 6.5 Tạo kiểu tập hợp 107 6.6 Phương thức trả kiểu tập hợp 109 Chương Xử lý ngoại lệ 112 7.1 Giới thiệu ngoại lệ 112 7.2 Cơ chế xử lý ngoại lệ 114 7.2.1 Khối try 114 7.2.2 Khối catch 114 7.2.3 Khối finally 118 7.3 Bắt ngoại lệ 120 7.4 Phân cấp lớp ngoại lệ 125 7.5 Các điểm cần lưu ý thêm ngoại lệ 128 7.5.1 Bắt ngoại lệ tổng quát 128 7.5.2 Trình biên dịch Java yêu cầu phải có xử lý ngoại lệ 128 7.5.3 Tận dụng xử lý ngoại lệ để làm rõ lỗi phát sinh 130 7.5.4 try/catch lồng 130 7.5.5 Kiểu ngoại lệ người dùng định nghĩa 131 7.5.6 Ném nhiều kiểu ngoại lệ 133 7.6 Case Study 133 Chương Xử lý vào/ra 137 8.1 Luồng vào/ra 137 8.1.1 Giới thiệu luồng vào/ra 137 8.1.2 Luồng byte 138 8.1.3 Luồng ký tự 140 8.1.4 Luồng đệm 141 8.2 Scanning Formatting 143 8.2.1 Scanning 143 8.2.2 Formatting 146 8.3 Vào từ chế độ dòng lệnh 148 8.3.1 Vào qua luồng chuẩn 148 8.3.2 Vào qua Console 154 8.4 Làm việc với CSDL 157 8.4.1 JDBC 157 8.4.1.1 Giới thiệu JDBC 157 8.4.1.2 Kiến trúc JDBC 157 8.4.2 MySQL Java 158 8.4.2.1 Cài đặt Connector/J - JDBC Driver MySQL 158 8.4.2.2 Kiểm tra Connector/J 159 8.4.2.3 Thực câu truy vấn .160 Chương Lập trình giao diện 166 9.1 Giao diện với đối tượng 166 9.1.1 Các đối tượng container 166 9.1.1.1 Frame 166 9.1.1.2 Panel 167 9.1.1.3 Dialog 168 9.1.2 Các đối tượng component 169 9.1.2.1 Label .169 9.1.2.2 TextField TextArea 170 9.1.2.3 Button 172 9.1.3 Xử lý kiện 173 9.2 Giao diện với đối tượng Multimedia 180 9.2.1 Ô đánh dấu nút chọn 180 9.2.2 Lựa chọn 182 9.2.3 Danh sách 184 9.3 Các kỹ thuật trình bày 186 9.3.1 Trình bày Flow Layout 186 9.3.2 Trình bày Grid Layout 187 9.3.3 Trình bày Border Layout 189 9.3.4 Trình bày GridBag Layout 190 9.3.5 Trình bày Null Layout 192 9.4 Applet 193 9.4.1 Cấu trúc Applet 194 9.4.2 Sử dụng Applet 195 9.4.3 Truyền tham số cho Applet 199 9.5 SWING 200 9.5.1 Mở rộng đối tượng component 201 9.5.2 Mở rộng đối tượng container 202 9.6 Case Study 210 Chương 10 Luồng xử lý 219 10.1 Giới thiệu luồng 219 10.2 Tạo quản lý luồng 220 10.2.1 Tạo luồng 220 10.2.2 Phương thức lớp luồng 223 10.2.3 Quyền ưu tiên luồng 224 10.2.4 Luồng ngầm 226 10.2.5 Đa luồng với JApplet 227 10.3 Nhóm luồng 229 10.3.1 Giới thiệu nhóm luồng 229 10.3.2 Sự đồng luồng 233 10.3.3 Mã đồng 233 10.3.4 Sử dụng khối đồng 235 10.3.5 Kỹ thuật đợi – thông báo 237 10.3.6 Sự bế tắt 241 10.4 Thu rác 242 Tham khảo 248 Danh sách hình Hình 1.1 Sơ đồ phân cấp trừu tượng đối tượng tự nhiên Hình 2.1 Cách biên dịch truyền thống 10 Hình 2.2 Dịch chương trình Java 11 Hình 2.3 Máy ảo Java thực mã bytecode độc lập môi trường hoạt động 12 Hình 2.4 Cùng mã bytecode hiểu hai máy ảo 13 Hình 2.5 Phân tích chương trình Java đơn giản 14 Hình 3.1 Phân rã ứng dụng từ xuống 38 Hình 3.2 Gắn ứng dụng từ lên 39 Hình 3.3 Sử dụng biến tham chiếu để tới đối tượng nhớ 45 Hình 3.4 Hai biến tham chiếu tới đối tượng 46 Hình 3.5 Chuyển y tham chiếu tới Student thứ hai 46 Hình 3.6 Chuyển x tham chiếu tới Student thứ hai 47 Hình 3.7 Đối tượng Student mồ côi 47 Hình 4.1 Các đối tượng hệ thống phải cộng tác với để hoàn tất sứ mệnh SRS 51 Hình 4.2 Thơng điệp truyền qua lại đối tượng Course Student 58 Hình 4.3 Người yêu cầu thấy chi tiết bên việc trao đổi thơng điệp 58 Hình 5.1 Kết hợp ba 62 Hình 5.2 Một thể tương đương ba kết hợp hai 62 Hình 6.1 Hầu hết tập hợp tự động co lại phần tử bị lấy 95 Hình 6.2 Dùng khoá để truy cập trực tiếp đối tượng tập hợp từ điển 95 Hình 6.3 Các tập hợp cho phép nhiều tham chiếu tới đối tượng 96 Hình 7.1 Khi máy ảo Java ném ngoại lệ, phát pháo để thông báo cho ứng dụng vấn đề phát sinh 113 Hình 7.2 Nếu khơng có ngoại lệ ném khối try, tất khối catch bỏ qua 116 Hình 7.3 Nếu ngoại lệ phát sinh, khồi catch chặn bắt, có, thực thi, phần cịn lại bỏ qua 117 Hình 7.4 Máy ảo Java theo dõi việc thứ tự phương thức gọi cách tạo chồng gọi (call stack) 122 Hình 7.5 Khi phương thức chấm dứt, bị lấy khỏi chồng 122 Hình 7.6 Khối lệnh try/catch trong phương thức methodY nhận biết ngoại lệ mức hành chồng gọi 122 Hình 7.7 Ngoại lệ khỏi p.methodY() chuyển xuống s.methodX() xử lý 123 Hình 7.8 NullPointerException thơng qua chồng gọi chuyển tới phương thức main 124 Hình 7.9 Nếu ứng dụng bỏ qua xử lý ngoại lệ, máy ảo Java chấm dứt ứng dụng báo cáo ngoại lệ tới cửa cửa sổ dòng lệnh cho người sử dụng để quan sát 125 Hình 7.10 Lớp java.lang.Exception có nhiều lớp 126 Hình 7.11 Cây thừa kế kiểu ngoại lệ java.sql.DataTruncation 126 Hình 7.12 Kết demo NumberOfDigits.java 134 Hình 8.1 Đọc liệu vào chương trình 137 Hình 8.2 Viết liệu từ chương trình 138 Hình 8.3 Luồng byte vào đơn giản 139 Hình 8.4 Các thành phần đặc tả qui cách 148 Hình 9.1 Kết demo Frame 167 Hình 9.2 Kết demo Panel 168 Hình 9.3 Kết demo Dialog 169 Hình 9.4 Kết demo Label 170 Hình 9.5 Kết demo Text 172 Hình 9.6 Kết demo Button 173 Hình 9.7 Kết demo kiện 179 Hình 9.8 Kết demo Radio Button 182 Hình 9.9 Kết demo Choice Button 184 Hình 9.10 Kết demo Listbox 186 Hình 9.11 Kết demo Flow layout 187 Hình 9.12 Kết demo Grid layout 188 Hình 9.13 Kết demo Border layout 190 Hình 9.14 Kết demo Gridbag layout 192 Hình 9.15 Kết demo Null layout 193 Hình 9.16 Kết demo Applet 195 Hình 9.17 Kết demo Applet bảng tính 198 Hình 9.18 Kết demo Applet có tham số 200 Hình 9.19 Kết demo JButton 202 Hình 9.20 Kết demo gắn đối tượng vào tầng 205 Hình 9.21 Kết demo JMenu 210 Chương 10: Luồng xử lý synchronized void display(int num) { System.out.print("< "+num); try { Thread.sleep(1000); } catch(InterruptedException e) { System.out.println("Interrupted"); } System.out.println(“ “+ num+ ">"); } } class Source implements Runnable { int number; Target target; Thread t; public Source(Target targ,int n) { target = targ; number = n; t = new Thread(this); t.start(); } public void run(){ target.display(number); } } public class Sync { public static void main(String[] args){ Target target = new Target(); int digit = 10; Source s1 = new Source(target,digit++); Source s2 = new Source(target,digit++); Source s3 = new Source(target,digit++); try { s1.t.join(); s2.t.join(); s3.t.join(); Biên soạn : Bùi Công Giao - 234 Chương 10: Luồng xử lý } catch(InterruptedException e) { System.out.println("Interrupted"); } } } Kết hiển thị sau Trong chương trình trên, có dãy số đăng nhập hiển thị display() Điều có nghĩa việc thâm nhập bị hạn chế luồng thời điểm Nếu ta bỏ từ khóa synchronized đặt trước phương thức display() lớp Target, tất luồng lúc gọi phương thức, đối tượng Điều kiện biết đến tình trạng tranh đua (race condition) Trong trường hợp này, việc xuất sau 10.3.4 Sử dụng khối đồng Tạo phương thức đồng phạm vi lớp đường dễ dàng có hiệu việc thực đồng Tuy nhiên, điều không làm việc tất trường hợp Hãy xem trường hợp ta muốn đồng thâm nhập vào đối tượng lớp mà không thiết kế cho thâm nhập đa luồng Tức là, lớp không sử dụng phương thức đồng Hơn nữa, mã nguồn định nghĩa lớp khơng có cho thêm synchronized trước phương thức đồng Để đồng truy nhập phương thức đối tượng từ nơi gọi ta sử dụng chung khối đồng (synchronized block) sau: synchronized(object) { // câu lệnh đồng } Biên soạn : Bùi Công Giao - 235 Chương 10: Luồng xử lý Ở đây, object tham chiếu đến đối tượng đồng Một khối đồng bảo đảm gọi đến phương thức (mà thành phần đối tượng) sau luồng hành thâm nhập thành công vào monitor đối tượng Chương trình SynchBlock câu lệnh đồng sử dụng nào: package chuong10; class Target SynchBlock { void display(int num) { System.out.print(""); } } class Source SynchBlock implements Runnable{ int number; Target SynchBlock target; Thread t; public Source(Target SynchBlock targ,int n) { target = targ; number = n; t = new Thread(this); t.start(); } // đồng gọi phương thức display() public void run(){ synchronized(target) { target.display(number); } } } public class SynchBlock { Biên soạn : Bùi Công Giao - 236 Chương 10: Luồng xử lý public static void main(String[] args){ Target SynchBlock target = new Target SynchBlock (); int digit = 10; Source SynchBlock s1 = new Source SynchBlock (target,digit++); Source SynchBlock s2 = new Source SynchBlock (target,digit++); Source SynchBlock s3 = new Source SynchBlock (target,digit++); try { s1.t.join(); s2.t.join(); s3.t.join(); } catch(InterruptedException e){ System.out.println("Interrupted"); } } } Ở đây, từ khóa synchronized khơng hiệu chỉnh phương thức display() Từ khóa sử dụng phương thức run() lớp Target SynchBlock Kết xuất sau: Sự không thuận lợi phương thức đồng Người lập trình thường viết chương trình đơn thể luồng Tất nhiên trạng thái chắn khơng lợi ích cho đa luồng Lấy ví dụ, lụồng khơng tận dụng việc thực thi trình biên dịch Trình biên dịch Java từ Sun không chứa nhiều phương thức đồng Các phương thức đồng không thực thi tốt phương thức không đồng Các phương thức chậm từ ba đến bốn lần so với phương thức tương ứng không đồng Trong trạng thái nơi mà việc thực thi có giới hạn, phương thức đồng bị ngăn chặn 10.3.5 Kỹ thuật đợi – thông báo Java cung cấp chế liên lạc bên sử dụng phương thức wait(), notify() notifyAll() Các phương thức thực các phương thức final Biên soạn : Bùi Công Giao - 237 Chương 10: Luồng xử lý lớp Object, để tất lớp truy xuất chúng Ba phương thức gọi từ phương thức đồng • Phương thức wait() báo cho luồng gọi thoát khỏi monitor để vào trạng thái sleep số luồng khác vào monitor gọi phương thức notify() • Phương thức notify() đánh thức hay thơng báo cho luồng mà gọi phương thức wait() • Phương thức notifyAll() đánh thức hay thông báo tất luồng mà gọi phương thức wait() Khi tất luồng vào trạng thái sleep, luồng có quyền ưu tiên cao chạy Chương trình Dining biểu thị cho việc sử dụng phương thức notify() wait(): package chuong10; class ChopStick { boolean available; ChopStick() { available = true; } public synchronized void takeup(int philo_num, String side) { while (!available) { try { System.out.println("Philosopher "+ philo_num+ " is waiting for the "+ side+ " chopstick"); wait(); } catch (InterruptedException e) { } } System.out.println("Philosopher "+ philo_num+ " is taking up the "+ side+ " chopstick"); available = false; } public synchronized void putdown(int philo_num, String side) { System.out.println("Philosopher " + philo_num + " is putting down the "+ side+ " chopstick"); available = true; notify(); } Biên soạn : Bùi Công Giao - 238 Chương 10: Luồng xử lý } class Philosopher extends Thread { ChopStick left, right; int philo_num; Philosopher(int num, ChopStick chop1, ChopStick chop2) { philo_num = num; left = chop1; right = chop2; } public void eat() { left.takeup(philo_num+ 1, "left"); right.takeup(philo_num+ 1, "right"); System.out.println("Philosopher " + (philo_num + 1) + " is eating"); } public void think() { left.putdown(philo_num+ 1, "left"); right.putdown(philo_num+ 1, "right"); System.out.println("Philosopher " + (philo_num + 1) + " is thinking"); } public void run() { while (true) { eat(); try { sleep(1000); } catch (InterruptedException e) { } think(); try { sleep(1000); } catch (InterruptedException e) { } } } } public class Dining { Biên soạn : Bùi Công Giao - 239 Chương 10: Luồng xử lý static ChopStick[] chopsticks = new ChopStick[5]; static Philosopher[] philos = new Philosopher[5]; public static void main(String[] args) { for (int count = 0; count

Ngày đăng: 12/04/2023, 17:21

Xem thêm:

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

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN