Học Java qua các ví dụ cụ thể
Bài 1 - Hello world
Bài 2 – In ra chuỗi nhập vào
Bài đầu tiên của bạn, bạn đã học cách để Java in cái gì đó ra màn hình, trong bài này, bạn sẽ học cách
nhập vào cái gì đó và Java in cái đó ra màn hình. Gõ cái này đi bạn (lưu ý, bạn phải gõ, không được
copy và paste)
Nhap diem so: "); int diem = Integer.parseInt(in.readLine()); if(diem<=2) System.out.println("Yeu"); if((diem>2) && (diem<=3)) System.out.println("Trung binh"); if((diem>3) && (diem<=4)) System.out.println("Kha"); if((diem>4) && (diem<5)) System.out.println("Gioi"); if(diem==5) System.out.println("Xuat sac"); } } Thay vì lặp lại những câu if ấy, bạn nên dùng switch import java.io.*; public class Hello { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Nhap diem so: "); int diem = Integer.parseInt(in.readLine()); switch(diem) { case 0: case 1: case 2:System.out.println("Yeu");break; case 3:System.out.println("Trung binh");break; case 4: case 5:System.out.println("Gioi");break; default:System.out.println("Vao sai"); } } } *break với switch: break sẽ thoát ngay ra khỏi khối lệnh trong thân của switch Bài 9 – String Khác với C, String là một lớp của Java. String được khai báo như sau String a = "Hello"; Cộng 2 String bằng dấu + System.out.println("Gia tri la " + n); Java có khả năng tự chuyển kiểu bất cứ dữ liệu kiểu số nào khi cộng vào String. Dù n là int, float, double đều có thể chuyển thành String nhờ mẹo vặt ("" + n) Các method trong class String * substring String s1 = "Hello"; String s2 = s1.substring(0,4); //bắt đầu từ kí tự thứ 0 (tức là 'H') lấy đi 4 kí tự (tức là "Hell") * length int n = s1.length(); //tức là bằng 5 * charAt char ch = s1.charAt(4); //tức là bằng 'o' Đây là method tìm kí tự thứ i trong String, các kí tự trong String được đánh số từ 0 * equals Kiểu tra xem chuỗi nguồn s có giống chuỗi đích d hay không, ta dùng method equals trả về boolean boolean b = s.equals(t); String không giống dữ liệu kiểu số, tuyệt đối không dùng giống như if(s==t) * compareTo int a = s2.compareTo(s1); a>0 s2>s1 a<0 s2<s1 a=0 s2=s1 So sánh giữa s2 và s1 là so sánh thứ tự giữa kí tự đầu của hai chuỗi so đi, ví dụ "kc" > "kazbe" * toCharArray (đổi chuỗi ra mảng kí tự) char[] chuoi = s1.toCharArray(); * indexOf String s1 = "Hello Everybody"; String s2 = "lo"; int n = s1.indexOf(s2); //n sẽ bằng 4 Đây là method trả về vị trí của chuỗi s2 trong chuỗi s1, nếu không tìm thấy sẽ trả về -1 * Chuyển kiểu từ String ra dữ liệu kiểu số Chuyển từ dữ liệu kiểu số ra String khá dễ dàng, dùng "" + n, nhưng ngược lại thì phải dùng các method tương ứng. Các method này nằm trong góijava.lang, trong các class Byte, Short, Integer, Long, Float, Double String input = "230"; int n = Integer.parseInt(input); //n sẽ bằng 230 Tương tự với các method sau Byte.parseByte, Short.parseShort, Float.parseFloat, ... Bài 10 – vòng lặp for for(int i=0;i<n;i++) s+=i; 3 thành phần trong câu for ta có thể bỏ hết nhưng phải giữ lại các dấu ; khi đó nến muốn ta có thể đặt phép toán điều khiển vòng lặp trong thân lệnh như sau for(int i=0;i<n;) { s+=i; i++; } *break với for: break sẽ thoát ngay ra khỏi vòng for for(int i=0;i<n;i++) { System.out.println(i);break; System.out.println("Tiep tuc"); } Kết quả in ra không có câu "Tiep tuc" vì break nhảy ngay ra khỏi vòng for sau khi in 1 *continue với for: continue sẽ khiến vòng for bắt đâu 1 chu trình mới và bỏ qua tất cả các lệnh bên dưới nó VD: in tất cả các số từ 0 đến 10, bỏ qua 3,4,5 for(int i=0;i<10;i++) { if((i= =3)||(i= =4)||(i= =5)) continue; System.out.println(i); } Bài 11 – while while(biểu thức) lệnh; Nếu biểu thức đúng thì thực hiện lệnh *break với while: break sẽ thoát ngay ra khỏi vòng while int i=0; while(i<10) { System.out.println(i);break; i++; } Sẽ chỉ in ra 0 * continue với while: nó sẽ xác định giá trị biểu thức viết ngay sau while int i=0; while(i<10) { System.out.println(i);continue; i++; } Ta sẽ được một loạt in 0 vô tận Bài 12 – vòng lặp do..while do lệnh; while(biểu thức); Nếu biểu thức đúng thì tiếp tục thực hiện lệnh *break với do..while: break sẽ thoát ngay ra khỏi vòng while int i=0; do { System.out.println(i);break; i++; } while(i<10); Sẽ chỉ in ra 0 * continue với while: nó sẽ xác định giá trị biểu thức viết ngay sau while int i=0; do { System.out.println(i);continue; i++; } while(i<10); Ta sẽ được một loạt in 0 vô tận Bài 13 – array Ta khai báo 1 mảng với câu lệnh sau, và không cung cấp số phần tử int[] a; Tuy vậy, với Java, để dùng được một array, ta cần phải khởi tạo array đó, và lúc này phải cung cấp số phần tử int[] a; a = new int[100]; Hai câu có thể viết lại thành một câu int[] a = new int[100]; Java sẽ khởi tạo một mảng 100 phần tử đều là int có đánh thứ tự từ 0 đến 99 Mảng có giá trị đầu: Mảng loại này không cần new mà cũng chẳng cần số phần tử int[] a = {1,45,6,8,21}; Các method với mảng * length method này sẽ cung cấp số phần tử của mảng, ví dụ ta muốn gán giá trị số cho các phần tử của mảng a for(int i=0;i<a.length;i++) a|i|=i; lưu ý là length, không phải length() *System.arraycopy Giả sử, ban đầu ta có 2 mảng int[] s = {1,3,5,7,9,11,13,15}; int[] d = {2,4,6,8,10,12,14}; method arraycopy trong gói System System.methodcopy(s,3,d,2,4); sẽ cho ra một mảng d mới là {2,4,7,9,11,13,14} method này sẽ thay thế 4 phần tử, tính từ phần tử thứ 2 trong mảng d, bằng ngần ấy phần tử tính từ phần tử thứ 3 trong mảng s Các method nằm trong class java.util.Arrays * void sort Nó sẽ sắp xếp một mảng số tăng dần int[] s = {28,7,14,11}; Arrays.sort(s); * int binarySearch Nó sẽ tìm vị trí của một phần tử trong một mảng, trả về -1 nếu không tìm thấy int[] s = {28,7,14,11}; int n = Arrays.binarySearch(s,14); n sẽ bằng 2 Mảng nhiều chiều int[][] = new int[100][50]; Hoặc khai báo 1 mảng có giá trị đầu. Đây là mảng 2 chiều gồm 4 phần tử là 4 mảng 1 chiều, mỗi mảng 1 chiều chứa 3 phần tử int[][] a = { {16, 3, 2}, {5, 10, 11}, {9, 6, 7}, {4, 15, 14} }; Bài 14 - ngoại lệ [code]int x,y; x=10;y=x-10; x=x/y; Khi chạy đoạn mã này bạn sẽ thấy xuất hiện thông báo java.lang.ArithmeticException: divide by zero Và chương trình sẽ thoát ra ngay lúc đó. Muốn chương trình chạy tiếp và không thoát ra, ta đón "bắt" ngoại lệ này, đưa ra biến e, cuối cùng in e (để xem là ngoại lệ gì) int x,y; try { x=10;y=x-10; x=x/y; } catch(Exception e) { System.out.println(e.getMessage()); } Xử lí ngoại lệ (Exception) Để "ném" ngoại lệ do bất cứ dòng mã nào trong một phương thức sinh ra, bạn có thể khai báo để ném bỏ ngoại lệ đó public void divide() throws Exception { int a=5/0; } hoặc nếu muốn "bắt" ngoại lệ đó lại để xem đó là ngoại lệ gì để xử lí, bạn "bắt" nó rồi in ra try { int a=5/0; } catch(Exception e) { System.out.println(e.getMessage()); } Nếu muốn chương trình thành công thì sinh thông báo thành công, thất bại thì sinh thông báo ngoại lệ, bạn có thể dùng boolean done=false; try { int a=5/b; done=true; } catch(Exception e) { System.out.println(e.getMessage()); } if(done==true) System.out.println("Successful"); Bài 15 - Vector (mảng không giới hạn số phần tử) Các method trong bài này nằm ở 2 class java.util.Vector và java.util.Enumeration Khai báo Vector vt = new Vector(); Nhập dữ liệu cho một Vector (class Console nằm trong gói corejava) Lưu ý là mỗi phần tử của Vector đều phải là một đối tượng, nên ta phải có new Integer(n) khi muốn đưa vào một biến kiểu int. Tương tự với Byte, Long, Float, ... do { int n = Console.readInt(""); if(n!=0) vt.addElement(new Integer(n)); } while(n!=0); In ra các phần tử của một Vector for(int i=0;i<vt.size();i++) System.out.println(vt.elementAt(i)); Để đưa Vector về kiểu mảng cho dễ thao tác, ta đưa về kiểu Enumeration (một kiểu mảng) Enumeration e = vt.elements(); Như vậy ta có mảng e kiểu Enumeration sao chép y khuôn Vector vt để dễ xử lí, không đụng đến Vector vt In ra các phần tử của một Enumeration while(e.hasMoreElements()) System.out.println(e.nextElement()); Bài 16 - Lớp nội (lớp nằm trong lớp khác) public class TestProgram { static int currentCount; static class Apple { int weight; public Apple(int weight) { this.weight=weight; currentCount++; } public int Weight() { return weight; } } public static void main(String args[]) { Apple a=new Apple(12);//khoi tao 1 quả tao nang 12kg System.out.print(a.Weight()); } } Ở đây ta thấy lớp nội Apple trong lớp TestProgram, khi biên dịch Java sẽ làm xuất hiện 2 file là TestProgram.class và TestProgram$Apple.class. Ưu điểm khi sử dụng lớp nội là: - thể hiện tính đóng gói cao - các lớp nội có thể truy xuất trực tiếp các biến của lớp cha Lưu ý là lớp nội khác với các lớp mà nằm chung một file, ví dụ như tập tin MainClass.java dưới đây public class MainClass { } class Subclass { } Khi biên dịch nó sẽ tạo ra 2 file là MainClass.class và Subclass.class Bài 17 - Tạo tập tin jar tự chạy Giả sử chương trình của bạn có vài file .class trong đó file chương trình chính là MainPro.class chẳng hạn. Bạn hãy tạo một file lấy tên là mymf.mf có nội dung như sau Main-Class: MainPro Bắt buộc phải chính xác như thế (tức là phải có cả xuống dòng), không thì trình chạy jar không hiểu được. Sau đó bạn vào %JAVA_HOME%\bin\ chép tất cả các tập tin .class của ứng dụng và cả mymf.mf vào đó, rồi chạy jar.exe với tham số dòng lệnh như sau jar cmfv mymf.mf MyProgram.jar *.class Tương tự nếu bạn muốn đưa thêm 2 thư mục dir1 và dir2 vô file JAR thì bạn cũng gõ jar cmfv mymf.mf MyProgram.jar *.class dir1 dir2 Trình jar sẽ tạo file MyProgram.jar (tên khác tùy bạn) có thể chạy được, không phải dùng lệnh java hay giả sử không có IDE quen thuộc của bạn
File đính kèm:
- Học Java qua các ví dụ cụ thể.pdf