JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao JAVA CORE :Lập trình Java từ cơ bản đến nâng cao
Trang 1Java Core Tác giả: Nguyễn Hữu Toàn (http://waystudy.com/)
Contents
Chương I: Giới thiệu và cài đặt Java 5
1 Giới thiệu 5
2 Cài đặt và cấu hình trong window 5
3 Chương trình ‘Hello world’ 6
Chương II: Kiểu biến, toán tử, lệnh điều khiển trong Java 10
1 Kiểu biến 10
2 Các toán tử 14
2.1 Toán tử toán học 14
2.2 Toán từ quan hệ 15
2.3 Toán tử trên bit 15
2.4 Toán tử logic 16
2.5 Toán tử gán 16
3 Các lệnh điều khiển 16
Chương III: Java I/O (input/output) 21
1 Định nghĩa 21
2 Input và output dữ liệu từ bàn phím 21
3 Ghi nội dung ra file 22
4 Đọc nội dung từ file 22
Chương IV: Hướng đối tượng trong java 23
1 Định nghĩa 23
2 Phạm vi của đối tượng 23
3 Các khái niệm trong hướng đối tượng 25
4 Tính kế thừa “inheritance” 26
5 Tính đa hình “polimorphism” 26
6 Tính trừu tượng (abstraction) 27
7 Interface 28
8 Tính đóng gói (encapsulation) 28
9 Constructor 29
Trang 210 Con trỏ this 31
11 Từ khóa super 34
12 Từ khóa final 36
Chương V: Collection trong java 38
1 Giới thiệu 38
2 Lược đồ diagram tổng quát 38
3 List 39
3.1 ArrayList 39
3.2 LinkedList 41
4 Set 41
4.1 HashSet 41
4.2 LinkedHashSet 42
4.3 TreeSet 42
5 Map 43
5.1 HashMap 43
5.2 LinkedHashMap 44
5.3 TreeMap 44
5.4 HashTable 45
Chuong VI: Generic trong Java 46
1 Giới thiệu 46
2 Các kiểu generic 46
2.1 Generic kiểu class 46
2.2 Generic kiểu phương thức 47
2.3 Generic kiểu wildcard (?) 47
Chương VII: Đa tiến trình trong Java 48
1 Khái niệm 48
2 Trạng thái Multithread 49
3 Tạo thread 50
4 Sleep thread (tạm dừng thread) 51
5 Start thread hai l n 51
6 Phương thức Join() 52
Chương VIII: Xử lý ngoại lệ trong Java 52
1 Giới thiệu 52
2 Lược đồ diagram tổng quát 53
3 Checked và unchecked của exception 53
Trang 34 Khối try catch 54
5 Mutiple khối catch 54
6 Nested try 55
7 Khối finally 56
8 Throw exception 58
9 Throws exception 59
10 So sánh throw và throws 60
Chương IX: Đối tượng String 61
1 Khái niệm String 61
2 Tạo đối tượng String 61
3 StringBuffer 62
4 StringBuilder 62
5 So sánh String và Stringbuffer 63
6 So sánh StringBuffer và StringBuilder 64
Chương X: Tham biến, tham trị 64
1 Tham biến 64
2 Tham trị 64
3 Java là tham biến hay tham trị (pass-by-value or pass-by-reference) 64
Chương XI: Phương thức Hashcode và Equal 68
1 Khái niệm 68
2 Phép toán so sánh ‘==’ 68
3 Phép toán so sánh ‘equal()’ 69
4 Tại sao override phương thức ‘equal()’ 69
5 Tại sao override phương thức equal() thì override phương thức hascode()? 70
Chương XII: Cách quản lý vùng nhớ, gom rác trong Java 70
1 Garbage Collection 70
2 Static 73
3 Stack và Heap 75
Chương XIV: Deep và Shallow copping trong Java 75
1 Showllow copying 75
2 Deep copying 76
Chương XV: AOP trong java 77
Chương XVI: Reflection trong java 77
1 Khái niệm 77
2 Reflection của class 78
Trang 43 Reflection của Fields 78
4 Reflection của method 78
5 Reflection của Constructor 78
6 Reflection của annotation 78
Chương XVII: Một số mẫu Design pattern trong Java 78
1 Singleton 78
1.1 Khái niệm 78
1.2 Eager initialization 78
1.3 Static block initialization 79
1.4 Lazy Initialzation 79
1.5 Thread safe singleton 80
1.6 Enum singleton 80
2 Prototype 80
2.1 Khái niệm 80
2.2 Ví dụ tạo prototype 80
2.3 Ví dụ sử dụng prototype 81
3 Factory 81
3.1 Khái niệm 81
3.2 Ví dụ tạo và sử dụng 82
3.3 Thuận lợi 83
4 Abstract factory 83
4.1 khái niệm 84
4.2 Ví dụ tạo và sử dụng 84
4.3 Thuận lợi 87
Chương XVIII: Regular Expressions trong Java 87
1 Khái niệm 87
2 Character classes 87
3 Predefined Character Classes 89
4 Quantifiers 90
5 Capturing groups 91
6 Boundary Matchers 91
7 Ví dụ tổng hợp 92
Chương XIX: Các đặc điểm mới trong Java 8 92
1 Default trong interface 92
2 Lamba Expression 92
Trang 53 Stream API 94
4 Date/Time API 94
Chương I: Giới thiệu và cài đặt Java
1 Giới thiệu
- Java được phát hành vào năm 1995 bởi hảng Sun
- Chương trình viết bằng mã Java sau đó được biên dịch thành mã máy ảo (bytecode) Sau đó
máy ảo JVM xẽ làm việc trên các mã bytecode này Vì vậy chương trình java xẽ chạy được
trên các thiết bị có cài đặt máy ảo JVM
2 Cài đặt và cấu hình trong window
Link download JDK 1.8:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Link download eclipse (IDE phát triển chương trình java): https://eclipse.org/downloads/
Sau khi download và cài đặt JDK 1.8 chúng ta tạo biến môi trường cho Java Như hình sau
Trang 63 Chương trình ‘Hello world’
Trang 10Chương II: Kiểu biến, toán tử, lệnh điều khiển trong Java
1 Kiểu biến
1.1 Kiểu primitive
- Giá trị mặc định như sau:
Trang 11public class ClassInitializer {
static boolean bool;
static byte by;
- Kết quả Output của đoạn code trên như sau:
Trang 12str = null
1.2 Kiểu Object
- Boolean, Integer, Byte, Short, Character, Long, Float, Double, Hex, Number, String
- Hoặc kiểu người dùng tự định nghĩa như đối tượng học sinh, sinh viên, con ngườiầ
- Xem ví dụ code bên dưới: Integer
public class ClassInteger {
public static void main(String[] args) {
Integer intObj1 = new Integer(10);
Integer intObj2 = new Integer("10");
- Xem ví dụ bên dưới: String
public class ClassString {
public static void main(String[] a) {
String s1 = "1 " + "2"; String s2 = s1 + " = 3"; System.out.println(s1);
System.out.println(s2);
} }
Output :
1 2
1 2 = 3
1.3 Kiểu Enum
- Enum chứa danh sách những hằng số (constant)
- Ví dụ đơn giản về enum
enum Week {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturaday, Sunday }
public class ClassEnum {
public static void main(String args[]) {
Trang 13Week aWeekDay;
aWeekDay = Week.Monday;
// Output an enum value
System.out.println("Value of aWeekDay: " + aWeekDay);
System.out.println();
} }
Output: Value of aWeekDay: Monday
- Chỉ định giá trị cho Enum Xem ví dụ sau
public class ClassEnum {
public enum Company {
EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25);
private int value;
private Company(int value) {
this.value = value;
} }
public static void main(String[] args) {
for (Company cName : Company.values()) {
System.out.println("Company Value: " + cName.value + " - Comapny Name: " + cName);
} }
}
Ouput:
Company Value: 30 - Comapny Name: EBAY
Company Value: 10 - Comapny Name: PAYPAL
Company Value: 15 - Comapny Name: GOOGLE
Company Value: 20 - Comapny Name: YAHOO
Company Value: 25 - Comapny Name: ATT
- Những thuận lợi của Enum là gì?
1 Nó là kiểu type-safe (tạm dịch là kiểu an toàn) Vì nó không cho phép thay đổi, khi
bạn thay đổi xẽ phát sinh lỗi như code bên dưới
public enum Currency { PENNY, NICKLE, DIME, QUARTER };
Currency coin = Currency.PENNY;
coin = 1; //compilation error (phát sinh lỗi tại đây)
Trang 142 Enum là một kiểu reference giống như class và interface mà bạn có thể định nghĩa contructor, variables, và phương thức
3 Có thể dịnh nghĩa giá trị cho enum trong thời gian tạo, xem ví dụ bên dưới
public enum Currency {PENNY(1), NICKLE(5), DIME(10), QUARTER(25)};
- Khi nào sử dụng enum?
1 Khi bạn muốn định nghĩa sách hang số chẳng hạn như số ngày trong tu n
2 Sử dụng trong switch (switch xẽ học trong ph n khác)
Trang 150000 0000
A = 0001 0100
B = 0000 1011 -
0001 1111
A = 0001 0100
B = 0000 1011 -
Trang 16} hoặc
if (booleanExpression) { statement (s)
} else { statement (s) }
o Ví dụ
Trang 17public class MainClass {
public static void main(String[] args) {
} 3.3 Lệnh switch
o Cú pháp switch (expression) { case value_1 :
statement (s);
break;
case value_2 : statement (s);
break;
case value_n : statement (s);
public class MainClass {
public static void main(String[] args) {
int i = 1;
switch (i) { case 1:
Trang 18System.out.println("You did not enter a valid value."); }
} }
Output: one
3.4 Lệnh while
o cú pháp while (booleanExpression) { statement (s)
}
o Ví dụ
public class MainClass {
public static void main(String[] args) { int i = 0;
while (i < 3) { System.out.println(i);
i++;
} } }
Output: 0, 1, 2 3.5 Do-while
o Cú pháp
do { statement (s) } while (booleanExpression);
o Ví dụ
public class MainClass {
public static void main(String[] args) {
Output: 0, 1,2
public class MainClass {
Trang 19public static void main(String[] args) {
Output: 4 Các bạn tự so sánh sự khác nhau giữa while va do while 3.6 Lênh for
o Cú pháp for ( init ; booleanExpression ; update ) { statement (s)
}
o Ví dụ
public class MainClass {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println(i + " ");
} }
} Output: 0, 1,2 ,3,4
3.7 Lệnh for earch
o Cú pháp for(type itr-var : iterableObj) statement-block
o Ví dụ
public class MainClass {
public static void main(String args[]) {
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int x : nums) {
System.out.print(x + " ");
x = x * 10; // no effect on nums }
System.out.println();
Trang 20for (int x : nums)
System.out.print(x + " ");
System.out.println();
} }
public class MainClass {
public static void main(String[] args) {
} }
Output: 0, 1, 2, 3 3.9 Lệnh continue
o Cú pháp Dùng để bỏ qua những dòng lệnh bênh dưới nó trong vòng lặp while, do while, for
o Ví dụ
public class MainClass {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if (i == 5) {
continue;
} System.out.println(i);
} }
}
Trang 21Output: 1 2 3 4 6 7 8 9 10 (không in ra giá trị 5)
Chương III: Java I/O (input/output)
Trang 22Console c = System.console();// gọi đối tương console System.out.println("Enter your name: ");
String n = c.readLine();// đọc một dòng đơn System.out.println("Welcome " + n);// cú pháp in ra console }
}
Output:
Enter your name: Nguyen Huu Toan
Nguyen Huu Toan
3 Ghi nội dung ra file
import java.io.*;
class Test {
public static void main(String args[]) throws Exception {
FileOutputStream fout = new FileOutputStream("f1.txt");
BufferedOutputStream bout = new BufferedOutputStream(fout);
String s = "Nguyen Huu Toan";
Chương trình xẽ đọc chuỗi "Nguyen Huu toan" và ghi ra file f1.txt các bạn chạy test thử
4 Đọc nội dung từ file
import java.io.*;
class SimpleRead {
public static void main(String args[]) {
try {
FileInputStream fin = new FileInputStream("f1.txt");
BufferedInputStream bin = new BufferedInputStream(fin);
int i;
while ((i = bin.read()) != -1) {
System.out.println((char) i);
} bin.close();
fin.close();
} catch (Exception e) {
System.out.println(e);
Trang 23} }
Trang 24void show(){
System.out.println(A3);//
} }
class B extends A{
void show(){
System.out.println(A3);//
} }
2.3 Protected
- Đối tượng được khai báo với từ khóa ‘protected’ thì sử dụng được cho lớp đó Lớp con kế
thửa cũng truy xuất được đối tượng này Các lớp khác trong cùng package truy xuất được đối tượng này
Trang 25void showB() {
System.out.println(A1);//truy xuất được A1}
} -
2.5 Bảng tổng hợp
Trang 263.4 Polymorphism (tính đa hình)
- Khi một task (task: chỉ định hay công việc) thực thi bởi nhiều cách khác nhau thì gọi là tính
đa hình
3.5 Abstraction (tính trừu tượng)
- n chi tiết nội bộ và thể hiện chức năng được gọi là ‘abstraction’ Trong java sử dụng class abstract và interface để đạt được abstraction
3.6 Encapsulate (tính đóng gói)
- Đóng gói code và dữ liệu lại cùng nhau thành 1 đơn vị duy nhất được gọi là tính đóng gói
- Trong đóng gói: các biến được n đi từ 1 class khác
class B extends A{
} Class B kế thừa class A, và bây giờ class B có thể truy xuất nhung đối tượng của class A
5 Tính đa hình “polimorphism”
- Ví dụ
package qlhs.com;
public class Hocsinh {
public void chieucao(){
System.out.println("chieu cao trung binh:" + 1.5);
}
public void diemtotnghiep(int toan, int van, int anh){
System.out.println(toan + van + anh);
}
public static void main(String[] args) {
// TODO Auto-generated method stub }
}
Trang 27class TieuHoc extends Hocsinh{
@Override
public void chieucao(){
System.out.println("chieu cao trung binh:" + 1.0);
}
public void diemtotnghiep(int toan, int van){
System.out.println(toan + van);
} }
class Trunghoc extends Hocsinh{
@Override
public void chieucao(){
System.out.println("chieu cao trung binh:" + 1.6);
}
public void diemtotnghiep(int toan, int van, int anh, int su){
System.out.println(toan + van + anh + su);
} }
Nhận xét: đối tượng ‘chieucao’, ‘diemtotnghiep’ của lớp học sinh xẽ thay đổi tùy cấp
học => cùng đối tượng ‘chieucao’, ‘diemtotnghiep’ của lớp hocsinh nhưng xẽ có trạng thái khác nhau đươc gọi là tính đa hình
o Override: là phương thức của lớp cha và lớp con cùng tên, cùng số lượng và kiểu tham số Cụ thể giống phương thức ‘chieucao’
o Overload: là phương thức của lớp cha và lớp con cùng tên, khác số lượng và kiểu tham số Cụ thể giống phương thức ‘diemtotnghiep’
6 Tính trừu tượng (abstraction)
- Cú pháp:
o Dùng từ khóa abstract trước class
o Phương thức trong lớp abstract có thể định nghĩa hoặc không (đạt mức 0->100% abstraction (mức trừu tượng))
o Các đối tượng khai báo trong lớp abstract có thể non-public
- ví dụ:
package hinhhoc.com;
public abstract class Hinhhoc {
public abstract float dientich();
public boolean sosanhdientich(float s1, float s2){
if (s1 > s2)
return true;
return false;
}
Trang 28public static void main(String[] args) {
// TODO Auto-generated method stub }
Nhận xét: khi nào dùng lớp abstract?
o Dùng khi chúng ta thấy nhiều đối tượng có nhiểu thuộc tính chung Ví dụ trên tính diện tích hình vuông, hình tam giác, hình trònầ đều có tính diện tích, và đều
có so sánh diện tích giữa 2 hình => lúc đó ta dùng lớp abstract để định nghĩa những thuộc tính chung đó
o Dùng khi đối tượng chúng ta khai báo trong class abstract có thể non-public
o Nếu trong tương lai có thể thêm phương thức
o Một class có thể implement nhiều interface
o Các khai báo trong interface phải là public
- Ví dụ:
public interface DongCo {
public int congxuatdien();
public int tinhnhiettoara();
}
public interface Design {
public List<Integer> kichthuocbanh();
public float chuvixe();
}
public class Xehoi implements Design, DongCo {
public int congxuatdien() {