Giới thiệu
Tài liệu này sẽ hướng dẫn với các bạn các chức năng cơ bản của Java. Các chức năng này sẽ được trình bày vắn tắt cùng với các ví dụ minh họa nhỏ sẽ giúp cho các bạn dể dàng tiếp cận với Java hơn.
Tạo dự án (project) Java mới
Trước hết, chúng ta tạo một project mới để sử dụng trong bài này.
Đặt tên và thiết lập cho project, giống hình minh họa bên dưới
Xong chọn Finish, kết quả giống hình bên dưới
Chú ý: Để nhập và lưu được các ngôn ngữ khác tiếng Anh (ví dụ: tiếng Việt có dấu) trong project, chúng ta cần chuyển mã hóa sang dạng UTF8.
Nhấn chuột phải vào tên của project (trong ví dụ của chúng ta là Ex1), chọn Properties.
Thiết lập theo thứ tự giống như hình minh họa.
Các kiếu dữ liệu nguyên thủy (primitive data types).
Có 8 loại dữ liệu nguyên thủy trong Java
- 4 kiểu dành cho số nguyên: byte, short, int, long.
- 2 kiểu dành cho số thực: float, double.
- Kiểu ký tự: char.
- Kiểu boolean: chỉ có 2 giá trị là true, false.
Kiểu dữ liệu | Ghi chú | Số bit | Giá trị nhỏ nhất | Giá trị lớn nhất |
---|---|---|---|---|
byte | Số nguyên 1 byte | 8 | -128 (-2^7) | 127 (2^7-1) |
short | Số nguyên 2 byte | 16 | -32,768 (-2^15) | 32,767 (2^15 -1) |
int | Số nguyên 4 byte | 32 | – 2,147,483,648 (-2^31) | 2,147,483,647 (2^31 -1) |
long | Số nguyên 8 byte | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807 (2^63 -1) |
float | Số thực 4 byte | 32 | -3.4028235 x 10^38 | 3.4028235 x 10^38 |
double | Số thực 8 byte | 64 | -1.7976931348623157 x 10^308 | 1.7976931348623157 x 10^308 |
boolean | Kiểu logic | false | true | |
char | Kiểu ký tự | 16 | ‘\u0000’ (0) | ‘\uffff’ (65,535) |
Biến (variable)
Nhấn chuột phải vào mục src, nằm dưới project Ex1, chọn New/Package
Đặt tên cho package là: com.code5s.variable
Nhấn chuột phải vào tên của package: com.code5s.variable, chọn New/Class
Đặt tên cho class là: VarEx1, chú ý đến các thiết lập giống như hình
Class VarEx1 đã được tạo ra
Thay đổi code của class VarEx1:
package com.code5s.variable; public class VarEx1 { public static void main(String[] args) { // Khai báo một biến, có kiểu là số tự nhiên 32 bit. int firstNumber ; // Gán giá trị cho firstNumber firstNumber = 10; System.out.println("First Number ="+ firstNumber); // Khai báo một số thực 32 bit (float) // Số này được gán giá trị 10.2 // Chữ f ở cuối giúp java hiểu đây là kiểu float. float secondNumber = 10.2f; System.out.println("Second Number ="+ secondNumber); // Khai báo một số thực 64 bit // Số này được gán giá trị 10.2 // Chữ d ở cuối giúp java hiểu đây là kiểu double. Phân biệt với kiểu float. double thirdNumber = 10.2d; System.out.println("Third Number ="+ thirdNumber); // Khai báo một kiểu ký tự char ch = 'a'; System.out.println("Char ch= "+ ch); } }
Chạy class VarEx1
Nhấn chuột phải vào tập tin VarEx1.java trong cửa sổ project, chọn “Run As/Java Application”:
Kết quả chạy trên của sổ Console
Chúng ta cũng có thể khai báo nhiều biến cùng lúc, giống như ví dụ dưới đây:
Tạo class mới: VarEx2
Viết thêm code cho class VarEx2 như sau:
package com.code5s.variable; public class VarEx2 { public static void main(String[] args) { // Khai báo 3 số tự nhiên 64 bit (long) long firstNumber, secondNumber, thirdNumber; // Gán giá trị cho firstNumber // Chữ L ở cuối để nói với java đây là kiểu long, phân biệt với kiểu tự nhiên int. firstNumber = 100L; // Gán giá trị cho secondNumber secondNumber = 200L; // Gán giá trị cho thirdNumber thirdNumber = firstNumber + secondNumber; System.out.println("First Number = " + firstNumber); System.out.println("Second Number = " + secondNumber); System.out.println("Third Number = " + thirdNumber); } }
Kết quả chạy trên của sổ Console
Cấu trúc điều khiển
Cấu trúc rẽ nhánh – câu lệnh if-else
Mô tả sự lựa chọn 1 trong 2, tương tự như khi chúng ta đi trên đường tới một ngã 3, chúng ta phải lựa chọn 1 trong 2 hướng còn lại để đi, ở đây là chúng ta phải chỉ ra cho chương trình nhánh cần thi hành khi gặp phải sự lựa chọn
Cấu trúc của câu lệnh if-else
if(Điều kiên 1) { // lệnh 1-1 // lệnh 1-2 // ... // lệnh 1-n }else if(Điều kiện 2) { // lệnh 2-1 // lệnh 2-2 // ... // lệnh 2-n }else { // Ngược lại // lệnh }
Tạo package: com.code5s.controlflow
Tạo class: IfElseEx1 nằm trong package com.code5s.controlflow
package com.code5s.controlflow; import java.util.Scanner; public class IfElseEx1 { public static void main(String[] args) { int n; // khai báo một biến kiểu số nguyên Scanner scan = new Scanner(System.in); System.out.print("Input a number: "); n = scan.nextInt(); // Xuất số vừa nhập ra màn hình System.out.println("The input number is: " + n); // Kiểm tra tính chẳn lẻ if (n % 2 == 0) { System.out.println(n + " is on even number"); } else { System.out.println(n + " is on odd number"); } } }
Kết quả chạy trên cửa sổ Console:
Các toán tử thông dụng
Toán tử | Mô tả |
---|---|
> | Lớn hơn |
< | Lớn hơn |
>= | Lớn hơn hoặc bằng |
<= | Nhỏ hơn hoặc bằng |
&& | Và |
|| | Hoặc |
! | Phủ định |
== | So sánh bằng |
!= | So sánh khác |
Tạo class: IfElseEx2 nằm trong package com.code5s.controlflow
package com.code5s.controlflow; import java.util.Scanner; public class IfElseEx2 { public static void main(String[] arg) { int n; // khai báo một biến kiểu số nguyên Scanner scan = new Scanner(System.in); System.out.print("Input a number (0 < n && n < 10): "); n = scan.nextInt(); // Xuất số vừa nhập ra màn hình System.out.println("The input number is: " + n); if (n == 1) { System.out.println("mot"); } else if (n == 2) { System.out.println("hai"); } else if (n == 3) { System.out.println("ba"); } else if (n == 4) { System.out.println("bon"); } else if (n == 5) { System.out.println("nam"); } else if (n == 6) { System.out.println("sau"); } else if (n == 7) { System.out.println("bay"); } else if (n == 8) { System.out.println("tam"); } else if (n == 9) { System.out.println("chin"); } else { System.out.println("khac"); } } }
Kết quả chạy trên cửa sổ Console:
Cấu trúc rẽ nhánh – câu lệnh switch-case
Câu lệnh switch-case về ý tưởng tương tự như câu lệnh if-else, nhưng cho phép chương trình có thể lựa chọn một trong nhiều nhánh để thi hành khi gặp biểu thức điều kiện.
Cấu trúc của câu lệnh switch-case
switch ( biểu-thức-điều-kiện ) { case value1: // lệnh 1-1 // lệnh 1-2 // ... // lệnh 1-n break; case value2: // lệnh 2-1 // lệnh 2-2 // ... // lệnh 2-n break; default: // lệnh }
Tạo class: SwitchEx1 nằm trong package com.code5s.controlflow
package com.code5s.controlflow; import java.util.Scanner; public class SwitchEx1 { public static void main(String[] args) { int n; // khai báo một biến kiểu số nguyên Scanner scan = new Scanner(System.in); System.out.print("Input a number (0 < n && n < 10): "); n = scan.nextInt(); // Xuất số vừa nhập ra màn hình System.out.println("The input number is: " + n); switch (n) { case 1: System.out.println("mot"); break; case 2: System.out.println("hai"); break; case 3: System.out.println("ba"); break; case 4: System.out.println("bon"); break; case 5: System.out.println("nam"); break; case 6: System.out.println("sau"); break; case 7: System.out.println("bay"); break; case 8: System.out.println("tam"); break; case 9: System.out.println("chin"); break; default: System.out.println("khac"); break; } } }
Kết quả chạy trên cửa sổ Console:
Chú ý rằng câu lệnh case cần nhận vào một giá trị cụ thể.
// Điều này không được phép!! case (age < 18) : break; // case chỉ chấp nhận một giá trị cụ thể ví dụ: case 18: // Làm gì đó tại đây break;
Vòng lặp for
Vòng lặp for mô tả một hoặc một số câu lệnh cần lặp lại với số lần lặp được xác định trước, ví dụ: cần tính tổng của mảng có 10 phần tử, tìm phần tử thứ 6 của chuỗi Fibonaci, …
Cấu trúc của vòng lặp for
for ( Giá-trị-bắt-đầu ; Giá-trị-kết-thúc; Giá-trị-tăng ) { // câu lệnh 1; // câu lệnh 2; //... // câu lệnh n; }
Tạo package: com.code5s.loop
Tạo class: ForEx1 nằm trong package com.code5s.loop
package com.code5s.loop; import java.util.Scanner; public class ForEx1 { public static void main(String[] args) { int n; // khai báo một biến kiểu số nguyên Scanner scan = new Scanner(System.in); System.out.print("Input a number: "); n = scan.nextInt(); // Xuất số vừa nhập ra màn hình System.out.println("The input number is: " + n); int sum = 0; // biến sum lưu tổng cần tính for (int i = 1; i <= n; i++) { sum += i; } System.out.println("The result is: " + sum); } }
Kết quả chạy trên cửa sổ Console:
Vòng lặp for thường được sử dụng kết hợp với dữ liệu dạng mảng (array), hay dữ liệu dạng enumerable
Vòng lặp while
Vòng lặp while thường dùng để mô tả một hoặc một số câu lệnh cần lặp lại với số lần lặp không xác định trước, ví dụ: yêu cầu người dùng nhập vào số nguyên dương, đoán số, …
Cấu trúc vòng lặp while
// Trong khi điều kiện đúng, thì làm gì đó. while ( biểu-thức-điều-kiện ) { // câu lệnh 1; // câu lệnh 2; // ... // câu lệnh n; }
Xem ví dụ minh họa về chương trình đoán số dưới đây:
Tạo class: ForEx1 nằm trong package com.code5s.loop
package com.code5s.loop; import java.util.Scanner; public class WhileEx1 { public static void main(String[] args) { int n = -1; // khai báo một biến kiểu số nguyên // khai báo biến guess, chứa số ngẫu nhiên từ 0 - 100 // Math.random() sinh ra số ngẫu nhiên từ 0.0-1.0 int guess = (int)(100*Math.random()); Scanner scan = new Scanner(System.in); int min = 0, max = 100; // khai báo 2 biến chứa khoảng giá trị cần đoán int count = 0; // số lần đoán while (n != guess) { count++; System.out.print("Input a number (" + min + " < n && n < " + max + ": "); n = scan.nextInt(); int avg = (min + max) / 2; if (guess > avg) { min = avg; } if (guess < avg){ max = avg; } } System.out.println("The guess number is: " + guess); System.out.println("You're guess " + count + " times."); } }
Vòng lặp do-while
Vòng lặp do-while có chức năng giống vòng lặp while đã nói ở trên, tuy nhiên, trong vòng lặp do-while, biểu thức điều kiện được kiểm tra ở cuối vòng lặp, điều này có nghĩa là thân vòng lặp sẽ được thực thi ít nhất là 1 lần.
Cấu trúc vòng lặp while
// Trong khi điều kiện đúng, thì làm gì đó. do { // câu lệnh 1; // câu lệnh 2; // ... // câu lệnh n; } while ( biểu-thức-điều-kiện );
Mảng (Array)
Mảng là gì?
Mảng là một kiểu dữ liệu của Java, chứa một danh sách gồm nhiều biến liên tục trên bộ nhớ. Hãy xem hình ảnh một mảng số nguyên có 5 phần tử
Làm việc với mảng
Cách khai báo mảng trong Java
// Khai báo một mảng, chưa khởi tạo. int[] array1; // Khởi tạo mảng với 100 phần tử // Các phần tử chưa được gán giá trị cụ thể array1 = new int[100]; // Khai báo một mảng chỉ rõ số phần tử // Các phần tử chưa được gán giá trị cụ thể double[] array2 = new double[10]; // Khai báo một mảng mà các phần tử được gán giá trị cụ thể. // Mảng này có 4 phần tử long[] array3= {10L, 23L, 30L, 11L};
Hãy xem ví dụ về mảng minh họa như sau:
Tạo package: com.code5s.arr
Tạo class: ArrayEx1 nằm trong package com.code5s.arr
package com.code5s.arr; public class ArrayEx1 { public static void main(String[] args) { // Khai báo một mảng 5 phần tử int[] myArray = new int[5]; // Chú ý phần tử đầu tiên của mảng có chỉ số là 0: // Gán giá trị cho phần tử đầu tiên (Chỉ số 0) myArray[0] = 10; // Gán giá trị cho phần tử thứ hai (Chỉ số 1) myArray[1] = 14; myArray[2] = 36; myArray[3] = 27; // Giá giá trị cho phần tử thứ 5 (Phần tử cuối cùng trong mảng) myArray[4] = 18; // In ra màn hình số phần tử của mảng. System.out.println("Array Length=" + myArray.length); // In ra màn hình phần tử tại chỉ số 3 (Phần tử thứ 4 trong mảng) System.out.println("myArray[3]=" + myArray[3]); // Sử dụng vòng lặp for để in ra các phần tử trong mảng. for (int i = 0; i < myArray.length; i++) { System.out.println("Element " + i + " = " + myArray[i]); } } }
Kết quả:
Class và Object (Lớp và đối tượng)
Đầu tiên, cần phải phân biệt rõ ràng một số khái niệm:
- Class (lớp): Chúng ta có thể hình dung Class giống như là một cái khuôn mẫu (template), với mục đích là để tạo ra các đối tượng (object). Hãy xem Class giống như là một cái khuôn làm bánh in, và Object chính là những cái bánh in.
Khi chúng ta tạo ra các đối tượng từ một lớp, điều này có nghĩa là chúng ta đang tạo ra các thể hiện (instance) của lớp đó - Object (đối tượng): Trong lập trình hướng đối tượng (OOP), Cần phải nắm rõ 3 tính chất cơ bản của đối tượng.
- Hành vi của đối tượng (object’s behavior): Có thể làm gì với đối tượng, hay có thể triệu gọi các phương thức nào của đối tượng ?
- Trạng thái của đối tượng (object’s state): Đối tượng phản ứng như thế nào khi các phương thức của nó được triệu gọi ?
- Định danh duy nhất của đối tượng (object’s identity): Đối tượng sẽ phân biệt nó với các đối tượng khác có cùng hành vi và trạng thái như thế nào ?
Ví dụ minh họa về lớp
Circle.java
package com.code5s.object; public class Circle { public final double PI = 3.14; private String color; private int radius; public Circle() { color = "red"; radius = 0; } public Circle(String color, int radius) { this.color = color; this.radius = radius; } public double area() { return PI * radius * radius; } @Override public String toString() { return "This is " + color + " circle with radius = " + radius; } }
CircleTest.java
package com.code5s.object; public class CircleTest { public static void main(String[] args) { Circle c1 = new Circle(); Circle c2 = new Circle("blue", 10); System.out.println(c1); System.out.println(c2); } }
Kết quả: