Bài giảng Phát triển ứng dụng trên thiết bị di động - Chương 1: Kiểu dữ liệu cơ sở - Lương Trần Hy Hiến
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phát triển ứng dụng trên thiết bị di động - Chương 1: Kiểu dữ liệu cơ sở - Lương Trần Hy Hiến", để 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:
- bai_giang_phat_trien_ung_dung_tren_thiet_bi_di_dong_chuong_1.pdf
Nội dung text: Bài giảng Phát triển ứng dụng trên thiết bị di động - Chương 1: Kiểu dữ liệu cơ sở - Lương Trần Hy Hiến
- Ths. Lương Trần Hy Hiến Khoa Công Nghệ Thông Tin Trường Đại học Sư phạm TP.HCM
- Giảng viên: . Ths. Lương Trần Hy Hiến (HIENLTH) . Khoa CNTT, ĐH Sư phạm TpHCM (FIT – HCMUE) . Các môn dạy: ▪ NM Công nghệ Phần mềm, Phát triển ứng dụng Web ▪ Phát triển Ứng dụng Di động ▪ Công nghệ NET, Bảo mật và An ninh mạng . Hướng nghiên cứu: ▪ Software Engneering, Semantic Web, Information Security . Email: hienlth@hcmup.edu.vn . Website môn học: 2
- 1. Kiểu dữ liệu cơ sở 2. Mảng (Array) 3. Tập hợp (Collection) 4. Hướng đối tượng trong Java 5. Bẫy lỗi ngoại lệ (Exception) Tài liệu này tham khảo trực tiếp từ slide bài giảng của T3H 3
- Kiểu dữ liệu Kiểu cơ sở Kiểu tham chiếu (Primitive data types) (Reference data types) Kiểu dữ Kích Miền giá trị Kiểu dữ Mô tả liệu thước liệu byte 8 bit -27 27-1 Array Kiểu mảng short 16 bit -215 215-1 Class Kiểu lớp đối tượng int 32 bit -231 231-1 Interface Kiểu giao diện lập long 64 bit -263 263-1 trình String Chuỗi ký tự float 32 bit 1.40129846432481707e-45 3.40282346638528860e+38 double 64 bit 1.40129846432481707e-45 3.40282346638528860e+38 Boolean true hoặc false char 16 bit Ký tự Unicode 16 bit
- Cơ chế chuyển đổi kiểu dữ liệu . Trạng thái 2 kiểu của việc chuyển đổi kiểu int Chuyển đổi kiểu tường minh Chuyển đổi kiểu ngầm định float
- Cơ chế chuyển đổi kiểu dữ liệu . Chuyển đổi kiểu ngầm định ▪ Hai kiểu phải tương thích ▪ Kiểu đích có tầm giá trị lớn hơn kiểu nguồn qui luật của sự phát triển int i=1000; long l= i; . Chuyển đổi kiểu tường minh ▪ Chuyển từ kiểu có độ chính xác cao sang kiểu có độ chính xác thấp hơn long l=1000; int i=(int)l;
- Khai báo biến . Cú pháp: KiểuDữLiệu TênBiến; . Ví dụ: int tuoi; String ten; double luong; soNguyenA Tên biến 10 Giá trị 0FFFA Địa chỉ
- Hằng số . Hằng là những giá trị không thay đổi trong suốt quá trình hoạt động của ứng dụng . Khai báo hằng ▪ Cú pháp: final Kiểu_Dữ_Liệu Tên_Hằng = ; ▪ Ví dụ: ▪ final double PI=3.14;
- Quy ước đặt tên biến và hằng số . Tên biến có thể gồm các ký tự chữ, ký tự số, dấu gạch dưới ‘_’, và dấu ‘$’ . Tên biến phải bắt đầu bằng ký tự chữ . Tên biến không được trùng với từ khóa và từ dành riêng của Java . Tên biến có phân biệt chữ hoa – thường . Nếu tên biến chỉ gồm một từ đơn, tên biến nên viết chữ thường . Nếu tên biến gồm nhiều từ, ký tự đầu của từ đầu viết thường, ký tự đầu của mỗi từ kế tiếp viết hoa
- Kiểu String . Trong Java, String là lớp quản lý dữ liệu văn bản . Trong các ngôn ngữ khác, xâu là mảng ký tự, trong Java xâu là các đối tượng . Khai báo: String s1 = new String(); String s2 = “Hello”; H E L L O s
- Nội dung của đối tượng String là không thể thay đổi Khi String được tạo ra, trật tự các ký tự của xâu là cố định Khi cần tạo một biến thể của xâu, chúng ta nên tạo một xâu mới Có thể sử dụng String trong lệnh switch 12
- equals length charAt compareTo indexOf lastIndexOf concat Substring
- Lưu trữ 1 ký tự (1 phần tử của biến kiểu string) Ví dụ: char letter = 'S'; out.println(letter); String food = "cookie"; char firstLetter = food.charAt(0); // 'c' 14
- Các phương thức xử lý trên kiểu String Vấn đề: String s = “Happy "; Cần có các giá trị để phục vụ cho String s1 = “New Year”; việc hiển thị và tính toán // Tính chiều dài chuỗi Ví dụ: int len = s.length(); // 6 // Nối chuỗi s1 vào chuỗi s: tương đương s • Tính chiều dài của chuỗi s + s1 • Nối chuỗi s1 vào chuỗi s s.concat(s1); // Happy New Year • Lấy một ký tự tại vị trí index trong // Lấy một ký tự tại vị trí số 8 của s chuỗi s char result = s.charAt(8); // e • So sánh hai chuỗi s1 và s2 // So sánh hai chuỗi s1 và s2 • Tìm vị trí xuất hiện đầu tiên của String s2 = “New Year”; chuỗi s2 trong chuỗi s s2.compareTo(s1); // 0 (trả về 0, 0) Giải quyết: // Tìm vị trí xuất hiện đầu tiên của chuỗi s2 Sử dụng hàm chuỗi trong thư viện trong chuỗi s hàm của Java s.indexOf(s2); // 6 (vị trí đầu tiên)
- Các phương thức xử lý trên kiểu String Vấn đề: String s = “Happy New Year"; Cần có các giá trị để phục vụ cho String s1 = “Happy”; String s2 = “New”; việc hiển thị và tính toán // Tìm vị trí xuất hiện cuối cùng Ví dụ: của chuỗi s2 trong chuỗi s • Tìm vị trí xuất hiện cuối cùng của s.lastIndexOf(s2); // 6 (trả về -1 chuỗi s2 trong chuỗi s nếu không tìm thấy) • Thay thế chuỗi s1 bằng chuỗi s2 // Thay thế chuỗi s1 bằng chuỗi s2 trong chuỗi s trong chuỗi s s.replace(s1, s2); // New New Year • Loại bỏ các khoảng trắng thừa // Loại bỏ các khoảng trắng thừa của của chuỗi s3 chuỗi s3 • Tạo chuỗi con s4 từ chuỗi s từ vị String s3 = “ Hello Bi ”; trí số 6 s3.trim();// Hello Bi Giải quyết: // Tạo chuỗi con s4 từ chuỗi s từ vị trí số 6 Sử dụng hàm chuỗi trong thư String s4 = s.substring(6); // New viện hàm của Java Year
- Lớp StringBuilder . Quản lý một chuỗi có thể thay đổi kích thước và nội dung // Phương thức // Khởi tạo append() StringBuilder() insert() StringBuilder(int capacity) delete() StringBuilder(String s) reverse()
- Lớp StringBuilder . Các hàm khởi tạo của lớp ▪ StringBuilder(): Mặc định tạo ra một đối tượng StringBuilder có thể lưu giữ được 16 ký tự ▪ StringBuilder(int capacity): Tạo ra một đối tượng StringBuilder có thể lưu giữ được capacity ký tự ▪ StringBuilder(String s): Tạo một đối tượng StringBuilder lấy thông tin từ chuỗi s
- Lớp StringBuilder . Ví dụ: StringBuilder sb = new StringBuilder(); sb.append(“Wellcome to "); sb.append(“Java ”); sb.append(“world”); System.out.println(sb); // Wellcome to Java world
- Lớp StringBuilder . append() ▪ append(char c): Gắn thêm chuỗi đại diện của ký tự c vào chuỗi ▪ append(int i): Gắn thêm chuỗi đại diện của số nguyên i vào chuỗi ▪ append(Object obj): Gắn thêm chuỗi đại diện của đối tượng obj vào chuỗi ▪ append(String s): Gắn thêm chuỗi cụ thể s vào chuỗi
- Lớp StringBuilder . insert() ▪ insert(int offset, char c): Chèn chuỗi đại diện của ký tự c vào chuỗi ▪ insert(int offset, int i): Chèn chuỗi đại diện của số nguyên i vào chuỗi ▪ insert(int offset, Object obj): Chèn chuỗi đại diện của đối tượng obj vào chuỗi ▪ append(int offset, String s): Chèn chuỗi cụ thể s vào chuỗi
- Lớp StringBuilder . delete() ▪ delete(int start, int end): Xóa các ký tự từ start tới end ra khỏi chuỗi ▪ deleteCharAt(int index): Xóa ký tự tại vị trí index ra khỏi chuỗi . reverse(): Đảo ngược chuỗi trong đối tượng đang có, có kết quả trả về là một tham chiếu đến đối tượng này
- Lớp StringTokenizer . Chia chuỗi thành các chuỗi con // Khởi tạo StringTokenizer(String str) StringTokenizer(String str, String delim) StringTokenizer(String str, String delim, boolean returnDelims) // Phương thức countTokens() hasMoreTokens() nextToken() hasMoreElements() nextElement()
- Lớp StringTokenizer . Các hàm khởi tạo của lớp ▪ StringTokenizer(String str): Xây dựng một chuỗi tokenizer cho một chuỗi cụ thể str. Sử dụng các delim mặc định là: “\t\n\r\f" ▪ StringTokenizer(String str, String delim): Xây dựng một chuỗi tokenizer cho một chuỗi cụ thể str. Các ký tự trong delim là ký tự để phân tách cách token. ▪ StringTokenizer(String str, String delim, boolean returnDelims): Xây dựng một chuỗi tokenizer cho một chuỗi cụ thể str. Nếu returnDelims = true thì mỗi delim được trả về là một chuỗi có chiều dài =1, ngược lại thì delim sẽ được bỏ qua và xem như là một dấu phân cách giữa các token
- Lớp StringTokenizer . Ví dụ String s = “Lập trình Java”; StringTokenizer st = new StringTokenizer(s); while (st.hasMoreTokens()) System.out.println(st.nextToken()); s = “Lập/trình/Java”; st = new StringTokenizer(s,”/”); while (st.hasMoreTokens()) System.out.println(st.nextToken());
- Lớp StringTokenizer . countTokens(): Tính số lượng token trong chuỗi còn lại khi sử dụng delim mặc định . hasMoreTokens(): Kiểm tra xem có còn token trong chuỗi các token hay không. (*) . nextToken(): Trả về token tiếp theo trong chuỗi các token ( ) . hasMoreElements(): Tương tự như (*), tuy nhiên nó ở trong Enumeration . nextElement(): Tương tự như ( ), tuy nhiên giá trị trả về là Object
- Ý nghĩa sử dụng Xây dựng chương trình Thực hiện nghiệp vụ f trong thực Dãy/ danh sách tế liên quan đến dãy/ Mảng danh sách Mảng là một loại biến đặc biệt, bao gồm một dãy các ô nhớ có nhiều ô nhớ con cho phép biểu diễn thông tin dạng danh sách trong thực tế Các phần tử trong mảng có cùng kiểu dữ liệu với nhau
- Ví dụ Chỉ số 0 1 2 3 4 5 6 7 Mảng a 5 8 1 0 3 2 7 6 Phần tử a[3]
- Lợi ích của việc sử dụng mảng . Mảng là cách tốt nhất cho phép quản lý nhiều phần tử dữ liệu có cùng kiểu tại cùng một thời điểm . Mảng tạo ra sự tối ưu trong việc quản lý bộ nhớ so với việc sử dụng nhiều biến cho cùng một chức năng ▪ Bộ nhớ có thể được gán cho mảng chỉ khi mảng thực sự được sử dụng. Do đó, bộ nhớ không bị tiêu tốn cho mảng ngay khi bạn khai báo mảng.
- Các kiểu mảng
- Khai báo và khởi tạo . Khai báo không khởi tạo kích thước và giá trị KiểuDữLiệu[] TênMảng; KiểuDữLiệu TênMảng[]; ▪ Ví dụ: ▪ int[] a; ▪ int a[];
- Khai báo và khởi tạo . Khai báo khởi tạo kích thước nhưng không có giá trị ban đầu KiểuDữLiệu[] TênMảng = new KiểuDữLiệu[SốPhầnTử]; KiểuDữLiệu TênMảng[] = new KiểuDữLiệu[SốPhầnTử]; ▪ Ví dụ: int[] a = new int[5]; int a[] = new int[5];
- Khai báo và khởi tạo . Khai báo có khởi tạo kích thước và khởi tạo giá trị ban đầu: KiểuDữLiệu[] TênMảng = new KiểuDữLiệu[] {giá trị 1, giá trị 2, giá trị 3, }; hoặc KiểuDữLiệu[] TênMảng = {giá trị 1, giá trị 2, giá trị 3, }; Ví dụ: int[] a = new int[]{2,10,4,8,5}; int[] a = {2, 10, 4, 8, 5};
- Thao tác cơ bản . Truy xuất giá trị 1 phần tử: TênMảng[vị _trí_i] ▪ Vị trí của 1 phần tử trong mảng bắt đầu từ 0 ▪ Vị_trí_i có giá trị từ 0 đến (số phần tử - 1) Chỉ số 0 1 2 3 4 5 6 7 a[3] ? Mảng a 5 8 1 0 3 2 7 6 a.length ? . Lấy chiều dài của mảng: thuộc tính length TênMảng.length
- Duyệt mảng . Duyệt và xử lý từng phần tử của mảng: for (int i = 0; i < TênMảng.length; i++) { // Xử lý trên phần tử TênMảng[i] } . Ví dụ: duyệt và xuất mảng int[] a = {1,2,3,4,5}; for (int i = 0; i < a.length; i++) System.out.println(a[i]);
- Mảng String J A V A . Ví dụ: Duyệt và xuất mảng String[] list = { “JAVA”, “C#”, “PHP”}; C # for (int i = 0; i < list.length; i++) System.out.println(list[i]); P H P list
- // import java.util.Arrays; int array[] = { 2, 5, -2, 6, -3, 8, 0, 7, -9, 4 }; int array1[] = { 2, 5, 6, -3, 8}; // Sắp xếp mảng số nguyên Arrays.sort(array); // So sánh hai mảng số nguyên array1 và array array1.equals(array); // Gán giá trị cho các phần tử trong mảng array1 Arrays.fill(array1, 10); // 10, 10, 10, 10, 10 // Sao chép mảng array1 sang array2 int[] arr2 = Arrays.copyOf(arr1, 6); // 10 10 10 10 10 0
- Collections Framework bao gồm . Interfaces: Là các giao tiếp thể hiện tính chất của các kiểu collection khác nhau như List, Set, Map. . Implementations: Là các lớp collection có sẵn được cài đặt các collection interfaces. . Algorithms: Là các phương thức tĩnh để xử lý trên collection, ví dụ: sắp xếp danh sách, tìm phần tử lớn nhất
- > > Collection Map > > > Set List SortedMap > SortedSet
- Cung cấp các thao tác chính trên collection như thêm/xoá/tìm phần tử Ví dụ: . boolean add(Object element); . boolean remove(Object element); . boolean contains(Object element); . int size(); . boolean isEmpty(); Nếu lớp cài đặt Collection không muốn hỗ trợ các thao tác làm thay đổi collection như add, remove, clear nó có thể tung ra ngoại lệ UnsupportedOperationException.
- List kế thừa từ Collection, nó cung cấp thêm các phương thức để xử lý collection kiểu danh sách (Danh sách là một collection với các phần tử được xếp theo chỉ số). Một số phương thức của List . Object get(int index); . Object set(int index, Object o); . void add(int index, Object o); . Object remove(int index); . int indexOf(Object o); . int lastIndexOf(Object o);
- Set kế thừa từ Collection, hỗ trợ các thao tác xử lý trên collection kiểu tập hợp (Một tập hợp yêu cầu các phần tử phải không được trùng lặp). Set không có thêm phương thức riêng ngoài các phương thức kế thừa từ Collection.
- SortedSet kế thừa từ Set, nó hỗ trợ thao tác trên tập hợp các phần tử có thể so sánh được. Các đối tượng đưa vào trong một SortedSet phải cài đặt giao tiếp Comparable hoặc lớp cài đặt SortedSet phải nhận một Comparator trên kiểu của đối tượng đó. Một số phương thức của SortedSet: . Object first(); // lấy phần tử đầu tiên (nhỏ nhất) . Object last(); // lấy phần tử cuối cùng (lớn nhất) . SortedSet subSet(Object e1, Object e2); // lấy một tập các phần tử nằm trong khoảng từ e1 tới e2.
- Các phần tử trong collection có thể được duyệt thông qua Iterator. Các lớp cài đặt Collection cung cấp phương thức trả về iterator trên các phần tử của chúng. Collection c; Iterator it = c.iterator();
- Iterator cho phép duyệt tuần tự một collection. Các phương thức của Iterator: . boolean hasNext(); . Object next(); . void remove(); Ví dụ: Iterator it = c.iterator(); while ( it.hasNext() ) { Point p = (Point) it.next(); System.out.println( p.toString() ); }
- Giao tiếp Map cung cấp các thao tác xử lý trên các bảng ánh xạ (Bảng ánh xạ lưu các phần tử theo khoá và không được có 2 khoá trùng nhau). Một số phương thức của Map . Object put(Object key, Object value); . Object get(Object key); . Object remove(Object key); . boolean containsKey(Object key); . boolean containsValue(Object value); .
- Map cung cấp 3 cách view dữ liệu: . View các khoá: Set keySet(); // Trả về các khoá . View các giá trị: Collection values(); // Trả về các giá trị . View các cặp khoá-giá trị Set entrySet(); // Trả về các cặp khoá-giá trị Sau khi nhận được kết quả là một collection, ta có thể dùng iterator để duyệt các phần tử của nó.
- Giao tiếp SortedMap kế thừa từ Map, nó cung cấp thao tác trên các bảng ánh xạ với khoá có thể so sánh được. Giống như SortedSet, các đối tượng khoá đưa vào trong SortedMap phải cài đặt giao tiếp Comparable hoặc lớp cài đặt SortedMap phải nhận một Comparator trên đối tượng khoá.
- Các cài đặt trong Collections Framework chính là các lớp collection có sẵn trong Java. Chúng cài đặt các collection interface ở trên để thể hiện các cấu trúc dữ liệu cụ thể. Ví dụ: mảng động, danh sách liên kết, cây đỏ đen, bảng băm
- LinkedList List ArrayList HashSet Set LinkedHashSet SortedSet TreeSet HashMap Map LinkedHashMap SortedMap TreeMap
- ArrayList: Mảng động, nếu các phần tử thêm vào vượt quá kích cỡ mảng, mảng sẽ tự động tăng kích cỡ. LinkedList: Danh sách liên kết 2 chiều. Hỗ trợ thao tác trên đầu và cuối danh sách. HashSet: Bảng băm. LinkedHashSet: Bảng băm kết hợp với linked list nhằm đảm bảo thứ tự các phần tử. TreeSet: Cây đỏ đen (red-black tree).
- HashMap: Bảng băm (cài đặt của Map). LinkedHashMap: Bảng băm kết hợp với linked list nhằm đảm bảo thứ tự các phần tử (cài đặt của Map). TreeMap: Cây đỏ đen (cài đặt của Map).
- Kế thừa AbstractList và triển khai List Interface. Constructor: . ArrayList( ) . ArrayList(Collection c) . ArrayList(int capacity) Phương thức: . void add(int index, Object element) . boolean add(Object o) . boolean addAll(Collection c) . boolean addAll(int index, Collection c) . void clear() 55
- Phương thức (tt): . boolean contains(Object o) . Object get(int index) . int indexOf(Object o) . int lastIndexOf(Object o) . Object remove(int index) . void removeRange(int fromIndex, int toIndex) . Object set(int index, Object element) . int size() . Object[] toArray() 56
- /*Tạo mảng*/ ArrayList obj = new ArrayList (); /*Thêm phần tử*/ obj.add("Mận"); obj.add("Đào"); obj.add("Cam); obj.add("Ổi"); /*Thêm phần tử vào vị trí*/ obj.add(0, "Quýt"); /*Xóa phần tử*/ obj.remove("Đào"); /*Xóa phần tử dựa vào vị trí*/ obj.remove(1); 57
- Khái niệm lập trình hướng đối tượng . Là phương pháp thiết kế và phát triển phần mềm dựa trên kiến trúc lớp (class) và đối tượng (object) . Mô hình hóa các đối tượng trong thế giới thực thành các đối tượng trong chương trình
- Đặc điểm của LT HĐT . Tập trung vào dữ liệu thay cho các hàm . Chương trình được chia thành các đối tượng độc lập. . Cấu trúc dữ liệu được thiết kế sao cho đặc tả được các đối tượng. . Dữ liệu được che giấu, bao bọc. . Các đối tượng trao đổi với nhau thông qua các hàm . Chương trình được thiết kế theo hướng tiếp cận từ dưới lên
- Ưu điểm của LT HĐT . Loại bỏ được những dư thừa, trùng lặp trong việc xây dựng ứng dụng. . Cài đặt đối tượng giúp xúc tiến việc sử dụng lại, trao đổi giữa các đối tượng với nhau do đó sẽ giảm kích thước, thời gian xử lý, thời gian phát triển hệ thống, tăng năng xuất lao động. . Dễ bảo trì, nâng cấp, giảm lỗi.
- • Biểu diễn 1 đối tượng trong thế giới thực • Mỗi đối tượng được đặc trưng bởi các thuộc tính và các hành vi riêng của nó
- Đặc trưng – Tính trừu tượng Abstraction . Lớp (Class) là một khái niệm trừu tượng, đối tượng là một thể hiện cụ thể của lớp . Ví dụ: ▪ Bản thiết kế của chiếc xe hơi là lớp ▪ Chiếc xe hơi được tạo ra từ bản thiết kế là đối tượng Object Class
- Đặc trưng – Tính trừu tượng Abstraction . Từ những đối tượng giống nhau: có thể trừu tượng hóa thành một lớp. ▪ Loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình. Trừu tượng hóa Class Objects
- Đặc trưng – Tính đóng gói (Encapsulation) . Mỗi lớp được xây dựng để thực hiện một nhóm chức năng đặc trưng của riêng lớp đó ▪ Tất cả mọi thao tác truy xuất vào thành phần dữ liệu từ đối tượng này qua đối tượng khác phải được thực hiện bởi các phương thức (method) của chính đối tượng chứa dữ liệu. ▪ Tính đóng gói cho phép dấu thông tin của đối tượng bằng cách kết hợp thông tin và các phương thức liên quan đến thông tin trong đối tượng.
- Đặc trưng – Tính đóng gói (Encapsulation) ngungXe() chayToi() chayLui() Ồ, tôi lái ngungXe() được! chayToi() chayLui() mucXang kiemTraXang()
- Đặc trưng – Tính kế thừa (Inheritance) . Cho phép xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có. ▪ Lớp đã có gọi là lớp Cha, lớp mới phát sinh gọi là lớp Con ▪ Lớp con kế thừa tất cả các thành phần của lớp Cha, có thể mở rộng các thành phần kế thừa và bổ sung thêm các thành phần mới.
- Tạo lớp . Một lớp dùng định nghĩa một kiểu dữ liệu mới . Cú pháp khai báo lớp class { }
- Tạo lớp . Một lớp dùng định nghĩa một kiểu dữ liệu mới . Cú pháp khai báo lớp: class { } . Ví dụ: khai báo lớp tam giác class TamGiac { }
- Quy tắc đặt tên . Tên lớp nên là một danh từ . Tên lớp có thể gồm nhiều từ, ký tự đầu tiên của mỗi từ nên viết hoa . Tên lớp nên đặt đơn giản, dễ nhớ, và có ý nghĩa . Tên lớp không được trùng với từ khóa của Java . Tên lớp không thể bắt đầu bằng số, nhưng có thể bắt đầu bằng dấu ‘$’ và dấu gạch dưới ‘_’
- Biến thực thể . Mô tả trạng thái của đối tượng . Mỗi đối tượng đều có 1 bản sao của biến thực thể TamGiac t1 a b a=1;b=3;c=4 a=2;b=3;c=4 c a=2;b=4;c=4
- Biến thực thể . Ví dụ: khai báo biến thực thể mô tả thông tin lớp TamGiac class TamGiac{ // a, b, c là 3 biến thực thể mô tả thông tin 1 //đối tượng thuộc lớp tam giác private double a,b,c; }
- Bổ từ truy xuất Cấp độ truy xuất Từ khóa Áp dụng cho Truy xuất tự do public interface package/ lớp con protected class Không thể truy xuất từ bên ngoài private Thành viên của Không có interface/class package chỉ định từ truy xuất (default)
- Bổ từ truy xuất Các thành viên sẽ thấy trong Chỉ định từ truy xuất Class Package Lớp con Ngoài (trong package khác) public yes yes yes yes protected yes yes yes no private yes no no no Không có yes yes no no chỉ định từ truy xuất
- Các lớp đều mặc định kế thừa lớp Object Không phải khai báo kế thừa lớp Object khi khai báo một lớp
- Phương thức khởi tạo (Constructor) . Là phương thức (method) đặc biệt dùng để khởi tạo các biến thành viên của lớp . Tên của phương thức trùng với tên lớp và không có kiểu trả về . Được gọi tự động khi đối tượng được tạo ra . Có hai loại phương thức: ▪ Phương thức mặc định ▪ Phương thức có tham số
- Phương thức khởi tạo . Ví dụ: Khai báo hàm dựng có tham số cho lớp tam giác vừa tạo class TamGiac{ private double a,b,c; public TamGiac(){ //xử lý khởi tạo giá trị mặc định } public TamGiac(int _a,int _b,int_c){ a = _a; b = _b; c = _c; } }
- Phương thức khởi tạo . Đối tượng (ĐT) được khai báo tượng trưng cho lớp . Quá trình tạo ĐT cho lớp gồm hai bước: ▪ Đầu tiên, một biến có kiểu của lớp được khai báo, biến này chưa được định nghĩa là một ĐT. Nó chỉ là biến tham chiếu đến ĐT. ▪ Tiếp theo, một bản sao chép ĐT của lớp trên bộ nhớ được tạo ra và được gán cho biến. Điều này được thực hiện bằng toán tử new . Toán tử new cấp phát bộ nhớ động cho ĐT và trả về tham chiếu tới nó . Tất cả các ĐT của lớp phải được cấp phát động
- Phương thức khởi tạo . Ví dụ: Khai báo đối tượng có kiểu TamGiac TamGiac t; t = new TamGiac(); TamGiac t1; TamGiac t TamGiac t1 t1 = new TamGiac(2,3,4); a=0 b=0 c=0 a=2 b=3 C=4 t t1
- Phương thức khởi tạo . Ví dụ: Truy xuất các thành phần của đối tượng TamGiac t; t = new TamGiac(); t.getA() = 2; t.getB() = 3; t.getC() = 4; System.out.printf(“Tam giac (%d, %d, %d)”, t.getA(), t.getB(), t.getC());
- Phương thức xử lý . Một phương thức được định nghĩa để cài đặt cho một hành động của đối tượng . Cú pháp: BổTừTruyXuất KiểuDữLiệu TamGiac TênPhươngThức(DanhSáchThamSố){ a //xử lý của phương thức b c } Phương thức tinhChuVi() tinhDienTich()
- Phương thức xử lý . Ví dụ: Khai báo phương thức tính chu vi cho lớp tam giác class TamGiac{ // biến thực thể private double a, b, c; // hàm dựng mặc định public TamGiac() {} // phương thức tính chu vi public double tinhChuVi(){ return a + b + c; } }
- Phương thức xử lý . Ví dụ: tính chu vi tam giác TamGiac t = new TamGiac(); t.getA() = 2; t.getB() = 3; t.getC() = 4; System.out.printf(“Tam giac (%f, %f, %f)”, t.getA(), t.getB(), t.getC()); System.out.printf(“Chu vi tam giac: %f”, t.tinhChuVi());
- Truyền tham trị . Được sử dụng cho các kiểu dữ liệu cơ bản, mọi thay đổi diễn ra bên trong phương thức không ảnh hưởng đến giá trị truyền vào Truyền tham chiếu . Thay đổi bên trong phương thức sẽ làm thay đối giá trị của tham số truyền vào . Tham số của phương thức có kiểu dữ liệu là tham chiếu sẽ được truyền theo kiểu tham trị chứ không phải kiểu tham chiếu. Ví dụ: khi phương thức kết thúc, tham chiếu này vẫn trỏ đến cùng đối tượng khi truyền vào
- Truyền tham số cho phương thức . Ví dụ: Truyền tham trị public static void Swap(int a,int b){ int temp = a; a = b; b = temp; } public static void main(String args[]){ int a = 1, b = 2; a=? System.out.printf(“a = %d, b = %d”, a, b); b=? Swap(a,b); System.out.printf(“a = %d, b = %d”, a, b); }
- Truyền tham số cho phương thức . Ví dụ: Truyền tham chiếu class MyClass{ public static void Swap(MyClass a,MyClass b){ public int x; public MyClass(int _x){ MyClass temp = a; a = b; b = temp; x=_x; } } } public static void main(String args[]){ MyClass a = new MyClass(1); MyClass b = new MyClass(2); System.out.printf(“a = %d, b = %d”, a.x, b.x); a=? Swap(a,b); b=? System.out.printf(“a = %d, b = %d”, a.x, b.x); }
- Truyền tham số cho phương thức . Ví dụ: truyền tham chiếu public static void Swap(MyClass a,MyClass b){class MyClass{ MyClass temp = new MyClass(a); public int x; public MyClass(int _x){ a.x = b.x; b.x = temp.x; x=_x; } } } public static void main(String args[]){ MyClass a = new MyClass(1); MyClass b = new MyClass(2); System.out.printf(“a = %d, b = %d”, a.x, b.x); Swap(a,b); a=? System.out.printf(“a = %d, b = %d”, a.x, b.x); b=? }
- Phương thức có tham số thay đổi . Tham số thay đổi cho phép gọi phương thức với số tham số khác nhau. . Cú pháp KiểuDữLiệu TênPhươngThức (KiểuDữLiệu TênThamSố) { // các lệnh }
- Phương thức có tham số thay đổi . Ví dụ: public static void Test(int a){ for (int i : a) System.out.println(i); } public static void main(String args[]){ Test(1, 2, 3, 4, 5, 6); Test(10, 20); }
- Các lớp trong Java tồn tại trong một hệ thống thứ bậc, gọi là cây thừa kế Các lớp ở bậc trên một lớp đã cho trong một hệ thống thứ bậc là lớp cha (superclass) của lớp đó Lớp cụ thể là một lớp con (subclass) của tất cả các lớp bậc cao hơn 90
- Lớp con có thể truy cập các biến và phương thức công khai (public) của lớp cha Lớp con có thể truy cập các biến và phương thức được bảo vệ (protected) của lớp cha Các hàm tạo là đặc biệt, chúng không được thừa kế Lớp con không thể truy cập thành viên private của lớp cha Sử dụng phương thức để truy cập thành viên private của lớp 91
- 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 để truy cập đến hàm tạo của lớp cha 92
- Ngăn cản ghi đè hàm Ngăn cản thừa kế 93
- Java package là một nhóm các lớp và giao diện có liên hệ với nhau được tổ chức thành một đơn vị để quản lý. Package có thể do người dùng tạo ra hoặc do Java tạo sẵn. Lệnh package, nếu sử dụng, phải đặt ở đầu chương trình Lệnh import được dùng để import một hoặc nhiều lớp từ package vào chương trình Chỉ định từ truy xuất điều khiển việc truy xuất các lớp và sự nhìn thấy các thành viên của lớp Chỉ định từ truy xuất cho biến và phương thức là các từ khóa được dùng để xác định các biến và phương thức cần được khai báo để điều khiển việc truy xuất từ người dùng
- Package được định nghĩa trước Bạn có thể xem nội dung của các package Bằng WINZAR/ WINZIP import java.util.*; import java.io.*; class A { }
- Các class mà dự định sẽ được sử dụng bên ngoài package sẽ được khai báo là public. Các package khác nhau có thể có các class trùng tên với nhau. Nếu các package khác nhau mà có các class có tên trùng nhau thì khi sử dụng bắt buộc phải import đầy đủ tên package và tên class. 96
- Có 4 kiểu truy cập vào package private protected public default 97
- Trong cùng Trong cùng Trong sub- Package Từ khóa class package package khác private Có Không Không Không default Có Có Không Không protected Có Có Có Không public Có Có Có Có 98
- Truy cập các thành phần trong package private: Chỉ có thể default: Được truy cập được truy cập bởi bởi các class chính class đó. cùng package. protected: Được truy public: Được truy cập cập bởi các class cùng bởi tất cả các class ở trong package và các cùng package hay class là sub-class khác package. của class này. 99
- Package được định nghĩa trước ● Tạo package ● Sử dụng package package myPackage; import myPackage.A; class A class B { . { . } void method3() { A obj = new A(); } }
- Cú pháp: . import tên_package.tên_class Ví dụ: . import mypack.MyClass; . import mypack.*; Ký hiệu *: là import tất cả các class trong package mypack. 101
- Tên Package Mô tả Chứa các class như Integer, String, java.lang System và được tự động import vào mỗi chương trình Java. Các các Java collections như List, Set, Map java.util Chứa các class liên quan đến việc nhập, java.io xuất dữ liệu như File, Reader, Writer java.awt và Chứa các class liên quan đến việc trình bày java.swing giao diện đồ họa và xử lý sự kiện. . . . 102
- Java cung cấp 5 từ khoá sau để xử lý các ngoại lệ: try catch throw throws finally 104
- try{ // đoạn mã có khả năng gây ra ngoại lệ } catch(Exception e1) { // Xử lý } catch(Exception e2) { // Xử lý } catch(Exception eN) { // Xử lý } finally { // luôn được thực hiện cho dù ngoại lệ có xảy ra hay không. } 105
- NullPointerException ArrayIndexOfBoundException ArthmeticException FileNotFoundException EOFException IllegalArgumentException 106
- • Class Throwable xử lý lỗi và ngoại lệ (Error, Exception). • Tất cả các class dưới đây đều nằm trong gói java.lang, ngoại trừ class IOException là nằm trong gói java.io ClassNotFoundException Throwable CloneNotSupportedException IllegalAccessException Exception InstantialtionException ArithmeticException IOException * IllegalArgumentException RuntimeException IndexOutOfBoundsException NullPointerException LinkageError Error More class ThreadDeath VitualMachineError 107
- Ngoại lệ ‘unchecked’: • Là các ngoại lệ không cần phải ‘catch’ khi viết mã • Là các class Error, RuntimeException và các lớp con của chúng Ngoại lệ ‘checked’: • Là các ngoại lệ phải được ‘catch’ khi viết mã • Là các class còn lại 108
- Một số ngoại lệ ‘checked’: • ClassNotFoundException • IOException • FileNotFoundException • EOFException Một số ngoại lệ ‘unchecked’ • ArithmeticException • IllegalArgumentException • IndexOutOfBoundException • NullPointerException • InputMismatchException 109
- Từ khóa throws được sử dụng trong method dùng để đề xuất các ngoại lệ có thể xảy ra trong method đó. Có những method sử dụng một số lệnh mà các lệnh đó có thể xảy ra ngoại lệ ‘checked’ nên chúng ta bắt buộc phải xử lý ngoại lệ đó. Ví dụ khi xử lý các lệnh thao tác với file, phải xử lý ngoại lệ ‘checked’ FileNotFoundException. Tất cả các ngoại lệ được khai báo bởi throws đều phải được xử lý, nếu không có đủ sẽ bị thông báo lỗi. 110
- Dùng cách throws trong phương thức main 113
- bằng cách kế thừa class Exception của Java: 114