Bài giảng lập trình java

219 4 0
Bài giảng lập trình java

Đ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

TÀI LIỆU BÀI GIẢNG LẬP TRÌNH JAVA Tài liệu dùng nội CHƯƠNG GIỚI THIỆU VỀ JAVA Nội dung chương tập trung trình bày vấn đề ngơn ngữ lập trình Java: • Lịch sử đời phát triển Java • Kiến trúc tổng qt chương trình xây dựng Java • Các tốn tử cấu trúc liệu Java • Các cấu trúc lệnh Java 1.1 LỊCH SỬ PHÁT TRIỂN CỦA JAVA 1.1.1 Java Năm 1991, nhóm kỹ sư Sun Microsystems muốn lập trình để điều khiển thiết bị điện tử tivi, máy giặt, lò nướng… Ban đầu, họ định dùng C C++ trình biên dịch C/C++ lại phụ thuộc vào loại CPU Do đó, họ bắt tay vào xây dựng ngôn ngữ chạy nhanh, gọn, hiệu quả, độc lập thiết bị ngôn ngữ “Oak” đời vào năm 1995, sau đổi tên thành Java Ngơn ngữ lập trình Java Sun Microsystems đưa giới thiệu vào tháng năm 1995 nhanh chóng trở thành ngơn ngữ lập trình lập trình viên chuyên nghiệp Java xây dựng dựa tảng C C++ nghĩa Java sử dụng cú pháp C đặc trưng hướng đối tượng C++ Java ngôn ngữ vừa biên dịch vừa thông dịch Đầu tiên mã nguồn biên dịch thành dạng bytecode Sau thực thi loại máy nhờ trình thơng dịch Mục tiêu nhà thiết kế Java cho phép người lập trình viết chương trình lần chạy phần cứng khác Ngày nay, Java sử dụng rộng rãi, không để viết ứng dụng máy cục hay mạng mà để xây dựng trình điều khiển thiết bị di động, PDA, … 1.1.2 Đặc trưng ngôn ngữ Java Ngôn ngữ Java có đặc trưng sau: • Đơn giản • Hướng đối tượng • Độc lập phần cứng hệ điều hành • Mạnh mẽ • Bảo mật • Phân tán • Đa luồng • Linh động 32 Tài liệu dùng nội Đơn giản Những người thiết kế mong muốn phát triển ngôn ngữ dễ học quen thuộc với đa số người lập trình Do Java loại bỏ đặc trưng phức tạp C C++ như: • Loại bỏ thao tác trỏ, thao tác định nghĩa chồng tốn tử (operator overloading)… • Khơng cho phép đa kế thừa (Multi-inheritance) mà sử dụng giao diện (interface) • Không sử dụng lệnh “goto” file header (.h) • Loại bỏ cấu trúc “struct” “union” Hướng đối tượng Java ngơn ngữ lập trình hồn tồn hướng đối tượng: • Mọi thực thể hệ thống coi đối tượng, tức thể cụ thể lớp xác định • Tất chương trình phải nằm class định • Khơng thể dùng Java để viết chức mà khơng thuộc vào lớp Tức Java không cho phép định nghĩa liệu hàm tự chương trình Độc lập phần cứng hệ điều hành Đối với ngơn ngữ lập trình truyền thống C/C++, phương pháp biên dịch thực sau (Hình 3.1): Với phần cứng khác nhau, có trình biên dịch khác để biên dịch mã nguồn chương trình cho phù hợp với phần cứng Do vậy, chạy phần cứng khác, bắt buộc phải biên dịch lại mà nguồn compiler compiler compiler IB Sparc Macintosh Hình 3.1 Cách biên dịch truyền thống Đối chương trình viết Java, trình biên dịch Javac biên dịch mã nguồn thành dạng bytecode Sau đó, chạy chương trình phần cứng khác nhau, máy ảo Java dùng trình thơng dịch Java để chuyển mã bytecode thành dạng chạy 33 Tài liệu dùng nội phần cứng tương ứng Do vậy, thay đổi phần cứng, biên dịch lại mã nguồn Java Hình 3.2 minh hoạ trình biên dịch thơng dịch mã nguồn Java IB Bytecode Trình thơng dịch Java Trình biên dịch (Java Interpreter) Độc lập Sparc Macintosh (Platform independent) Hình 3.2 Dịch chương trình Java Mạnh mẽ Java ngôn ngữ yêu cầu chặt chẽ kiểu liệu: • Kiểu liệu phải khai báo tường minh • Java khơng sử dụng trỏ phép tốn trỏ • Java kiểm tra việc truy nhập đến mảng, chuỗi thực thi để đảm bảo truy nhập khơng ngồi giới hạn kích thước mảng • Q trình cấp phát, giải phóng nhớ cho biến thực tự động, nhờ dịch vụ thu nhặt đối tượng không cịn sử dụng (garbage collection) • Cơ chế bẫy lỗi Java giúp đơn giản hóa qúa trình xử lý lỗi hồi phục sau lỗi Bảo mật Java cung cấp môi trường quản lý thực thi chương trình với nhiều mức để kiểm sốt tính an tồn: • Ở mức thứ nhất, liệu phương thức đóng gói bên lớp Chúng truy xuất thông qua giao diện mà lớp cung cấp • Ở mức thứ hai, trình biên dịch kiểm sốt để đảm bảo mã an tồn, tn theo nguyên tắc Java • Mức thứ ba đảm bảo trình thơng dịch Chúng kiểm tra xem bytecode có đảm bảo qui tắc an tồn trước thực thi • Mức thứ tư kiểm sốt việc nạp lớp vào nhớ để giám sát việc vi phạm giới hạn truy xuất trước nạp vào hệ thống 34 Tài liệu dùng nội Phân tán Java thiết kế để hỗ trợ ứng dụng chạy mạng lớp Mạng (java.net) Hơn nữa, Java hỗ trợ nhiều chạy khác nên chúng sử dụng rộng rãi công cụ phát triển Internet, nơi sử dụng nhiều khác Đa luồng Chương trình Java cung cấp giải pháp đa luồng (Multithreading) để thực thi công việc đồng thời đồng luồng Linh động Java thiết kế ngôn ngữ động để đáp ứng cho môi trường mở Các chương trình Java chứa nhiều thơng tin thực thi nhằm kiểm soát truy nhập đối tượng lúc chạy Điều cho phép khả liên kết động mã 1.1.3 Cài đặt Java Quá trình cài đặt mơi trường Java máy bao gồm ba bước: • Copy cài đặt • Chạy chương trình cài đặt • Cập nhật biến môi trường Copy cài đặt Có thể copy từ đĩa CD tải xuống miễn phí địa web site nhóm Java: http://www.java.sun.com/downloads/ Chạy chương trình cài đặt Chạy tập tin vừa copy (hoặc vừa tải về) Chọn thư mục cài đặt, thư mục mặc định là: C:\jdk1.5 (với phiên JDK1.5) Cập nhật biến môi trường Cập nhật biến môi trường (PATH) giúp việc thực thi biên dịch mã Java tiến hành thư mục Để cập nhật biến PATH, cần thêm đường dẫn đầy đủ thư mục java vừa cài đặt (C:\jdk1.5\bin) vào cuối giá trị biến • Đối với WindowsNT, WinXP khởi động Control Panel, chọn System, chọn Environment (hoặc click chuột phải vào My Computer, chọn Properties, chọn Advanced, click vào Environment Variables), click vào biến PATH phần User Variables System Variables Sau đó, thêm vào cuối nội dung biến có dịng sau (phải có dấu chấm phẩy): ;C:\jdk1.5\bin • Đối với Windows98/95, chọn START, chọn RUN, nhập dịng sysedit vào lệnh, nhấn OK, chọn cửa sổ AUTOEXEC.BAT Tìm dịng khai báo biến PATH, khơng có, thêm vào dịng theo mẫu: SET PATH=C:\jdk1.5\bin Nếu có 35 Tài liệu dùng nội sẵn biến PATH, thêm vào cuối dịng nội dung: ;C:\jdk1.5\bin 1.2 KIẾN TRÚC CHƯƠNG TRÌNH XÂY DỰNG TRÊN JAVA 1.2.1 Kiến trúc chương trình Java Dạng tập tin mã nguồn Java có cấu trúc sau : package packageName; import java.awt.*; class className // Khai báo tên gói, có // Khai báo tên thư viện sẵn có, cần dùng // Khai báo tên lớp { /* Đây dòng ghi */ int var; // Khai báo biến public void methodName() // Khai báo tên phương thức { /* Phần thân phương thức */ statement (s); // Lệnh thực } } Một tệp mã nguồn Java có ba phần chính: • Phần khai báo tên gói (khối) từ khố package • Phần khai báo thư viện tham khảo từ khố import • Phần khai báo nội dung lớp từ khoá class Khai báo Package Package dùng để đóng gói lớp chương trình lại với thành khối Đây cách hữu hiệu để lưu trữ lớp gần giống có module thành khối thống Cú pháp khai báo tên gói từ khố package: package ; Để đặt tên package chương trình, người ta tiến hành đặt tên thư mục ổ đĩa Nghĩa bắt dầu tên có phạm vi lớn, tên có phạm vi nhỏ, cuối 36 Tài liệu dùng nội tên gói trực tiếp chứa lớp Phạm vi đặt tên gói, thực tế, tiến hành theo thứ tự phạm vi lớn đến nhỏ sau: • Tên tổ chức • Tên cơng ty • Tên dự án • Tên modul dự án • Tên chức modul Ví dụ: • Tên miền cơng ty syz.com • Tên dự án pro • Dự án có hai modul mod1 mod2 • Modul mod1 có hai chức kết nối sở liệu connection biểu diễn liệu bean • Modul mod2 có hai chức giao tiếp interface xử lí u cầu process Khi đó, cấu trúc khối dự án mơ tả hình 3.3 com syz pro mod2 mod1 connectio n bean interface process Hình 3.3: Kiến trúc khối dự án Khi đó, chức bean có lớp User, phải khai báo tên khối lớp sau: package com.syz.pro.mod1.bean; Ưu điểm package: • Cho phép nhóm lớp vào với thành đơn vị nhỏ Việc thao tác đơn vị khối gọn thao tác tập lớp 37 Tài liệu dùng nội • Tránh việc xung đột đặt tên lớp Vì lớp khơng package đặt tên trùng Khi số lượng lớp chương trình q lớn ta tránh phải đặt tên khác cho lớp cách đặt chúng vào package khác • Cho phép bảo vệ lớp Khi chương trình lớn, việc chia nhỏ chương trình thành package thuận lợi cho việc quản lí phát triển • Tên gói cịn dùng để định danh lớp ứng dụng Lưu ý: • Dịng lệnh khai báo tên khối phải đặt tện tin mã chương trình • Chỉ khai báo tối đa tên khối tệp mã nguồn Java • Các tệp tin lớp nằm gói ứng dụng phải lưu thư mục (tên thư mục tên khối) theo cấu trúc khối dự án • Tên khối nên đặt theo chữ thường tên khối tên thư mục tương ứng ổ đĩa, tránh nhầm lẫn với tên tệp tin tên lớp chương trình • Khi khơng phân chia chương trình thành khối (chương trình đơn giản), không cần thiết phải khai báo tên khối đầu chương trình Khai báo thư viện Khai báo thư viện để thư viện định nghĩa sẵn mà chương trình tham khảo tới Cú pháp khai báo thư viện với từ khoá import sau: import ; Java chuẩn cung cấp số thư viện sau: • java.lang: cung cấp hàm thao tác kiểu liệu bản, xử lí lỗi ngoại lệ, xử lí vào thiết bị chuẩn bàn phím hình • java.applet: cung cấp hàm cho xây dựng applet (sẽ trình bày Chương 6) • java.awt: cung cấp hàm cho xây dựng ứng dụng đồ hoạ với thành phần giao diện multi media (sẽ trình bày chi tiết Chương 6) • java.io: cung cấp hàm xử lí vào/ra thiêt bị chuẩn thiết bị ngoại vi • java.util: cung cấp hàm tiện ích xử lí liên quan đến kiểu liệu có cấu trúc Date, Stack, Vector Ví dụ, chương trình cần đến thao tác chuyển kiểu đổi liệu tường minh (từ kiểu string sang kiểu int), ta phải tham khảo thư viện java.lang: import java.lang.*; Lưu ý: 38 Tài liệu dùng nội • Nếu muốn khai báo tham khảo nhiều thư viện, phải khai báo tham khảo thư viện với từ khố import • Nếu tham khảo vài lớp thư viện, nên rõ tham khảo lớp nào, thay phải khai báo tham khảo gói (bằng kí hiệu “*”) tham khảo gói tăng kích cỡ tệp tin class sau biên dịch • Nếu khơng tham khảo thư viện nào, khơng cần thiết phải khai báo tham khảo với từ khoá import Khai báo lớp Phần thứ ba phần khai báo lớp nội dung lớp, phần ln bắt buộc phải có tệp mã nguồn Java: • Khai báo tên lớp với từ khố class • Khái báo thuộc tính lớp • Khai báo phương thức lớp Việc khai báo lớp với thuộc tính phương thức trình bày chi tiết chương 1.2.2 Chương trình Java Chương trình sau cho phép hiển thị thông điệp (Nằm tệp mã nguồn First.java): Chương trình 1.1 package vidu.chuong1; // Đây chương trình “First.java” class First { public static void main(String args[]) { System.out.println(“Hello World”); } } Để biên dịch mã nguồn, ta sử dụng trình biên dịch javac Trình biên dịch xác định tên file nguồn dịng lệnh mơ tả (giả sử thư mục chứa package vidu biến môi trường PATH thiết lập qui cách): >javac vidu/chuong3/First.java 39 Tài liệu dùng nội Trình dịch javac tạo file First.class chứa mã “bytecodes” Những mã chưa thể thực thi Để chương trình thực thi ta cần dùng trình thơng dịch “java interpreter” với lệnh java Lệnh thực sau: >javac vidu.chuong3.First Kết hiển thị sau: Hello World 1.2.3 Phân tích chương trình Trong Java, tất mã lệnh phải tổ chức vào lớp định Do đó, tệp tin mã nguồn xác định lớp Java tên tệp tin phải trùng với tên lớp Java phân biệt chữ hoa chữ thường, tên tập tin chương trình phải trùng với tên lớp: First.java package vidu.chuong1; Đây dòng khai báo tên khối chương trình, tên khối chương trình đặt theo hai mức: • Mức thứ kiểu bài: ví dụ (vidu) tập (baitap) • Mức thứ hai tên chương: chuong3, chuong4, chuong5, chuong4 Vì ví dụ, nằm chương nên thuộc vào gói vidu.chuong3 Đồng thời, tệp tin First.java nằm thư mục: /vidu/chuong3/ Chương trình khơng tham khảo thư viện nên không cần lệnh import // Đây chương trình “First.java” Ký hiệu “// ” dùng để thích dịng lệnh Java hỗ trợ hai loại thích: rình biên dịch bỏ qua dịng thích • Loại thích dịng, dùng “//” Trình biên dịch bỏ qua nội dung kí hiệu “//” hết dịng lệnh chứa • Loại thích nhiều dịng bắt đầu với “/*” kết thúc với “*/” Trình biên dịch bỏ qua nội dung nằm hai kí hiệu Dịng khai báo lớp có tên First: Bắt đầu với từ khố class, tên lớp class First Một định nghĩa lớp nằm trọn vẹn hai ngoặc móc mở “{“ đóng “}” Các ngoặc đánh dấu bắt đầu kết thúc khối lệnh public static void main(String args[ ]) Đây phương thức chính, từ chương trình bắt đầu việc thực thi Tất ứng dụng java sử dụng phương thức main • Từ khố public định truy xuất Nó cho biết thành viên lớp truy xuất từ đâu chương trình 40 Tài liệu dùng nội Set dups = new HashSet(); for (String a : args) if (!uniques.add(a)) dups.add(a); // Destructive set-difference uniques.removeAll(dups); System.out.println("Unique words: " + uniques); System.out.println("Duplicate words: " + dups); } } Giải thích code: - Lệnh uniques.add(a) ngồi việc thêm phần tử vào tập hợp, cịn trả kết thực Phương thức trả true thêm được, false ngược lại - Sau tạo tập hợp (uniques dups), ta lấy phần bù (uniques dups), kết cho phần tử thuộc tập uniques khơng thuộc dups (nói cách khác giữ lại phần tử xuất lần) - Dĩ nhiên phần tử xuất (hoặc bằng) lần tập dups Khi chạy với danh sách đối số ví dụ trước (i came i saw i left) kết : Unique words: [left, saw, came] Duplicate words: [i] Một phép tốn phổ biến phép lấy phần bù cân xứng ( symmetric set difference ) – tập hợp bao gồm phần tử tập hợp không chứa phần tử giống tập hợp Đoạn code thể phép tốn (Minh họa hình vẽ bên dưới): 216 Tài liệu dùng nội Set symmetricDiff = new HashSet(s1); symmetricDiff.addAll(s2); Set tmp = new HashSet(s1); tmp.retainAll(s2); symmetricDiff.removeAll(tmp); Giải thích code: - Đầu tiên ta “copy” nội dung HashSet s1 vào SymmetricDiff Sau tạo SymmetricDiff = s1 ∪ s2 phương thức addAll (đã đề cập kỹ phần Collection) Tập tmp tạo s1 ∩ s2 Bước cuối lấy phần bù: SymmetricDiff – tmp Kết minh họa hình vẽ Tốn tử với mảng Set Inteface (Arrays Operations) Toán tử với mảng Set khơng khác với kiểu Collection khác Nó đề cập phần Collection Inteface phía Các kiểu thực thi Set: Các kiểu thực thi Set bao gồm loại thực thi thông thường (generalpurpose) thực thi đặc biệt (special-purpose) Kiểu thực thi thông thường (genenal-purpose) 217 Tài liệu dùng nội Như giới thiệu phần trên, Set bao gồm lớp thực thi thơng thường HashSet, TreeSet LinkedHashSet Một điều đáng ghi nhớ kiểu HashSet tập hợp tính tuyến tính tổng số phần tử đưa vào với số lượng ô chứa ( dung lượng ) Do lựa chọn dung lượng chứa khởi đầu q lớn gây lãng phí khơng gian thời gian Mặt khác, lựa chọn dung lượng thấp làm tốn thời gian việc chép cấu trúc liệu buộc phải tăng dung lượng lên Nếu bạn không định dung lượng ban đầu, dung lượng mặc định 14 Trong khứ, có vài lợi lựa chọn dung lượng khởi đầu số nguyên tố Tuy nhiên điều khơng cịn Thay vào số mũ Dịng code xác định kiểu HashSet với dung lượng ban đầu 64 Set s = new HashSet(64); Kiểu thực thi đặc biệt (Special-purpose) Set bao gồm kiểu thực thi đặc biệt EnumSet CopyOnWriteArraySet EnumSet kiểu thực thi hữu hiệu kiểu enum Tất thành viên tập hợp enum phải kiểu enum Tập hợp Enum hỗ trợ duyệt phần tử giới hạn Ví dụ cho trước enum ngày tuần, bạn duyệt qua tất ngày tuần sau : for (Day d : EnumSet.range(Day.MONDAY, Day.FRIDAY)) System.out.println(d); CopyOnWriteArraySet kiểu thực thi theo phương pháp mảng copy-on-write Tất toán tử làm thay đổi tập hợp add,set,and remove thực cách tạo mảng Không giống hầu hết kiểu thực thi Set phương thức add ,remove contains địi hỏi thời gian cân xứng với kích thước tập hợp Do kiểu thực thi thích hợp với tập hợp mà cần duyệt phần tử không cần thay đổi phần tử SortedSet Inteface 218 Tài liệu dùng nội SortedSet inteface Set có tính chất bảo toàn thứ tự phần tử theo chiều từ xuống, xếp theo thứ tự tự nhiên tn theo kiểu Comparator Ngồi tốn tử cung cấp Set, SortedSet interface cịn cung cấp tốn tử sau : Quan sát phạm vi (Range view) : cho phép toán tử phạm vi tùy ý - tập hợp xếp - Điểm chốt (Endpoints) : trả phần tử đầu cuối tập hợp - Truy cập vào lớp Comparator : trả kiểu Comparator – dùng để xếp tập hợp - SortedSet interface bao gồm phương thức sau : public interface SortedSet extends Set { // Range-view SortedSet subSet(E fromElement, E toElement); SortedSet headSet(E toElement); SortedSet tailSet(E fromElement); // Endpoints E first(); E last(); // Comparator access Comparator

Ngày đăng: 23/12/2023, 10:17

Tài liệu cùng người dùng

Tài liệu liên quan