ths. lương trần hy hiến khoa công nghệ thông tin trường ... · quy ước đặt tên...
TRANSCRIPT
Ths. Lương Trần Hy Hiến
Khoa Công Nghệ Thông Tin
Trường Đại học Sư phạm TP.HCM1
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:▪ 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: [email protected]
Website môn học: https://ptuddd.weebly.com
2
Slide bài giảng được soạn từ nhiều nguồn: Bài giảng (bao gồm cả ví dụ) của các giảng viên trong
nước và quốc tế.
https://developer.android.com/training/index.html
https://developers.google.com/training/android/
Các khóa học về Thiết kế ứng dụng Di động, Lập trình
Di động trên Udemy, Udacity, …
3
Lect 01 : Java cơ bản
Lect 02 : Tổng quan Android
Lect 03 : Layout và các điều khiển cơ bản
Lect 04 : Intents
Lect 05 : RecycleView
Lect 06 : Preferences
Lect 07 : SQLite
Lect 08 : Content Provider
Lect 09 : Background Task
4
Lect 10 : Fragment
Lect 11 : FireBase
Lect 12 : Place/Location
Lect 13 : Publish App
5
6
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)
7
8
Kiểu dữ liệu
Kiểu cơ sở
(Primitive data types)
Kiểu tham chiếu
(Reference data types)
Kiểu dữ
liệu
Kích
thước
Miền giá trị
byte 8 bit -27 .. 27-1
short 16 bit -215 .. 215-1
int 32 bit -231..231-1
long 64 bit -263..263-1
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
Kiểu dữ
liệu
Mô tả
Array Kiểu mảng
Class Kiểu lớp đối tượng
Interface Kiểu giao diện lập
trình
String Chuỗi ký tự
9
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
float
Chuyển đổi kiểu ngầm địnhChuyển đổi kiểu tường minh
10
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ểnint 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ơnlong l=1000;
int i=(int)l;
11
Khai báo biến Cú pháp: KiểuDữLiệu TênBiến;
Ví dụ: int tuoi;
String ten;
double luong;
10
soNguyenA
0FFFA
Tên biến
Giá trị
Địa chỉ12
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 = <giá_trị>;
▪ Ví dụ:▪ final double PI=3.14;
13
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
14
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”;
s
H E L L O
15
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
16
equals
length
charAt
compareTo
indexOf
lastIndexOf
concat
Substring
…
https://docs.oracle.com/javase/tutorial/java/data/strings.html 17
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'
18
Các phương thức xử lý trên kiểu String
Vấn đề:
Cần có các giá trị để phục vụ cho
việc hiển thị và tính toán
Ví dụ:
• Tính chiều dài của chuỗi s
• Nối chuỗi s1 vào chuỗi s
• Lấy một ký tự tại vị trí index trong
chuỗi s
• So sánh hai chuỗi s1 và s2
• Tìm vị trí xuất hiện đầu tiên của
chuỗi s2 trong chuỗi s
Giải quyết:
Sử dụng hàm chuỗi trong thư viện
hàm của Java
String s = “Happy "; String s1 = “New Year”;// Tính chiều dài chuỗi
int len = s.length(); // 6// Nối chuỗi s1 vào chuỗi s: tương đương s
+ s1s.concat(s1); // Happy New Year// Lấy một ký tự tại vị trí số 8 của s
char result = s.charAt(8); // e// So sánh hai chuỗi s1 và s2
String s2 = “New Year”; s2.compareTo(s1); // 0 (trả về 0, <0 hoặc >0)// Tìm vị trí xuất hiện đầu tiên của chuỗi s2
trong chuỗi s
s.indexOf(s2); // 6 (vị trí đầu tiên)
19
Các phương thức xử lý trên kiểu String
Vấn đề:
Cần có các giá trị để phục vụ cho
việc hiển thị và tính toán
Ví dụ:
• Tìm vị trí xuất hiện cuối cùng của
chuỗi s2 trong chuỗi s
• Thay thế chuỗi s1 bằng chuỗi s2
trong chuỗi s
• Loại bỏ các khoảng trắng thừa
của chuỗi s3
• Tạo chuỗi con s4 từ chuỗi s từ vị
trí số 6
Giải quyết:
Sử dụng hàm chuỗi trong thư
viện hàm của Java
String s = “Happy New Year"; String s1 = “Happy”;String s2 = “New”;// Tìm vị trí xuất hiện cuối cùng của chuỗi s2 trong chuỗi ss.lastIndexOf(s2); // 6 (trả về -1 nếu không tìm thấy)// Thay thế chuỗi s1 bằng chuỗi s2 trong chuỗi ss.replace(s1, s2); // New New Year// Loại bỏ các khoảng trắng thừa của chuỗi s3String s3 = “ Hello Bi ”;s3.trim();// Hello Bi// Tạo chuỗi con s4 từ chuỗi s từ vị trí số 6String s4 = s.substring(6); // New Year
20
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ứcappend()
insert()
delete()
reverse()
// Khởi tạoStringBuilder()
StringBuilder(int capacity)
StringBuilder(String s)
http://developer.android.com/intl/vi/reference/java/lang/StringBuilder.html21
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ượngStringBuilder có thể lưu giữ được 16 ký tự
▪ StringBuilder(int capacity): Tạo ra một đốitượng StringBuilder có thể lưu giữ được capacity ký tự
▪ StringBuilder(String s): Tạo một đối tượngStringBuilder lấy thông tin từ chuỗi s
22
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
23
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
24
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
25
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
26
Lớp StringTokenizer
Chia chuỗi thành các chuỗi con
// Khởi tạoStringTokenizer(String str)
StringTokenizer(String str, String delim)
StringTokenizer(String str, String delim,
boolean returnDelims)
// Phương thứccountTokens()
hasMoreTokens()
nextToken()
hasMoreElements()
nextElement()
27
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âydự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 tokenizercho một chuỗi cụ thể str. Nếu returnDelims = true thì mỗidelim đượ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ữacác token
28
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());
29
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<Object>
nextElement(): Tương tự như (**), tuy nhiên giá trị trả về là Object
30
31
32
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[];
33
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];
34
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ặcKiể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};
35
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)
Lấy chiều dài của mảng: thuộc tính lengthTênMảng.length
5 8 1 0 3 2 7 6
0 1 2 3 4 5 6 7
Mảng a
Chỉ sốa[3] ?
a.length ?
36
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ảngint[] a = {1,2,3,4,5};
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
37
Mảng String
Ví dụ: Duyệt và xuất mảng
String[] list = { “JAVA”, “C#”, “PHP”};
for (int i = 0; i < list.length; i++)
System.out.println(list[i]);
list
J A V A
C #
P H P
38
// 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ênArrays.sort(array);// So sánh hai mảng số nguyên array1 và arrayarray1.equals(array);// Gán giá trị cho các phần tử trong mảng array1Arrays.fill(array1, 10); // 10, 10, 10, 10, 10 // Sao chép mảng array1 sang array2int[] arr2 = Arrays.copyOf(arr1, 6); // 10 10 10 10 10 0
39
40
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...
41
<<interface>>
Collection
<<interface>>
Set
<<interface>>
List
<<interface>>
Map
<<interface>>
SortedMap
<<interface>>
SortedSet
42
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.
43
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);
44
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.
45
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.
46
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();
47
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() );
}
48
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);
...
49
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ó.
50
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á.
51
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...
52
ListLinkedList
ArrayList
Map LinkedHashMap
SortedMap
HashMap
TreeMap
Set
HashSet
LinkedHashSet
SortedSet TreeSet
53
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).
54
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).
55
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()
56
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()
57
/*Tạo mảng*/ArrayList<String> obj = new ArrayList<String>();
/*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);
58
59
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
60
Đặ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
61
Ư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.
62
• 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ó
63
Đặ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
Class
Object
64
Đặ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.
ClassObjects
Trừu tượng hóa
65
Đặ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.
66
Đặc trưng – Tính đóng gói (Encapsulation)
ngungXe()
chayToi()
chayLui()
kiemTraXang()mucXang
ngungXe()
chayToi()
chayLui()
Ồ, tôi lái
được!
67
Đặ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.
68
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ênLớp>
{
...
}
69
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ênLớp>
{
...
}
Ví dụ: khai báo lớp tam giácclass TamGiac
{
…
}
70
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
a
b
c
t1
a=2;b=3;c=4
a=1;b=3;c=4
a=2;b=4;c=471
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;
}
72
Bổ từ truy xuất
public
protected
private
Không có
chỉ định từ
truy xuất
(default)
interface
class
Thành viên của
interface/class
Truy xuất tự do
package/ lớp con
Không thể truy xuất
từ bên ngoài
package
Cấp độ truy xuất Áp dụng choTừ khóa
73
Bổ từ truy xuấtChỉ định từ
truy xuất
Các thành viên sẽ thấy trong
Class Package Lớp con
(trong package khác)
Ngoài
public yes yes yes yes
protected yes yes yes no
private yes no no no
Không có
chỉ định từ
truy xuất
yes yes no no
74
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
75
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ố
76
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;
}
}
77
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
78
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;
t1 = new TamGiac(2,3,4);
t
TamGiac t
a=0 b=0 c=0
t1
TamGiac t1
a=2 b=3 C=4
79
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.setA() = 2;
t.setB() = 3;
t.setC() = 4;
System.out.printf(“Tam giac (%d, %d, %d)”,
t.getA(), t.getB(), t.getC());
80
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
TênPhươngThức(DanhSáchThamSố){
//xử lý của phương thức
}
TamGiac
abc
tinhChuVi()tinhDienTich()
Phương thức
81
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;
}
}
82
Phương thức xử lý
Ví dụ: tính chu vi tam giác
TamGiac t = new TamGiac();
t.setA() = 2;
t.setB() = 3;
t.setC() = 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());
83
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
84
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;
System.out.printf(“a = %d, b = %d”, a, b);
Swap(a,b);
System.out.printf(“a = %d, b = %d”, a, b);
}
a=?
b=?
85
Truyền tham số cho phương thức Ví dụ: Truyền tham chiếu
public static void Swap(MyClass a,MyClass b){
MyClass temp = a; a = b; b = temp;
}
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);
System.out.printf(“a = %d, b = %d”, a.x, b.x);
}
a=?
b=?
class MyClass{
public int x;
public MyClass(int _x){
x=_x;
}
}
86
Truyền tham số cho phương thức Ví dụ: truyền tham chiếu
public static void Swap(MyClass a,MyClass b){
MyClass temp = new MyClass(a);
a.x = b.x; b.x = temp.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);
System.out.printf(“a = %d, b = %d”, a.x, b.x);
}
a=?
b=?
class MyClass{
public int x;
public MyClass(int _x){
x=_x;
}
}
87
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
}
88
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);
}
89
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
94
Package được định nghĩa trước
import java.util.*;
import java.io.*;
class A
{ …………
}
Bạn có thể xem nội
dung của các package
Bằng WINZAR/ WINZIP
95
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
97
Có 4 kiểu truy cập
vào package
private protected public default
98
Từ khóaTrong cùng
class
Trong cùng
package
Trong sub-
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ó
Truy cập các thành phần trong package
99
private: Chỉ có thể
được truy cập bởi
chính class đó.
default: Được truy cập
bởi các class
cùng package.
protected: Được truy
cập bởi các class cùng
trong package và các
class là sub-class
của class này.
public: Được truy cập
bởi tất cả các class ở
cùng package hay
khác package.
Package được định nghĩa trước
● Tạo packagepackage myPackage;
class A
{ …….
}
● Sử dụng packageimport myPackage.A;
class B
{ …….
void method3()
{ A obj = new A();
……..
}
}
100
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
102
Tên Package Mô tả
java.lang
Chứa các class như Integer, String,
System… và được tự động import vào mỗi
chương trình Java.
java.utilCác các Java collections như List, Set, Map
…
java.ioChứa các class liên quan đến việc nhập,
xuất dữ liệu như File, Reader, Writer…
java.awt và
java.swing
Chứa các class liên quan đến việc trình bày
giao diện đồ họa và xử lý sự kiện.
. . .
103
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
107
• 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
CloneNotSupportedException
IllegalAccessException
InstantialtionException
IOException *
RuntimeException
LinkageError
ThreadDeath
VitualMachineError
ArithmeticException
IllegalArgumentException
IndexOutOfBoundsException
NullPointerException
More class …
Exception
Error
Throwable
108
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
109
Một số ngoại lệ ‘checked’:
• ClassNotFoundException
• IOException
• FileNotFoundException
• EOFException
Một số ngoại lệ ‘unchecked’
• ArithmeticException
• IllegalArgumentException
• IndexOutOfBoundException
• NullPointerException
• InputMismatchException
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
111
112
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
115
116