Page 1
Bài 0
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn
Phí" trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Tiêu đề bài viết không phải để nói Java là số 1 vì bất cứ ngôn ngữ lập trình nào cũng có ưu và nhược
điểm, chúng ta cần có cái nhìn thật khách quan về Java để có quyết định đúng đắn, tùy theo từng cá
nhân!
Đặc điểm ngôn ngữ Java, Java có thể làm được những gì
và nhu cầu việc làm của lập trình viên Java???
Dưới đây là một chút ít thông tin mình tổng hợp từ trên mạng, các bạn sau khi đọc bài viết này xong,
nên tìm hiểu thêm để tìm ra ý kiến của cá nhân, và xác định có theo Java không? Chọn thì theo mảng
nào? Vì Java rất rộng. Mình mong các bạn biết rõ những thông tin đó để yên tâm chọn Java
1, Đặc điểm của Java
- Đơn giản, trong sáng, kiến trúc thiết kế rất tốt và còn đang phát triển mạnh mẽ.
- Hướng đối tượng.
- Khắc phục nhiều nhược điểm của các ngôn ngữ trước đó.
- Độc lập phần cứng và hệ điều hành, lập trình 1 lần, chạy được trên nhiều platform khác nhau.
Page 2
Vd: 1 chương trình bạn lập trình bằng Java, code1 lần, nhưng cũng có thể chạy trên Window, linux,
.v.v. Chỉ cần hệ thống đó có máy ảo Java là đều chạy được. Như vậy sẽ tiết kiệm công sức cho lập
trình viên, cũng như có thể phục vụ được các hệ thống phân tán, có nhiều máy với phần cứng khác
nhau, hệ điều hành khác nhau
- Bảo mật .
- Phân tán. (Phần thứ 3 mình viết rồi đấy)
- Đa luồng.
- Động.
- Cộng đồng hỗ trợ mạnh, do là công nghệ mở.
(Mình chỉ ghi tóm tắt, gạch đầu dòng, với những bạn mới bắt đầu, nên google thêm với những từ
khóa trên nhé!)
- Java thường bị coi là chậm, nhưng gần đây, tốc độ chương trình java đã và đang được cải thiện
đáng kể!
2, Java thường dùng làm những gì?
- Java có thể dùng viết lên các web site lớn, các hệ thống phân tán, các chương trình đa nền tảng.
- Trong thế giới di động, đầu tiên phải kể đến là những úng dụng, game java trên các điện thoại
feature phone có lẽ quá quen thuộc với các bạn (file cài dạng *.jar)
- Hiện tại, sang thế hệ smart phone, thì từ khi hệ điều hành di động Android lên ngôi, những ứng
dụng, game trên Android hầu hết đều được viết bằng Java - SDK (file cài dạng *.apk)
Page 3
- Và còn nhiều hơn nữa
3, Nhu cầu việc làm lập trình viên Java
- Có thể nói nếu bạn đủ khả năng, thì không lo thiếu việc, thu nhập cũng không thấp
- Mình vừa lên google tìm với từ khóa “tuyển lập trình viên java”, dưới đây là vài kết quả mới đăng
mình tìm thấy, vẫn còn hạn nộp hồ sơ (ngày tìm : 28/5/2013)
Page 4
Bạn cũng có thể tự tìm kiếm google với từ khóa “tuyển lập trình viên di động” hoặc “tuyển lập trình
viên Android”! để có cái nhìn tổng quan hơn về công việc liên quan tới Java
Page 5
Bài viết tổng hợp từ cá nhân mình, có thể còn thiếu xót, ai có kinh nghiệm, chia sẻ thêm cùng
mọi người
Page 6
Bài 1: Bắt đầu cài đặt - Làm quen các công cụ - Tạo Project
Java đầu tiên Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 29/5/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >
1.
Tiasangmoi92Super Moderator
Lượt xem: 7,186
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 7
Để bắt đầu học lập trình Java, cơ bản thì máy bạn cần cài bộ JDK và một IDE , chú ý là bạn hãy đọc hết bài rồi mới download nhé!
1, Bộ cài JDK và giới thiệu máy ảo Java (JVM): JavaDevelopmentKit (JDK - Bộ công cụ cho người phát triển applet Java hay những ứng dụng Java - bộ công cụ này được
phát hành miễn phí gồm có trình biên dịch, trình thông dịch, trình giúp sửa lỗi (debugger, trình chạy applet và tài liệu nghiên
cứu.
Dowload bộ cài JDK tại đây
Bạn chọn ” Accept License Agreement “ rồi chọn phiên bản phù hợp với hệ điều hành bạn đang dùng.
- Còn về máy ảo Java, mình sẽ minh họa bằng 1 ví dụ ngoài lề như này để các bạn dễ hiểu: Chẳng hạn bạn là người chỉ biết tiếng Việt, nhưng bạn muốn giao tiếp với toàn thế giới, như vậy, hoặc là bạn cần một người phiên dịch hiểu biết tất tần tật các thứ tiếng trên thế giới hoặc là bạn cần tập hợp những người phiên dịch, mỗi người hiểu một thứ tiếng và có thể dịch được tiếng Việt sang tiếng của họ, bạn đi đến nước nào thì liên hệ và giúp bạn giao tiếp . Tất nhiên, cách thứ nhất là không khả thi, chắc chắn bạn sẽ phải chọn cách 2 thôi.
- Và máy ảo Java cũng vậy, nó là tập hợp những người “phiên dịch” – tức là các bộ cài trên từng thiết bị, từng hệ điều hành, có bản cho Linux, bản cho Window, bản cho máy tính, bản cho mobile, .v.v…v. Nhưng người ta chỉ cần gọi chung chúng là máy ảo Java là đủ. Chương trình Java bạn viết ra, nhờ có máy ảo Java, nó có thể chạy được trên nhiều nền tảng khác nhau, không phụ thuộc vào phần cứng, hệ điều hành, chỉ cần môi trường đó cài máy ảo Java là có thể sử dụng được chương trình của bạn. Đây là cái mà những nhà phát triển Java luôn hướng tới và cũng là một ưu điểm của Java mà mình đã viết ở bài mở đầu, theo mình, nó có lẽ là ưu điểm tuyệt vời nhất của Java.
Page 8
- Khái niệm: Máy ảo Java là một phần mềm dựa trên cơ sở máy tính ảo. Nó có tập hợp các lệnh logic để xác định các hoạt động của máy tính. Người ta có thể xem nó như một hệ điều hành thu nhỏ. Nó thiết lập các lớp trừu tượng cho: Phần cứng bên dưới, hệ điều hành, mã đã biên dịch. Trình biên dịch chuyển mã nguồn thành tập các lệnh của máy ảo mà không phụ thuộc vào phần cứng cụ thể. Trình thông dịch trên mỗi máy sẽ chuyển tập lệnh này thành chương trình thực thi.
Và khi bạn cài JDK, thì máy bạn đã có máy ảo Java rồi nhé!
2, IDE
- IDE là Môi trường phát triển tích hợp, nó giống như một công cụ soạn thảo chương trình Java, và hỗ trợ cho bạn trong quá trình lập trình. - Về IDE lập trình Java thì có rất nhiều: Jcreator, Jbuilder, Eclipse, Netbeans, .v..v..v
- Tuy nhiên hiện tại thì mình thấy mọi người thường dùng Netbeans và Eclipse nhiều hơn, và bạn nên biết cả 2 công cụ này. Bài sau sẽ hướng dẫn các bạn dùng cả 2 . Còn cá nhân mình thì thường dùng Netbeans để code Java.
Destination URL: https://netbeans.org/downloads/
Page 9
Bạn chọn bản SE cho nhẹ, nó cũng đã cơ bản đáp ứng đủ nhu cầu lập trình Java trong khóa học! Các bạn phải cài JDK trước rồi mới cài IDE không thì sẽ có lỗi !
Chú ý:
Về bản chất thì bạn phải cài 2 công cụ như vậy, nhưng mới đây, trên trang chủ oracle đã có bản “2 trong 1”, nó là sự kết hợp giữa JDK và Netbeans, nghĩa là bạn chỉ cần download 1 gói duy nhất về cài đặt là đã cơ bản đủ công cụ học lập trình Java, rất tiện lợi . Nhưng mình vẫn phải viết đầy đủ như trên để mai này các bạn có thể tùy chỉnh, chọn IDE phù hợp.
Destination URL download tại đây! Bạn chọn vào ” Accept License Agreement “ rồi chọn phiên bản phù hợp với hệ điều hành bạn đang dùng.
Tiếp theo là video hướng dẫn tất cả các thao tác từ download, đến cài đặt và tạo chương trình Java đầu tiên với mỗi công cụ trên.
Ngoài ra, mình bổ sung thêm 2 video rất hay nữa của anh Việt bên blog StudyAndShare, các
bạn mới bắt đầu với Java nên xem hết nhé!
Page 10
Bài tập về nhà cho những bạn mới làm quen Java:
Download và cài thử các công cụ trên, tạo project "Hello Word" mới với mỗi
IDE tương tự như trong Video
Page 11
Bài 2: Biên dịch và thực thi Java source bằng Command
Line (cmd) Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 30/5/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 4,062
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Sau khi học xong Bài 1, các bạn đã có thể chạy được chương trình HelloWord bằng các IDE eclipse hoặc Netbeans, ở bài này, mình sẽ hướng dẫn bổ sung cho các bạn một cách khác để biên dịch và thực thi Java source mà không cần tới IDE, chỉ cần máy bạn đã cài JDK là dùng được, chúng ta sẽ làm điều này bằng các dòng lệnh trên Cmd
Đầu tiên bạn thiết lập biến môi trường:
Bước 1: My computer >Nháy chuột phải > Properties > Advanced > Environment Bước 2: Tại mục "System variables" bạn tìm tới "Path" rồi chọn "Edit"
Bước 3: Tìm đường dẫn tới thư mục bin của java, máy mình là: C:\Program Files\Java\jdk1.7.0_21\bin Chèn đường dẫn trên vào cuối ô “Variable value”
Nhớ là đường dẫn của bạn phải có 2 dấu chấm phẩy 2 bên, như này: Mã:
; C:\Program Files\Java\jdk1.7.0_21\bin;
Bước 4: Ok và lưu lại.
Page 12
Chúng ta kiểm tra việc thiết lập biến môi trường có thành công hay không bằng cách mở cửa sổ Run lên (ấn tổ hợp phím Window + r ), gõ cmd rồi ấn Enter Bạn gõ thử 2 câu lệnh sau. Mã:
javac
Mã:
java
Nếu màn hình hiện như sau là việc thiết lập biến môi trường của bạn đã thành công.
Page 14
Bây giờ, chúng ta chuyển sang việc biên dịch và thực thi chương trình Java
Đầu tiên bạn đưa dấu nhắc về thư mục chứa file java bạn mới tạo, chẳng hạn để đưa dấu nhắc về ổ D bạn dùng lệnh: Mã:
d:
Ở đây mình lưu file ViDu.java ở ổ D, bên trong có file Vidu.Java là chương trình Hello word. Khi dấu nhắc đã ở thư mục chứa file java, gõ lệnh javac + tên file.java để biên dịch chương trình thành file class, ví dụ như sau: Mã:
javac ViDu.java
(Bạn để ý sẽ có file cùng tên file java, nhưng có đuôi là *.class được tạo ra cùng thư mục) Sau đó gõ tiếp lệnh java + tên file. ở đây mình gõ
Mã:
java ViDu
Chương trình thực thi và hiện kết quả lên màn hình Cmd “Hello the gioi Java!”,
Page 15
Và tiếp theo là video hướng dẫn toàn bộ quá trình trên của Android.Vn
Chúc các bạn thành công
Page 16
Bài tập về nhà: Dùng lệnh Javac, java để biên dich và thực thi chương trình Hello Word.
Page 17
Bài 3: Cách khai báo biến , hằng và các kiểu dữ liệu trong
Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 31/5/13.
Theo dõi chủ đề
Trang 1 / 41 234Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 6,302
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Biến trong Java
- Biến là vùng nhớ dùng để lưu trữ các giá trị của chương trình.
- Mỗi biến gắn liền với một kiểu dữ liệu và một định danh duy nhất gọi là tên biến.
- Tên biến thông thường là một chuỗi các ký tự (Unicode), ký số.
- Tên biến phải bắt đầu bằng một chữ cái hoặc một dấu gạch dưới hay dấu dollar.
- Tên biến không có khoảng trắng ở giữa tên.
- Trong java, biến có thể được khai báo ở bất kỳ nơi đâu trong chương trình.
- Tên biến không được trùng với các từ khóa trong Java. (Ví dụ từ khóa : abstract, assert, boolean,
break, byte, case, catch, char, class, const, continue, default, do, double, else, enum, extends final,
finally, float, for,goto, if , implements , import, instanceof, int, interface, long, native, new, package,
Page 18
private, protected, public, return, short , static, strictfp, super, switch, synchronized, this throw,
throws, transient, try, void, volatile, while.)
- Ví dụ:
Tên biến đúng: a , _a, A, _b, _B, $d, hoTen, _giaTri, sinhVien1, sinhVien2
Tên biến sai: 5a , hoc sinh, 1gia tri, if, try
- Lưu ý: Trong Java phân biệt chữ hoa chữ thường, vì vậy chúng ta cần lưu ý khi đặt tên cho các
biễn, các đối tương dữ liệu cũng như các xử lý trong chương trình.
2, Khai báo biến trong Java.
Cấu trúc câu lệnh khai báo biến trong java như sau: [Kiểu dữ liệu] [tên biến];
Ví dụ: Mã:
int giaTri; // Khái báo biến có tên là “giaTri”, kiểu dữ liệu là int – kiểu số nguyên. String hoTen; //Khai báo biến có tên là “hoTen”, kiểu dữ liệu là String – Là một chuỗi ký tự.
- Ngoài ra còn có thêm từ khóa (public, private, ….) trước dòng khai báo biến (vd: private String
hoTen), phần này mình sẽ nói khi chúng ta sang phần hướng đối tượng trong Java.
- Để gán giá trị cho biến ta chỉ việc dùng cú pháp Tên biến = giá trị, hoặc gán ngay trong quá trình
khai báo ví dụ: Mã:
int giaTri; giaTri = 5;
Hoặc Mã:
int giaTri = 5;
Để in một chuỗi văn bản hoặc giá trị ra màn hình Console ta dùng lệnh dạng như sau: Mã:
System.out.print(“Giá trị của biến là: ”+ giaTri1 + giaTri2); // giaTri1 và giaTri2 là 2 biến đã khai báo và gán giá trị.
3, Giới thiệu các kiểu dữ liệu trong Java
Trong Java có 2 nhóm kiểu dữ liệu, thứ nhất là kiểu dữ liệu nguyên thủy (dữ liệu cơ sở) và thứ 2 là
nhóm kiểu dữ liệu mở rộng: (photo)
Page 19
Ở trong bài này bài này mình sẽ chỉ giới thiệu các kiểu dữ liệu nguyên thủy, còn những kiểu mở rộng
sẽ được viết vào bài hướng đối tượng trong Java.
a, Kiểu số nguyên:
Page 20
b, Kiểu số thực:
c, Kiểu dữ liệu ký tự (char)
-Đây là kiểu dữ liệu về kí tự mỗi biến char sẽ có giá trị là một kí tự Unicode.
Ví dụ: ’a’,’b’, ‘d’,’$’,…
-Chú ý, giá trị để gán cho các biến được đặt trong dấu nháy đơn ‘ ’, không phải là nháy kép “ ” nhé.
Vd: char kyTu; // Khai báo biến kyTu kiểu char
kyTu = ‘a’; // Gán giá trị biến kyTu là ký tự ‘a’
- Giá trị khởi tạo mặc định của kiểu char là null
d) Kiểu dữ liệu Boolean
- Đây là kiểu dữ liệu chỉ nhận một trong 2 giá trị true hoặc false (đúng hoặc sai)
- Giá trị khởi tạo mặc định của kiểu boolean là false
Page 21
4, Hằng
- Hằng là một giá trị bất biến trong chương trình
- Tên hằng được đặt theo qui ước giống như tên biến.
- Hằng số nguyên: trường hợp giá trị hằng ở dạng long ta thêm vào cuối chuỗi số chữ “l” hay “L”. (ví
dụ: 1L, 5L, 3L)
- Hằng số thực: truờng hợp giá trị hằng có kiểu float ta thêm tiếp vĩ ngữ “f” hay “F”, còn kiểu số
double thì ta thêm tiếp vĩ ngữ “d” hay “D”.
- Hằng Boolean: java có 2 hằng boolean là true, false.
- Hằng ký tự: là một ký tự đơn nằm giữa nằm giữa 2 dấu ngoặc đơn.
Ví dụ: ‘a’: hằng ký tự a
Một số hằng ký tự đặc biệt (photo)
- Hằng chuỗi: là tập hợp các ký tự được đặt giữa hai dấu nháy kép “ ”. Một hằng chuỗi không có ký
tự nào là một hằng chuỗi rỗng.
Ví dụ: “Ban dang tham gia khoa hoc Java mien phi tai Android.Vn”
Lưu ý: Hằng chuỗi không phải là một kiểu dữ liệu cơ sở nhưng vẫn được khai báo và sử dụng trong
các chương trình.
Cú pháp khai báo hằng: final + kiểu dữ liệu + tên hằng = giá trị cần gán, ví dụ: Mã:
final int NAM_SINH = 1992;
VIDEO HƯỚNG DẪN
Tham khảo video dưới đây của anh Việt bên blog StudyAndShare
Bài tập làm ngay khi đọc xong bài này, bạn thử làm bằng cách bình luận phía dưới, mình sẽ
chấm điểm cho từng bài của từng bạn để đánh giá kết quả học bài này của mỗi bạn
Page 22
Bài 1: Trong những tên biến sau, tên biến nào khai báo sai: a , c, _a, 3a, %s, *d, _e, class, _else,
super, $super, ^void, $goTo, Public, Return, If, _case, New, $new;
Bài 2: Khai báo 2 biến nguyên (int), gán giá trị bất kỳ cho 2 biến, tính tổng 2 số, gán tổng vào
biến t, in giá trị biễn t ra ngoài màn hình.
Bài 3: Khai báo hằng PI = 3.14 kiểu số thực, với biến r là bán kính đường tròn – kiểu số thực,
được gán vào trong thân chương trình, hãy viết chương trình tính diện tích và chu vi hình tròn,
in kết quả ra màn hình.
(Chú ý: Các bạn nên tự giác làm bài tập, hoàn thiện rồi đăng lên, các bài bạn đã làm, nên để
codetrong thẻ code - chọn thẻ PHP cho rõ ràng và để ẩn code trong thẻ ẩn spoiler, để khi click
vào mới hiện code lên , trước khi thử sức tự làm, bạn không nên nhìn code của các bạn khác đã đăng
nhé )
Page 23
Bài 4: Toán tử và biểu thức, hàm toán học trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 5/6/13.
Theo dõi chủ đề
Trang 1 / 51 2345Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 5,111
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Toán tử số học:
Ví dụ: PHP:
public class SoHoc {
public static void main(String[] args) {
int a, b, du, nguyen;
Page 24
a = 10;
b = 3;
du = a % b;
nguyen = a / b;
System.out.println("Phần dư (a:b) là: " + du);
System.out.println("Phần nguyên (a:b) là: " + nguyen);
a++;
System.out.println("Giá trị a đã tăng lên 1, giá trị mới là: " + a);
b--;
System.out.println("Giá trị của b đã giảm đi 1, giá trị mới là: " + b
);
System.out.println("Với 2 giá trị a, b mới trên, Tích (a x b) = " + a
* b);
}
}
Lưu ý: Với 2 câu lệnh a= a+1 và a++ có kết quả là như nhau, nhưng về bản chất có sự khác biệt: a = a+1 là gán a bằng giá trị a+1, còn phép a++ là tăng a lên 1, phép a++ đỡ tốn tài nguyên hơn, cú pháp ngắn gọn, các bạn nên chọn cách này để chương trình tối ưu hơn
2, Toán tử trên quan hệ, logic:
Ví dụ:
PHP:
public class QuanHeLogic {
public static void main(String[] args) {
boolean soSanh;
int a, b;
a = 5;
b = 10;
soSanh = (a == b);
System.out.println("Kết quả so sánh " + a + "=" + b + " không? " + so
Sanh);
soSanh = (a < b);
Page 25
System.out.println("Kết quả so sánh " + a + "<" + b + " không? " + so
Sanh);
soSanh = (a!=b);
System.out.println("Kết quả so sánh " + a + "#" + b + " không? " + so
Sanh);
soSanh = (a >= b);
System.out.println("Kết quả so sánh " + a + ">=" + b + " không? " + s
oSanh);
soSanh = (a < b)||(a==b);
System.out.println("Kết quả so sánh " + a + "<=" + b + " không? " + s
oSanh);
soSanh = !true;
System.out.println("Biến soSanh được gán bằng giá trị phủ định của tr
ue, giá trị đó là: "+soSanh);
}
}
3, Toán tử trên bit:
- Ở kiến thức cơ bản, chúng ta chưa nghiên cứu sâu vào những toán tử này, mình chỉ chú ý tới 2 phép đó là dịch trái, dịch phải. Hiểu cơ bản thì dịch trái dịch phải n bit cho kết quả giống việc bạn nhân với 2^n và chia cho 2^n (dịch trái – nhân, dịch phải - chia) - Vd số 16: Dịch trái đi 2 bit thì kết quả là nhân 16 x 2^2 = 64
Dịch phải đi 3 bit thì kết quả là chia 16 : (2^3) = 2
- Vậy tại sao có phép nhân, phép chia rồi, chúng ta lại cần biết 2 phép này. Vì 2 phép này tiết kiệm tài nguyên hệ thống hơn là bạn dùng phép chia thông thường. Nói chung, khi có thể, bạn nên dùng 2 phép này để chương trình chạy nhanh hơn. Nó cũng thể hiện tính chuyên nghiệp trong cách lập trình của bạn! (Phần này đa số các bạn học CNTT cơ bản đều được học, mình sẽ không giải thích nhiều, bạn nào chưa hiểu có thể tìm trên mạng xem. Nếu thấy không ổn, mình sẽ viết 1 bài viết nói về phần này!) Để biết cú pháp và cách sử dụng 2 phép này, bạn tham khảo chương trình dưới đây: PHP:
public class PhepDich {
public static void main(String[] args) {
int a, dichPhai1, dichPhai2, dichTrai1, dichTrai2;
a = 16;
Page 26
dichTrai1 = a << 1;
dichTrai2 = a << 2;
System.out.println("Giá trị a ban đầu: " + a);
System.out.println("Khi a dịch trái 1 bit thì giá trị là: " + dichTra
i1);
System.out.println("Khi a dịch trái 2 bit thì giá trị là: " + dichTra
i2);
System.out.println("\n"); // Xuống dòng
dichPhai1 = a >> 1; // Dịch phải 1 bit
dichPhai2 = a >> 2; // Dịch phải 2 bit
System.out.println("Giá trị a ban đầu: " + a);
System.out.println("Khi a dịch phải 1 bit thì giá trị là: " + dichPha
i1);
System.out.println("Khi a dịch phải 2 bit thì giá trị là: " + dichPha
i2);
}
}
4, Toán tử ép kiểu:
- Ép kiểu rộng (widening conversion): từ kiểu nhỏ sang
kiểu lớn (không mất mát thông tin) - Ép kiểu hẹp (narrow conversion): từ kiểu lớn sang kiểu
nhỏ (có khả năng mất mát thông tin)
<tên biến> = (kiểu_dữ_liệu) <tên_biến>;
Bạn hãy tham khảo chương trình nhỏ sau:
PHP:
public class EpKieu {
public static void main(String[] args) {
float soThuc;
int soNguyen;
soThuc = 10.6f;
soNguyen = (int) soThuc;
System.out.println("Số thực vào là: " + soThuc);
System.out.println("Số nguyên ép kiểu từ số thực là: " + soNguyen);
}
}
5, Một số hàm toán học:
Các bạn thao tác như sau, gõ “Math.” (có dấu chấm phía cuối), rồi ấn Ctrl + “cách”, IDE sẽ gợi ý cho bạn sẽ thấy rất nhiều hàm toán học có sẵn trong Java, bạn kéo xuống và chọn cái bạn cần.
Page 27
Vd: Math.min(a,b): tìm giá trị nhỏ nhất của 2 số a và b
Math.sqrt(b): tính căn của số b
Bạn xem ví dụ để hiểu một số hàm này PHP:
public class ToanHoc {
public static void main(String[] args) {
float a = -3.2f;
float b = 16.4f;
float triTuyetDoi;
float can;
float min;
triTuyetDoi = Math.abs(a);
System.out.println("Giá trị tuyệt đối của a là: "+triTuyetDoi);
can = (float) Math.sqrt(b);
System.out.println("Căn của b là: "+can);
min = Math.min(a, b); // Hàm tìm giá trị nhỏ nhất của 2 số
System.out.println("Giá trị nhỏ nhất của 2 số a và b là: "+min);
}
}
Ngoài bài viết trên, bạn cũng nên tham khảo thêm 1 video khá ngắn gọn và dễ hiểu của anh Việt bên Blog StudyAndShare
Bài tập về nhà:
Page 28
Bài 1: Các biến a, b, c là các số nguyên. Gán giá trị cho các biến. Tìm phần nguyên khi chia các số này cho 2, tìm phần dư khi chia các số này cho 3, in kết quả ra màn hình. Tăng giá trị a, b, c mỗi biến lên 1, in giá trị 3 số ra màn hình.
Bài 2: Giải phương trình 2ax+b = 8c với a, b, c là số thực – được gán giá trị trong chương trình, x cũng là số thực, là giá trị cần tìm. Sau khi tính x in kết quả ra màn hình, ép kiểu x về số nguyên, in kết quả ép kiểu của x ra màn hình!
Bài 3: Cho a, b, c là độ dài 3 cạnh tam giác, a, b, c được gán giá trị trong chương trình. Viết chương trình tính diện tích s của tam giác, in kết quả ra màn hình. Tìm số đo 3 góc của tam giác đó, in kết quả ra màn hình.
(Chú ý: Các bạn nên tự giác làm bài tập, hoàn thiện rồi đăng lên, các bài bạn đã làm, nên để code trong thẻ code - chọn thẻ PHP cho rõ ràng và để ẩn code trong thẻ ẩn spoiler, để khi click vào mới hiện code lên , trước khi thử sức tự làm, bạn không nên nhìn code của các bạn khác đã đăng nhé )
Page 29
Bài 5: Cấu trúc if ..else, biểu thức boolean và coding style
trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 20/8/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 3,416
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 30
1, Cấu trúc điều kiện if … else
Bây giờ, chúng ta bắt đầu vào chủ đề chính của bài viết này:
Với những bạn đã từng học lập trình pascal, c, hoặc 1 ngôn ngữ nào đó, thì có lẽ quá quen thuộc với
cấu trúc này. Chỉ có 1 chú ý nhỏ nếu như bạn nào mới chỉ học pascal đó là các khối lệnh trong Java
được đặt trong 2 dấu ngoặc nhọn: { <khối lệnh> } thay vì Begin <khối lệnh> End như trong pascal.
Dạng 1: PHP:
if (<điều_kiện>){
<khối_lệnh>;
}
Dịch ra ngôn ngữ nói thì nó là “Nếu ….thì….”
<điều_kiện> ở đây là dạng logic, nghĩa là nó chỉ có thể là đúng hoặc sai.
Ví dụ: Nếu số a chia hết cho 2 thì in ra thông báo đây là số chẵn. Chúng ta sẽ viết chương trình như
sau: PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
int a = 6;
if (a % 2 == 0) {
System.out.println("Thống báo: a là số chẵn");
}
}
}
Page 31
Dạng 2: PHP:
if (<điều_kiện>){
<khối _lệnh1>;
}else{
<khối _lệnh2>;
}
Dịch ra ngôn ngữ nói thì nó là: “Nếu ….thì…còn không thì ….”
Ví dụ yêu cầu : Nếu số a chia hết cho 2 thì in ra thông báo đây là số chẵn, còn không thì báo đây là
số lẻ. Chúng ta viết chương trình như sau: PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
int a = 7;
if (a % 2 == 0) {
System.out.println("Thống báo: a là số chẵn");
}else{
System.out.println("Thông báo: a là số lẻ");
}
}
}
2, Biểu thức Boolean
Phần này, anh Việt bên Blog StudyAndShare nói rất kỹ rồi, các bạn tham khảo video nhé!
3, Coding style – Cách viết mã lệnh trong Java
- Mình bổ sung thêm phần này vào trong bài này vì nó cũng ngắn gọn thôi, tuy vậy nó lại rất quan
trọng, nó giúp code Java của bạn đẹp, dễ nhìn, dễ hiểu, dễ sửa lỗi. Tất nhiên bạn có thể viết theo quy
cách bạn thích nhưng dưới đây là quy cách mà nhiều lập trình viên áp dụng. Có đôi chỗ bạn thấy có
những khái niệm chưa gặp bao giờ, bạn hãy bỏ qua, mai này quay lại đọc
- Tên biến, tên phương thức: Bắt đầu bằng chữ cái thường, các từ liền nhau, trừ từ đầu tiên, những từ
sau viết hoa chữ cái đầu. Ví dụ: ten, hoTen, lop, namSinh, maSinhVien, …v.v.
- Tên hằng: Viết in hoa, các từ cách nhau bởi dấu “_”, ví dụ: PI , HANG_SO, NAM_SINH, …
- Tên Object, tên class (lớp) viết hoa chữ cái đầu của mỗi từ, viết liền nhau, ví dụ: QuanLySinhVien,
HangHoa, ViDuDemo, …..
Tham khảo thêm video của anh Việt bên blog StudyAndShare
Ngoài ra, để hiểu kỹ, sâu hơn, bạn có thể đọc thêm 1 bài viết riêng về vấn đề này, nhưng khi mới bắt
đầu, để đỡ bị rối do chưa biết nhiều khái niệm, bạn nên bỏ qua , nhưng mình vẫn liệt kê vì mai này
chắc chắn bạn phải đọc lại , xem bài viết chi tiết về cách viết mã lệnh tại đây.
Page 32
Cách viết mã lệnh cho ngôn ngữ Java tốt
Bài tập về nhà:
Bài 1: Gán giá trị cho biến a trong chương trình. a là số nguyên. Xét xem a có chia hết cho 5 không,
nếu có báo ra màn hình là chia hết cho 5, nếu không, hãy tìm thương và số dư và in ra màn hình.
Bài 2: Với a, b, c là các số thực được gán trong chương trình, kể cả số âm và dương. Hãy báo ra màn
hình đây có phải là độ dài của 1 tam giác không, nếu có thì đó là của loại tam giác nào.
Bài 3: Giải phương trình bậc 2: ax^2 + bx + c = 0 với a, b, c là các số thực được gán giá trị trong
chương trình. In kết quả các nghiệm ra màn hình. (Nếu a = 0 báo ra màn hình đây không phải là phương trình bậc 2 và in nghiệm)
Page 33
Bài 6: Cấu trúc Switch Case trong Java! Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 7/6/13.
Theo dõi chủ đề
Trang 1 / 41 234Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 4,312
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Cấu trúc Switch…Case:
Page 34
Đơn giản, khi chúng ta cần xử lý các sự kiện liên quan tới nhiều trường hợp giá trị của biến, nếu dùng if - else nhiều thì code sẽ dài, lặp, không mạch lạc, nên chúng ta dùng cấu trúc Switch Case để thay thế! Nó không phải là cách tốt nhất nhưng là phù hợp với nhiều tình huống!
Trong Java, cấu trúc Switch Case được viết như sau: PHP:
switch (<biến>) {
case <giátrị_1> :
<khối_lệnh_1>;
break;
case <giátrị_2>:
<khối_lệnh_2>;
break;
….
case <giátrị_n>:
<khối_lệnh_n>;
break;
default:
<khốilệnhdefault>;
}
Và nó hoạt động như trong hình dưới:
Page 35
Ví dụ: Với yêu cầu sau: Viết chương trình, gán biến nguyên a là 1 giá trị bất kỳ. Nếu
a = 1 thì in ra màn hình là "Chủ nhật", a = 2 thì in ra "Thứ Hai", ..... a = 7 thì in ra
"Thứ Bảy". Nếu a không trong khoảng [1 ; 7] thì báo "Bạn đã gán sai giá trị, chỉ được
gán số nguyên từ 1 tới 7". Chương trình sử dụng Switch Case sẽ được viết như sau: PHP:
public class SwitchDemo {
public static void main(String[] args) {
int a = 3;
switch (a) {
case 1:
System.out.println("Chủ nhật");
break;
case 2:
System.out.println("Thứ Hai");
break;
case 3:
System.out.println("Thứ Ba");
break;
case 4:
System.out.println("Thứ Tư");
break;
case 5:
System.out.println("Thứ Năm");
break;
case 6:
System.out.println("Thứ Sáu");
break;
case 7:
System.out.println("Thứ Bảy");
Page 36
break;
default:
System.out.println("Bạn đã gán sai giá trị, chỉ được gán số n
guyên từ 1 tới 7");
break;
}
}
}
Chú ý:
- Kiểu dữ liệu của biến trong switch chỉ hỗ trợ kiểu dữ liệu: int, byte, short,char, từ JDK 7, hỗ trợ thêm kiểu String và các giá trị truyền vào trong mỗi case thì phải trùng kiểu dữ liệu với biến trong switch.
- Lệnh "break" trong cấu trúc này không phải là bắt buộc phải có thì chương trình mới chạy, bạn có thể không dùng "break" với trường hợp nhất định, nhưng khi đó, chương trình sẽ chạy hết các khối lệnh trong các "case" tiếp theo sau, kể từ khi chương trình tìm được "case" có giá trị truyền vào thỏa mãn, tới khi hết "case" hoặc gặp lệnh "break".
Bạn nên tham khảo 2 video của anh Việt bên Blog StudyAndShare để hiểu rõ
hơn về cấu trúc này:
Bài tập về nhà:
Bài 1: Gán biến a là 1 trong các số ngu yên từ 0 đến 9. Viết chương trình in ra tên các chữ số nhập vào bằng tiếng Anh. Ví dụ gán a bằng 1 thì chương
Page 37
trình chạy sẽ in ra “1 đọc là One”, gán a = 2 thì in ra “2 đọc là Two”
Bài 2: Khai báo 2 biến nguyên “thang” và “nam” gán giá trị là tháng và năm.Yêu cầu “thang” thuộc tập hợp [1..12], năm không được âm. - Nếu gán sai tháng thì báo “Bạn đã nhập sai tháng”, nếu gán sai năm thì báo “Bạn đã gán sai năm”. Khi 1 trong 2 thông tin bị gán sai, những câu lệnh sau sẽ không chạy! - Nếu năm đó là năm nhuận thì in ra thông báo: Đây là năm nhuận. không thì báo ra là năm thường. - Dựa vào thông tin năm đó là năm nhuận hay không và giá trị của tháng đó là tháng nào để báo ra tháng đó có bao nhiêu ngày.
Page 38
Bài 7: Nhập xuất dữ liệu trên giao diện Console Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 16/6/13.
Theo dõi chủ đề
Trang 1 / 41 234Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 3,713
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
- Mặc dù nếu giới thiệu theo thứ tự này thì có vẻ hơi sớm, vì nó liên quan đến khái
niệm đối tượng, input – output trong java (là 1 phần dài dài) nhưng do tiếp theo những
bài liên quan tới mảng, các vòng lặp sắp tới, sẽ phải nhập nhiều dữ liệu, chúng ta
không thể cứ gán giá trị trong chương trình.
Nói đơn giản, thì việc nhập dữ liệu này nó giống như ở lập trình pascal, C cơ bản –
thường thì nhập dữ liệu qua màn hình ms-dos (với java nếu bạn dùng câu lệnh java,
javac trong cmd thì nó cũng sẽ giống như vậy, nhưng bất tiện) .
- Ở đây, chúng ta có 1 giao diện tích hợp vào IDE, nơi mà ở những bài trước, các bạn
in kết quả ra (lệnhSystem.out.println…), và bây giờ, chúng ta nhập dữ liệu vào bằng
chính màn hình đó.
- Có nhiều cách để làm được điều này, nhưng ở bài này, mình sẽ giới thiệu cách mà
theo mình là ngắn gọn dễ hiểu nhất để nhập và lấy được các kiểu dữ liệu thông dụng :
kiểu nguyên, kiểu thực, kiểu chuỗi. (Đi sâu hơn, mình sẽ nói trong phần input – output
, chắc là vài bài nữa mới tới).
Đầu tiên là bạn phải thêm gói này vào ở đầu chương trình
Page 39
PHP:
import java.util.Scanner;
Trong chương trình, bạn tạo 1 đối tượng Scanner, tên đối tượng bạn tự đặt, ở đây tên
đối tượng mình đặt là “nhapDuLieu” PHP:
Scanner nhapDuLieu = new Scanner(System.in);
Sau đó, để đọc cả dòng văn bản (dùng nó để đọc chuỗi ký tự) ta dùng lệnh
nhapDuLieu.nextLine(), gán vào biến nào đó giá trị, vd mình dùng biến “ten” – kiểu
String PHP:
ten = nhapDuLieu.nextLine();
Tương tự, để đọc kiểu dữ liệu dạng số nguyên, số thực dùng lệnh : PHP:
nhapDuLieu.nextInt();
nhapDuLieu.nextFloat();
Bạn thử tự tìm hiểu thêm bằng cách gõ tên đối tượng Scanner rồi tìm gợi nhớ, ví dụ
gõ
nhapDuLieu. + Ctrl + Cách (space)
Bài demo: PHP:
package demo.android.vn;
import java.util.Scanner;
public class AndroidVn {
public static void main(String[] args) {
int tuoi;
String ten;
Scanner nhapDuLieu = new Scanner(System.in);
System.out.print("Nhập Tên: ");
ten = nhapDuLieu.nextLine();
System.out.print("Nhập Tuổi: ");
tuoi = nhapDuLieu.nextInt();
System.out.println("\nTên Vừa Nhập:" + ten+"\n");
System.out.println("Tuổi Vừa Nhập: " + tuoi);
}
}
Kết quả màn hình Console:
Page 40
Bài tập về nhà:
Bài 1: Từ màn hình console, nhập dữ liệu của 1 sinh viên là họ và tên, năm sinh,
điểm toán, lý , hóa (kiểu số thực). Dựa vào điểm trung bình 3 môn in ra đó là học sinh giỏi, khá hay trung bình
Page 41
Bài 8: Cấu trúc lặp while, do while, for trong Java! Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 16/6/13.
Theo dõi chủ đề
Trang 1 / 31 23Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 3,127
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Dạng 1: while(…)
while(điều_kiện_lặp){
khối_lệnh;
}
Xét điều kiện trước, đúng rồi mới thực hiện khối lệnh. Vd: PHP:
public class AndroidVn {
public static void main(String[] args) {
int i;
i = 0;
while (i < 10) {
System.out.print(" "+i++);
}
System.out.println("...i = "+i);
i = 15;
Page 42
while (i < 10) {
System.out.print(" "+i++);
}
System.out.println("...i = "+i);
}
}
Dạng 2: do{…}while;
do{
khối_lệnh;
}while(điều_kiện);
Thực hiện khối lệnh trước, rồi xét điều kiện, nếu sai thì không thực hiện nữa. Như
vậy, ngay cả điều kiện sai từ lần đầu, từ khối lệnh luôn được thực hiện ít nhất 1 lần.
Vd: PHP:
public class AndroidVn {
public static void main(String[] args) {
int i = 0;
do {
System.out.print(" " + i++);
} while (i < 10);
System.out.println("...i = " + i);
i = 15;
do {
System.out.print(" " + i++);
} while (i < 10);
System.out.println("...i = " + i);
}
}
Dạng 3: for(…)
for(khởi_tạo_biến_đếm;đk_lặp;tăng_biến){
<khối_lệnh>;
}
Vd: PHP:
public class AndroidVn {
public static void main(String[] args) {
int i;
for (i = 0; i < 10; i++) {
System.out.print(" " + i);
Page 43
}
System.out.println("\n..i = " + i);
}
}
Để hiểu hơn các cấu trúc, các bạn tham khảo thêm
Video của Blog StudyAndShare
Bài tập về nhà:
Bài 1: Từ màn hình console, nhập dữ liệu của biến a là 1 trong các số từ 1 đến 9. In
ra màn hình bảng nhân tương ứng với số vừa nhập. Giống hình bên bài 1 của hình
phía dưới:
Bài 2: In ra toàn bộ bảng cửu chương giống hình bài 2 trong hình phía dưới:
Page 45
Bài 9: Mảng trong Java! Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 28/6/13.
Theo dõi chủ đề
Trang 1 / 31 23Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 6,446
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Khái niệm mảng
Mảng là tập hợp nhiều phần tử có cùng tên, cùng kiểu dữ liệu
và mỗi phần tử trong mảng được truy xuất thông qua chỉ số của
nó trong mảng.
2, Khai báo mảng
Page 46
<kiểu dữ liệu> <tên mảng>[];
hoặc
<kiểu dữ liệu>[] <tên mảng>;
Ví dụ cách cách khai báo mảng: PHP:
int arrInt1[];
int[] arrInt2;
int[] arrInt3, arrInt4, arrInt5;
3, Cấp phát bộ nhớ cho mảng
Để cấp phát bộ nhớ cho mảng trong Java ta cần dùng từ khóa
new. (Tất cả trong Java đều thông qua các đối tượng). Chẳng
hạn để cấp phát vùng nhớ cho mảng trong Java ta làm như sau: PHP:
int arrInt = new int[100];
4, Khởi tạo mảng
Chúng ta có thể khởi tạo giá trị ban đầu cho các phần tử của
mảng khi nó được khai báo.
Ví dụ: PHP:
int arrInt[] = {1, 2, 3};
char arrChar[] = {‘a’, ‘b’, ‘c’};
String arrString[] = {“Nguyen Van A”, “Vu Van B”, “Vu Van C”’};
5, Truy cập mảng
Chỉ số mảng trong Java bắt đầu từ 0. Vì vậy phần tử đầu tiên có
chỉ số là 0, và phần tử thứ n có chỉ số là n - 1. Các phần tử của
mảng được truy xuất thông qua chỉ số của nó đặt giữa cặp dấu
ngoặc vuông ([]).
Ví dụ: PHP:
int arrInt[] = {1, 2, 3};
int x = arrInt[0]; // x sẽ có giá trị là 1.
int y = arrInt[1]; // y sẽ có giá trị là 2.
int z = arrInt[2]; // z sẽ có giá trị là 3.
Lưu ý: Trong những ngôn ngữ lập trình khác (C chẳng hạn),
một chuỗi được xem như một mảng các ký tự. Trong java thì
khác, java cung cấp một lớp String để làm việc với đối tượng
dữ liệu chuỗi cùng khác thao tác trên đối tượng dữ liệu này.
Code ví dụ:
Page 47
PHP:
public class ViDuArray {
public static void main(String[] args) {
int arrInt[];
arrInt = new int[4];
arrInt[0] = 9;
arrInt[1] = 17;
arrInt[2] = 13;
arrInt[3] = 14;
String arrString[] = {"Vu Van A", "Nguyen Van B", "Nguyen Van C"};
System.out.println("Mảng số nguyên: ");
for (int i = 0; i < 4; i++) {
System.out.print(arrInt[i] + " ");
}
System.out.println("\nMảng các chuỗi: ");
for (int i = 0; i < 3; i++) {
System.out.println(arrString[i] + " ");
}
System.out.println("");
}
}
6, Mảng nhiều chiều! (Theo dõi đoạn cuối video dưới)
Các bạn nên xem thêm video của anh Việt bên blog StudyAndShare, video giảng
về mảng trong Java khá ngắn gọn, dễ hiểu!
Bài tập về nhà:
Bài 1: Số sinh viên nhập từ bàn phím. Khai báo 1 mảng gồm danh sách họ tên sinh
Page 48
viên. Tên từng sinh viên nhập từ bàn phím. Sau khi nhập xong, chương trình hỏi nhập
tên sinh viên muốn tìm kiếm. Tìm và in ra kết quả là có trong danh sách hay không.
Bài 2: Sắp xếp 1 dãy n số nguyên nhập vào từ bàn phím theo thứ tự tăng dần!
Bài 3: Nhập các phần tử của 2 ma trận cùng số hàng số cột vào từ bàn phím. In 2 ma
trận ra màn hình. Tính tổng 2 ma trận! In kết quả ra màn hình!
Page 49
Bài 10: Break và Continue trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 7/7/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 3,022
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Lệnh break:
Trong cấu trúc switch chúng ta dùng câu lệnh break để thoát thỏi cấu trúc switch trong cùng chứa nó.
Tương tự như vậy, trong cấu trúc lặp, câu lệnh break dùng để thoát khỏi cấu trúc lặp trong cùng chứa
nó.
Trong thực tế, đặc biệt là các bài tìm kiếm, sẽ dùng break để thoát vòng lặp khi chúng ta đã tìm thấy
kết quả, tránh việc lặp tới tận cùng của vòng lặp, gây lãng phí tài nguyên, vì thế giúp chương trình
chạy nhanh hơn!
Page 50
Ví dụ 1 : Tìm kiếm số thứ tự của phần tử có giá trị là 10 trong 1 mảng các số nguyên: Show Spoiler
2, Lệnh continue:
Hiểu đơn giản, chúng ta thường dùng continue để bỏ qua vòng lặp hiện tại khi gặp điều kiện nào đó
để tiếp tục sang vòng lặp tiếp theo! Còn bản chất, vì nó cũng là 1 lệnh nhảy, nó nhảy xuống vị trí kết
thúc ("}") của khối lệnh trong vòng lặp chứa nó và bỏ qua tất cả các câu lệnh sau nó (Những câu lệnh
thuộc cùng khối lệnh với continue của vòng lặp)
Ví dụ 2: Tìm kiếm và in ra số thứ tự và giá trị các phần tử có giá trị nhỏ hơn 35 trong mảng các số
nguyên! Show Spoiler
Page 51
3, Nhãn (label):
Không giống như C/C++, Java không hỗ trợ lệnh goto để nhảy đến 1 vị trí nào đó của chương trình.
Java dùng kết hợp nhãn (label) với từ khóa break và continue để thay thế cho lệnh
goto. Tuy nhiên, ta cũng chỉ có thể sử dụng label đối với các vòng lặp mà thôi! PHP:
label:
for (…){
for (…){
if (<biểu thức điều kiện>){
break label;
}
else{
continue label;
}
}
}
Lệnh “label:”
Xác định vị trí của nhãn và xem như tên của vòng lặp ngoài. Nếu <biểu thức điều kiện> đúng thì lệnh
break label sẽ thực hiện việc nhảy ra khỏi vòng lặp có nhãn là “label”, ngược lại sẽ tiếp tục vòng lặp
có nhãn “label” (khác với break và continue thông thường chỉ thoát khỏi hay tiếp tục vòng lặp trong
cùng chứa nó).
Ví dụ 3: Bài sau đây nhập xuất ma trận, tìm kiếm chỉ số của phần tử tìm thấy đầu tiên theo yêu cầu! Show Spoiler
Bài tập về nhà:
Bài 1: Nhập 1 danh sách họ tên sinh viên 1 lớp học vào 1 mảng n phần tử. Sắp xếp
Page 52
theo thứ tự a, b, c ... rồi dùng thuật toán tìm kiếm nhị phân, tìm kiếm chính xác tên sinh viên vừa nhập và in ra màn hình số thứ tự của sinh viên đó!
Page 53
Bài 11: Thời gian hệ thống trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 7/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,687
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Tính thời gian chạy 1 đoạn lệnh trong chương trình
a, Tính thời gian theo mini giây: (10^(-3)s) Trong đối tượng System có phương thức "currentTimeMillis()", ta dùng nó để đánh dấu 1 mốc thời
gian tại
vị trí đặt câu lệnh. Để tính thời gian chạy xong 1 đoạn lệnh, ta đặt 2 biến để lấy ra 2 mốc
thời gian rồi lấy hiệu của chúng là tính được tổng thời gian chạy chương trình.
Ví dụ: Chương trình sau sẽ tính thời gian theo mini giây để máy tính sin của 100000 giá trị truyền
vào: PHP:
public class JavaDemoAndroidVn {
public static void main(String[] args) {
//Vd1
long start = System.currentTimeMillis();
for (int i = 1; i <= 100000; i++) {
System.out.println(Math.sin(i));
}
long end = System.currentTimeMillis();
long t = end - start;
System.out.println("Tổng thời gian: " + t + " millisecond");
Page 54
}
}
b, Tính thời gian theo nano giây (10^(-9)s) Tương tự như trên, chỉ khác là ta sẽ dùng phương thức "nanoTime()" trong đối tượng System thay vì
dùng phương thức "currentTimeMillis()"
2, Lấy thời gian từ hệ thống
Bạn xem ví dụ sau, sẽ lấy thời gian từ giờ, phút, giây và ngày, tháng, năm từ hệ thống và hiển thị ra
bên ngoài: PHP:
public class JavaDemoAndroidVn {
public static void main(String[] args) {
//Vd2
//Lay gio he thong
Date thoiGian = new Date();
//Khai bao dinh dang ngay thang
SimpleDateFormat dinhDangThoiGian = new SimpleDateFormat("HH:mm:ss dd
/MM/yyyy ");
//parse ngay thang sang dinh dang va chuyen thanh string.
String hienThiThoiGian = dinhDangThoiGian.format(thoiGian.getTime());
System.out.println("" + hienThiThoiGian);
}
}
Các bạn nên tham khảo Video của anh Việt bên Blog StudyAndShare
Bài tập về nhà:
Các bạn làm lại các ví dụ trên cho thành thạo!
Page 55
Bài 12: Class (lớp) và đối tượng trong Java! Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 12/7/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 3,235
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Để có kiến thức tổng quan và một vài khái niệm mới trong lập trình hướng đối tượng
Trước tiên, bạn hãy đọc thật kỹ bài này:
Lập trình hướng đối tượng với công nghệ Java
Rồi xem video anh Việt bên blog StudyAndShare:
Ở bài này, mình sẽ chỉ viết về class trong Java và chúng ta bắt đầu thực hành, làm bài tập nhỏ để làm
quen với class.
1. Khái niệm class (lớp):
Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm
dữ liệu của đối tượng (fields hay properties) và các phương thức (methods) tác động lên thành phần
dữ liệu đó gọi là các phương thức của lớp.
Các đối tượng được xây dựng bởi các lớp nên được gọi là các thể hiện của lớp (class instance).
Lớp trong java gần giống như bản ghi trong lập trình C hoặc pascal, nhưng tất nhiên nó cao cấp hơn.
Ví dụ 1: Ta khai báo 1 lớp SinhVien gồm các thuộc tính:
- hoTen
Page 56
- namSinh
- lopHoc.
Lớp này chính là 1 khuôn mẫu. Khi ta tạo ra các đối tượng dựa trên lớp này, các đối tượng đều tương
tự như mẫu trên.
Vd : Tạo đối tượng a, khi đó a sẽ có 3 thuộc tính, và ta có thể thao tác gán giá trị các thuộc tính đó như
sau:
- hoTen là "Nguyễn Văn A";
- namSinh là "1992";
- lopHoc là "At7a";
đối tượng b, c, ... cũng tương tự nhưng giá trị của chúng sẽ đặc trưng cho từng đối tượng riêng. Có lẽ,
các bạn sẽ thấy nó có vẻ giống với các bản ghi nếu như bạn đã được học lập trình C hoặc Pascal.
2. Khai báo/định nghĩa lớp:
PHP:
class <ClassName> {
<kiểu dữ liệu> <field_1>;
<kiểu dữ liệu> <field_2>;
constructor
method_1
method_2
}
- class: là từ khóa của java
- ClassName: là tên chúng ta đặt cho lớp
- field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp.
- constructor: là sự xây dựng, khởi tạo đối tượng lớp.
- method_1, method_2: là các phương thức/hàm thể hiện các thao tác xử lý, tác động lên các thành
phần dữ liệu của lớp.
Ở bài này, tạm thời chúng ta sẽ chưa quan tâm tới constructor và method nhé, những bài sau mình sẽ
viết rõ về những khái niệm đó.
Các bạn hãy xem vd2 code về lớp để định nghĩa những gì đã viết trong ví dụ 1
Ví dụ 2: (Ở đây, tạm thời chưa cần hiểu public là gì nhé, xuống phần dưới sẽ nói kỹ hơn) PHP:
class SinhVien {
public String hoTen;
public int namSinh;
public String lopHoc;
}
3. Tạo đối tượng của lớp:
ClassName objectName = new ClassName();
Ví dụ 3: Tạo 2 đối tượng sinh viên a và sinh viên b dựa trên class đã định nghĩa ở ví dụ 2: PHP:
SinhVien a = new SinhVien();
SinhVien b = new SinhVien();
Page 57
4. Thuộc tính của lớp
Vùng dữ liệu (fields) hay thuộc tính (properties) của lớp được khai báo bên trong lớp như sau:
PHP:
class <ClassName>{
// khai báo những thuộc tính của lớp
<tiền tố> <kiểu dữ liệu> field1;
// …
}
Để xác định quyền truy xuất của các đối tượng khác đối với vùng dữ liệu của lớp người ta thường
dùng 3 tiền tố sau:
- public: có thể truy xuất từ tất cả các đối tượng khác
- private: một lớp không thể truy xuất vùng private của 1 lớp khác.
- protected: vùng protected của 1 lớp chỉ cho phép bản thân lớp đó và những lớp dẫn xuất từ lớp đó
truy cập đến.
Xem thêm video Blog StudyAndShare về các thuộc tính này:
Ví dụ 4: PHP:
class SinhVien{
public String hoTen;
private int namSinh;
protected String lopHoc;
public static String tenTruong = "HV KT Mật Mã";
}
- Thuộc tính "hoTen" có thể được truy cập đến từ tất cả các đối tượng khác. (public)
- Thuộc tính "namSinh" chỉ có thể truy cập được từ các đối tượng có kiểu "SinhVien"(private)
- Thuộc tính "lopHoc", so có thể truy cập được từ các đối tượng có kiểu "SinhVien" và các đối tượng
của các lớp con dẫn xuất từ lớp "SinhVien" (protected)
- "tenTruong" là biến tĩnh có giá trị là "HV KT Mật Mã"trong tất cả các thể hiện tạo ra từ lớp
"SinhVien" (public static)
Lưu ý: Thông thường để an toàn cho vùng dữ liệu của các đối tượng người ta tránh dùng tiền tố
public, mà thường chọn tiền tố private để ngăn cản quyền truy cập đến vùng dữ liệu của một lớp từ
các phương thức bên ngoài lớp đó.
Vậy class được định nghĩa, được viết ở vị trí nào trong 1 bài lập trình Java hướng đối tượng. Việc tạo
đối tượng, truy cập dữ liệu của các đối tượng được tạo tạo những class đó ra sao! Ở bài sau mình sẽ
viết rõ và kỹ hơn để các bạn có cái nhìn cụ thể!
Kết thúc bài này, mình sẽ viết 1 ví dụ đơn giản:
Ví Dụ 5: Tạo class sinh viên gồm các thuộc tính: hoTen, namSinh, lopHoc
Tạo 2 đối tượng là sinh viên a và sinh viên b. Gán giá trị cho các thuộc tính và in giá trị các thuộc
tính từng sinh viên ra màn hình! PHP:
Page 58
package javademoandroidvn;
//Vd5
class SinhVien {
public String hoTen;
public int namSinh;
public String lopHoc;
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
SinhVien a = new SinhVien();
a.hoTen = "Vũ Văn Tường";
a.namSinh = 1992;
a.lopHoc = "At7a";
SinhVien b = new SinhVien();
b.hoTen = "Nguyễn Văn Tùng";
b.namSinh = 1990;
b.lopHoc = "Bk1";
System.out.println("Thông tin sinh vien a là: ");
System.out.println("Họ tên: " + a.hoTen + " Năm sinh: " + a.namSinh +
" Lớp Học: " + a.lopHoc);
System.out.println("\nThông tin sinh vien b là: ");
System.out.println("Họ tên: " + b.hoTen + " Năm sinh: " + b.namSinh +
" Lớp Học: " + b.lopHoc);
}
}
Tham khảo thêm video bên blog StudyAndShare
Page 59
Bài tập về nhà:
Bài 1: Tạo class HocSinh gồm 3 thuộc tính: Họ tên, lớp, điểm trung bình.
Tạo 2 đối tượng học sinh a và học sinh b, giá trị của các thuộc tính của 2 đối tượng
được nhập từ bàn phím. So sánh điểm trung bình giữa 2 đối tượng tìm ra người có điểm cao hơn báo ra màn hình console!
Page 60
Bài 13: Class trong Java (tiếp) Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 14/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,130
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Sau bài viết này, các bạn sẽ có cái nhìn toàn diện hơn về class trong 1 project Java (interface, abstract
class tương tự), các bạn áp dụng để viết code sao cho dễ nhìn dễ hiểu và dễ quản lý. Chọn cách viết
nào cho phù hợp với từng bài tập, từng project. Sau bài này, các bạn cũng sẽ hiểu hơn về lập trình
hướng đối tượng trong java.
1, Bài có 1 class, dùng class chứa hàm main!
Khi bạn lên mạng, tìm code, bạn sẽ thấy người ta thường dùng cách này
Thường có 1 class duy nhất. Cách viết này thường dùng để chia sẻ thuật toán, cú pháp hoặc giới thiệu
các phương thức của 1 đối tượng trong thư viện nào đó.
Ví dụ 1: Một bài tập quản lý sinh viên nhỏ: PHP:
package sinh.vien;
public class SinhVien {
public String hoTen;
public int namSinh;
public float toan, ly, hoa;
Page 61
public static void main(String[] args) {
SinhVien a = new SinhVien();
a.hoTen = "Vũ Văn A";
a.namSinh = 1992;
a.toan = 10.0f;
a.ly = 9.0f;
a.hoa = 9.5f;
System.out.println("Điểm Tb là: " + (float) (a.toan + a.ly + a.hoa) /
3);
}
}
Khi làm bài tập hoặc làm các project, ít khi dùng cách này, nó không hay cho việc quản lý, giới thiệu
để các bạn có thể đọc và hiểu nếu như gặp phải những bài chia sẻ dạng trên!
2, Class đặt cùng file class chứa hàm main
Vị trí đặt ngoài class chứa chương trình chính, ở bài trước, mình có viết ví dụ theo cách này! Nó chỉ
thích hợp với bài ít class, class ít thuộc tính và phương thức. Nếu bài có nhiều class, mỗi class có
nhiều phương thức, điều này cũng không tốt, sẽ rất khó nhìn và quản lý cũng như nâng cấp!
Ví dụ 2: Nội dung bài như ở Vd1, bổ sung thêm class giảng viên, nhưng sẽ bố trí lại vị trí class như
sau:
PHP:
package truong.hoc;
class SinhVien {
public String hoTen;
public int namSinh;
public float toan, ly, hoa;
}
class GiangVien {
public String hoTen;
public int namSinh;
public String mon;
public int luong;
}
public class Main {
public static void main(String[] args) {
SinhVien a = new SinhVien();
a.hoTen = "Vũ Văn A";
a.namSinh = 1992;
a.toan = 10.0f;
a.ly = 9.0f;
a.hoa = 9.5f;
System.out.println("Điểm Tb là: " + (float) (a.toan + a.ly + a.hoa) /
3);
GiangVien gv1 = new GiangVien();
Page 62
}
}
Chú ý: Chương trình vẫn chạy nếu bạn để các class SinhVien và GiangVien ở phía cuối chương
trình, chỉ cần nằm ngoài class Main là được
3, Mỗi class đặt riêng 1 file, cùng 1 gói (package)
Cách này ở các bài tập có nhiều class, các class cùng 1 loại.
Ví dụ 4: Các class cùng là nhân sự của 1 trường
học: SinhVien, GiangVienKhoa1,GiangVienKhoa2.
Với bài này, chúng ta sẽ tạo project với 1 package là truong.hoc, trong
package này sẽ có 4 file như sau:
File "main.java" chứa hàm main: PHP:
package truong.hoc;
public class Main {
public static void main(String[] args) {
SinhVien a = new SinhVien();
a.hoTen = "Vũ Văn A";
a.namSinh = 1992;
a.toan = 10.0f;
a.ly = 9.0f;
a.hoa = 9.5f;
System.out.println("Điểm Tb là: " + (float) (a.toan + a.ly + a.hoa) /
3);
GiangVien1 gv1 = new GiangVien1();
}
}
File GiangVien.java là 1 class, bạn tạo bằng cách nháy chuột phải vào package chọn New --> Java
Class, nội dung như sau: PHP:
package truong.hoc;
class SinhVien {
public String hoTen;
public int namSinh;
public float toan, ly, hoa;
}
File GiangVien1.java: PHP:
package truong.hoc;
class GiangVien1 {
public String hoTen;
public int namSinh;
public String mon;
Page 63
public int luong;
}
File GiangVien2.java: PHP:
package truong.hoc;
class GiangVien2 {
public String hoTen;
public int namSinh;
public String mon;
public int luong;
public String phongThucHanh;
}
Nhờ vào IDE, việc quản lý các class trở lên tiện lợi hơn rất nhiều!
4, Các class được đặt ở nhiều package khác nhau:
Với những project thực tế, sẽ có rất nhiều class khác nhau được để ở nhiều gói (package) khác nhau.
Ví dụ 4: Project này sẽ mở rộng từ các ví dụ trên. Tạo 1 project có tên: QuanLyTruongHoc. Trong
project có 3 package: truong.hoc, nhan.su, thu.vien.sach
Page 64
Code bài 4 dài mình đính kèm phía dưới, các bạn Import vào IDE là ok!
Tham khảo video bên StudyAndShare
Bài tập về nhà:
Đọc hiểu và code lại các ví dụ! Đọc thêm: Tạo 1 đối tượng Java đầu tiên của bạn
Page 65
Bài 15: Phương thức setter và getter trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 14/7/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,356
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 66
Ở bài 12 mình có viết chú ý 1 điều như này: Thông thường để an toàn cho vùng dữ liệu của các đối tượng người ta tránh dùng tiền tố public, mà thường chọn tiền tố private để ngăn cản quyền truy cập đến vùng dữ liệu của một lớp từ các phương thức bên ngoài lớp đó.
Ở các ví dụ trước, các thuộc tính mình thường để public , chương trình chạy, nhưng đó không phải là
cách ổn. Nếu chuyển về private, mà bạn vẫn truy cập các thuộc tính như các bài ví dụ trước thì sẽ lỗi
như này:
Page 67
Vậy làm như nào để truy cập các thuộc tính của đối tượng để private?
1, Biến this
Đầu tiên bạn cần hiểu biến này là gì?
Biến this là một biến ẩn tồn tại trong tất cả các lớp trong ngôn ngữ java. Một class trong Java luôn
tồn tại một biến this, biến this được sử dụng trong khi chạy và tham khảo đến bản thân lớp chứa nó.
2, Phương thức setter
Mục đích của phương thức setter là chúng ta dùng nó để truy cập vào thuộc tính của đối tượng và gán
giá trị cho các thuộc tính của đối tượng! Tên gọi, hay cách bạn đặt tên phương thức này là tùy bạn,
nó cũng vẫn chạy nhưng theo style code lập trình viên thường làm thì nó sẽ thường là set....
Ví dụ 1: PHP:
package javademoandroidvn;
class HocSinh {
private String hoTen;
private String lop;
private float diemTb;
public void setHoTen(String hoTen1) { //hoTen1 là biến cục bộ nhập vào, t
hường để trùng tên thuộc tính như các hàm setter phía dưới
this.hoTen = hoTen1;
Page 68
}
public void setLop(String lop) {
this.lop = lop;
}
public void setDiemTb(float diemTb) {
this.diemTb = diemTb;
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
HocSinh a = new HocSinh();
a.setHoTen("Vu Van T");
a.setLop("At7a");
a.setDiemTb(7.5f);
}
}
2, Phương thức getter
Cũng tương tự như phương thức setter, nó cũng dùng để truy cập vào các thuộc tính
của đối tượng, nhưng ngược lại setter, phương thức getter sẽ trả về các thuộc tính của đối tượng!
Ví dụ 2: PHP:
package javademoandroidvn;
class HocSinh {
private String hoTen;
private String lop;
private float diemTb;
public void setHoTen(String hoTen1) { //hoTen1 là biến cục bộ nhập vào, t
hường để trùng tên thuộc tính như các hàm setter phía dưới
this.hoTen = hoTen1;
}
public void setLop(String lop) {
this.lop = lop;
}
public String getHoTen() {
return hoTen;
}
public String getLop() {
return lop;
}
public float getDiemTb() {
return diemTb;
Page 69
}
public void setDiemTb(float diemTb) {
this.diemTb = diemTb;
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
HocSinh a = new HocSinh();
a.setHoTen("Vu Van T");
a.setLop("At7a");
a.setDiemTb(7.5f);
System.out.println("Họ tên: " + a.getHoTen());
System.out.println("Lớp: " + a.getLop());
System.out.println("Điểm Tb: " + a.getDiemTb());
}
}
Các bạn nên xem video sau của blog StudyAndShare để hiểu hơn!
3, Cách tự chèn các phương thức getter và setter:
Khi bạn mới code java thì chưa nên dùng cách này, thực sự hiểu getter và setter rồi thì mới nên dùng.
Ở cả 2 IDE phổ biến đều hỗ trợ tự chèn các phương thức getter và setter. Với những bài khi khai báo
nhiều biến, dùng tính năng này sẽ rất tiện!
Với Netbeans:
Bạn nháy chuột phải lên vị trí soạn thảo code, chọn Insert Code
Sau đó sẽ hiện ra 1 menu nhỏ, bạn chọn getter, setter hoặc getter and setter tùy mục đích bạn dùng!
Bạn sẽ thấy Netbeans tự sinh code cho các phương thức đó!
Page 70
Với Eclipese: Bạn vào Source --> Generate Getter and Setter rồi chọn biến cần tạo phương
thức getter và setter là được!
Page 72
Bài tập về nhà:
Bài 1: Tạo package nhân sự, trong có 2 class là sinh viên và giảng viên
Class sinh viên gồm các thuộc tính: họ tên, lớp học, điểm toán, lý, hóa.
Class giảng viên gồm các thuộc tính: họ tên, lớp dạy, năm sinh, lương.
Tạo đối tượng học sinh a.
Tạo đối tượng giảng viên b.
Các giá trị của thuộc tính a và b nhập vào từ bàn phím.
Xử lý dữ liệu báo ra thông tin của a và b, tính và báo ra điểm trung bình của a,
xếp loại học lực, báo b có dạy a hay không!
Các thuộc tính để private, sử dụng phương thức getter, setter. Lập trình hướng đối tượng!
Page 73
Bài 16: Tính kế thừa (inheritance) trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 15/7/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,455
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Tính kế thừa trong Java cũng tương tự như mô hình trên!
1, Khái niệm:
Page 74
Một lớp con (subclass) có thể kế thừa tất cả những vùng dữ liệu và phương thức của một lớp khác
(siêu lớp - superclass).
Như vậy việc tạo một lớp mới từ một lớp đã biết sao cho các thành phần (fields và methods) của lớp
cũ cũng sẽ thành các thành phần (fields và methods) của lớp mới. Khi đó ta gọi lớpmới là lớp dẫn
xuất (derived class) từ lớp cũ (superclass).
Có thể lớp cũ cũng là lớp được dẫn xuất từ một lớp nào đấy, nhưng đối với lớp mới vừa tạo thì lớp cũ
đó là một lớp siêu lớp trực tiếp (immediate supperclass).
Dùng từ khóa extends để chỉ lớp dẫn xuất. PHP:
class A {
//...
}
class B extends A{
//...
}
Như trên class B đã kết thừa từ class A.
** Chú ý: Java cung cấp 3 tiền tố/từ khóa để hỗ trợ tính kế thừa của lớp:
- public: lớp có thể truy cập từ các gói, chương trình khác.
- final: Lớp hằng, lớp không thể tạo dẫn xuất (không thể có con), hay đôi khi người ta gọi là lớp “vô
sinh”.
- abstract: Lớp trừu tượng (không có khai báo các thành
phần và các phương thức trong lớp trừu tượng). Lớp dẫn xuất sẽ khai báo, cài đặt cụ thể các thuộc
tính, phương thức của lớp trừu tượng.
(Những điều này ta sẽ bàn đến ở những bài sau)
2, Ví dụ:
Tạo 3 class gồm các thuộc tính tương ứng:
Class "nhân sự" gồm: họ tên, năm sinh, quê quán.
Class "học sinh" gồm: họ tên, năm sinh, quê quán, điểm trung bình.
Class "giáo viên" gồm: họ tên, năm sinh, quê quán, lương hàng tháng.
Như vậy, nếu như chúng ta không sử dụng tính kế thừa thì sẽ xảy ra tình trạng lặp code, nghĩa là khi
khai báo 2 lớp "học sinh" và "giáo viên" sẽ khai báo lại các thuộc tính họ tên, năm sinh, quê quán
Để sử dụng tính kế thừa, ta chỉ cần khai báo lớp "nhân sự", sau đó 2 lớp còn lại ta kế thừa từ lớp
"nhân sự" , thiếu thuộc tính, phương thức nào thì sẽ bổ sung vào lớp đó.
Xem bài làm dưới đây:
a, Tạo các thuộc tính để public, và kế thừa: (Để thuộc tính public như này cho ngắn gọn, các
bạn dễ hiểu trước) PHP:
package javademoandroidvn;
class NhanSu {
public String hoTen;
public int namSinh;
Page 75
public String queQuan;
}
class HocSinh extends NhanSu{
public float diemTb;
}
class GiaoVien extends NhanSu{
public int luong;
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
NhanSu ns = new NhanSu();
ns.hoTen = "Nhân Sự A";
ns.namSinh = 1990;
ns.queQuan = "Hải Dương";
HocSinh hs = new HocSinh();
hs.hoTen = "Vũ Văn A"; // Đối tượng tạo ra từ lớp "học sinh" k
ế thừa, sử dụng các thuộc tính của lớp "nhân sự"
hs.namSinh = 1992;
hs.queQuan = "Hải Dương";
hs.diemTb = 9.5f;
GiaoVien gv = new GiaoVien();
gv.hoTen = "Nguyễn Văn B"; // Đối tượng tạo ra từ lớp "giáo viên"
kế thừa, sử dụng các thuộc tính của lớp "nhân sự"
gv.namSinh = 1980;
gv.queQuan = "Hà Nội";
gv.luong = 300000000;
}
}
b, Tạo các thuộc tính để private, các phương thức cũng sẽ được kế thừa:
(Cụ thể là các phương thức getter và setter ở ví dụ này) PHP:
package javademoandroidvn;
class NhanSu {
private int namSinh;
private String queQuan;
private String hoTen;
public String getHoTen() {
return hoTen;
}
public void setHoTen(String hoTen) {
this.hoTen = hoTen;
}
public int getNamSinh() {
return namSinh;
}
public void setNamSinh(int namSinh) {
Page 76
this.namSinh = namSinh;
}
public String getQueQuan() {
return queQuan;
}
public void setQueQuan(String queQuan) {
this.queQuan = queQuan;
}
}
class HocSinh extends NhanSu {
private float diemTb;
public float getDiemTb() {
return diemTb;
}
public void setDiemTb(float diemTb) {
this.diemTb = diemTb;
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
NhanSu ns = new NhanSu();
ns.setHoTen("Nhân Sự A");
ns.setNamSinh(1990);
ns.setQueQuan("Hải Dương");
HocSinh hs = new HocSinh();
hs.setHoTen("Vũ Văn A"); // Đối tượng tạo ra từ lớp "học sinh" k
ế thừa, sử dụng các thuộc tính, phương thức của lớp "nhân sự"
hs.setNamSinh(1992);
hs.setQueQuan("Hải Dương");
hs.setDiemTb(9.5f);
System.out.println("Thông tin học học sinh: ");
System.out.println("Họ tên: " + hs.getHoTen());
System.out.println("Năm sinh: " + hs.getNamSinh());
System.out.println("Quê quán: " + hs.getQueQuan());
System.out.println("Điểm trung bình: " + hs.getDiemTb());
}
}
Tham khảo thêm video bên blog StudyAndShare, có thể có 1 vài khái niệm bạn sẽ chưa hiểu, sau vài
bài nữa, bạn nên xem lại video này!
Page 77
Bài tập về nhà:
Bài 1: Dùng tính kế thừa khai báo 3 class:
Class "Sinh Viên" gồm các thuộc tính: Họ tên, năm sinh, mã thẻ, tiền học phí còn nợ.
Class "Giảng Viên" gồm các thuộc tính: Họ tên, năm sinh, mã thẻ, tiền lương hàng tháng.
Class "Giám Đốc" gồm các thuộc tính: Họ tên, năm sinh, mã thẻ, tiền tiêu hàng tháng.
Các thuộc tính để private, truy cập các thuộc tính sử dụng phương thức getter và setter
Tạo 1 đối tượng giảng viên, giá trị nhập vào từ bàn phím, in thông tin ra ngoài
màn hình console
Đọc thêm: Tính kế thừa và tính trừu tượng trong Java
Page 78
Bài 17: Nạp chồng phương thức (overloading method) trong
Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 15/7/13.
Theo dõi chủ đề
Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,082
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 79
Khi yêu cầu 3 con vật cùng 1 yêu cầu "speak", 3 con vật trả lại 3 kết quả khác nhau!
1, Khái niệm nạp chồng phương thức overloading method:
Việc khai báo trong một lớp nhiều phương thức có cùng tên nhưng khác tham số (khác kiểu dữ liệu,
khác số lượng tham số) gọi là khai báo chồng phương thức (overloading method).
2, Ví dụ:
Overloading method dùng làm gì?, ta xét bài tập nhỏ:
Tính diện tích hình vuông, tính diện tích hình hình chữ nhật, tính diện tích hình tam giác.
Ta sẽ tạo ra 3 phương thức đều tên là dienTich sao cho, nếu như
Có 1 tham số truyền vào, nó sẽ tự hiểu là cần tính diện tích hình vuông
Có 2 tham số truyền vào, nó tự hiểu là tính diện tích hình chữ nhật
Có 3 tham số truyền vào, nó tự hiểu là tính diện tích hình tam giác.
Code: PHP:
package javademoandroidvn;
class Hinh {
public float dienTich(float a) {
return (float) a * a;
}
public float dienTich(float a, float b) {
return (float) a * b;
}
public double dienTich(float a, float b, float c) {
float p;
p = (float) (a + b + c) / 2;
Page 80
return Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
Hinh h = new Hinh();
System.out.println("Diện tích hình vuông có cạnh 2 : " + h.dienTich(2
));
System.out.println("Diện tích hình chữ nhật có 2 cạnh là 4 và 5 : " +
h.dienTich(4, 5));
System.out.println("Diện tích hình tam giác có 3 cạnh là 3, 4, 5 : "
+ h.dienTich(3, 4, 5));
}
}
Tham khảo thêm 2 video bên blog StudyAndShare:
Bài tập về nhà:
Bài 1: Class hàng hóa gồm các thuộc tính: mã hàng, tên hàng, giá, số lượng.
Tạo phương thức tính tiền tổng hóa đơn hàng hóa đó với 2 tham số truyền vào là giá, và số lượng.
Tạo phương thức nạp chồng phương thức trên, có thêm tham số truyền vào nữa là % giảm giá. Tính
tiền dựa vào các thông số này! Tạo đối tượng dựa và class trên và hiện thị thông tin hóa đơn ra ngoài theo từng trường hợp!
Page 81
Bài 18: Ghi đè phương thức (Overriding Method) trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 16/7/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,094
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 82
1, Khái niệm ghi đè – override:
- Đó là khi phương thức đã xuất hiện ở lớp cha và xuất hiện tiếp ở lớp con.
- Khi đối tượng thuộc lớp con gọi phương thức thì sẽ chọn lựa và chạy theo phương thức trong lớp
con.
- Nếu lớp con không có phương thức đó thì mới lên kiếm ở lớp cha để chạy.
- Phương thức ghi đè có cùng tên, cùng tham số truyền vào, cùng kiểu giá trị trả về với phương thức
ở lớp cha!
- Ghi đè là hình thức đa hình (polymorphism) trong quá trình thực thi (Runtime)
Ở bài trước, ta biết đến cách nạp chồng phương thức (Overloading method), nó cùng nằm trong 1
lớp. Còn ghi đè ở đây, là sau khi lớp con kế thừa lớp cha của nó, ta chỉnh lại 1 phương thức nào đó
cần thiết, tức là ghi đè để đạt được theo ý muốn!
2, Ví dụ:
Ví dụ 1: Sự khác nhau giữa Override và Overload
Ví dụ 2: - Lớp "tên người Việt" gồm 2 thuộc tính: "họ" và "tên" và phương thức hiển thị tên đầy đủ theo thứ
tự họ + tên
- Lớp "tên người nước ngoài" kế thừa từ lớp "tên người Việt" , phương thức hiển thị tên đầy đủ lại
theo thứ tự tên + họ
- Như vậy, sau khi kế thừa ta chỉ cần ghi đè lại phương thức hiển thị là xong!
Code: PHP:
package javademoandroidvn;
class tenNguoiViet {
Page 83
public String ten, ho;
public void show() {
System.out.println("Tên đầy đủ là: " + this.ho + " "+this.ten);
}
}
class tenNguoiNuocNgoai extends tenNguoiViet {
@Override
public void show() {
System.out.println("Full name: " + this.ten + " " + this.ho);
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
tenNguoiViet nguoiV = new tenNguoiViet();
nguoiV.ho = "Nguyen";
nguoiV.ten = "Hung";
nguoiV.show();
tenNguoiNuocNgoai nguoiNN = new tenNguoiNuocNgoai();
nguoiNN.ho = "Nguyen";
nguoiNN.ten = "Hung";
nguoiNN.show();
}
}
Ví dụ 3: - Lớp HocSinh gồm các thuộc tính: hoTen, lop, toan, ly, hoa và phương thức điểm trung bình là trung
bình cộng 3 môn
- Lớp HocSinhChuyenToan kế thừa từ phương thức HocSinh, nhưng khi tính điểm trung bình nhân
đôi hệ số môn Toán rồi cộng tất cả, chia cho 4. Như vậy cần ghi đè phương thức điểm trung bình ở
lớp HocSinhChuyenToan
Code: PHP:
package javademoandroidvn;
class HocSinh {
private String hoTen;
private String lop;
private float toan, ly, hoa;
public String getHoTen() {
return hoTen;
}
public void setHoTen(String hoTen) {
this.hoTen = hoTen;
}
public String getLop() {
return lop;
Page 84
}
public void setLop(String lop) {
this.lop = lop;
}
public float getToan() {
return toan;
}
public void setToan(float toan) {
this.toan = toan;
}
public float getLy() {
return ly;
}
public void setLy(float ly) {
this.ly = ly;
}
public float getHoa() {
return hoa;
}
public void setHoa(float hoa) {
this.hoa = hoa;
}
public float diemTrungBinh() {
return (float) (this.toan + this.ly + this.hoa) / 3;
}
}
class HocSinhChuyenToan extends HocSinh {
@Override
public float diemTrungBinh() {
return (float) (this.getHoa() + this.getLy() + this.getToan() * 2) /
4;
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
HocSinh a = new HocSinh();
a.setHoTen("Vu Van Tuong");
a.setLop("At7a");
a.setToan(10.0f);
a.setLy(9.0f);
a.setHoa(8.0f);
System.out.println("Diem trung binh cua hoc sinh a la: " + a.diemTrun
gBinh());
HocSinhChuyenToan b = new HocSinhChuyenToan();
Page 85
b.setHoTen("Nguyen Van B");
b.setToan(9.0f);
b.setHoa(7.0f);
b.setLy(8.0f);
System.out.println("Diem trung binh cua hoc sinh chuyen Toan b la: "
+ b.diemTrungBinh());
}
}
Tham khảo thêm 2 video bên blog StudyAndShare:
Bài tập về nhà:
Bài 1: - Class USB có các thuộc tính: mã hàng, giá, số lượng. Phương thức tổng tiền = giá * số lượng,
phương thức show in ra toàn bộ thông tin đơn hàng mua USB
- Class Mouse kế thừa từ class USB, ghi đè 2 phương thức tổng tiền (do chuột được giảm giá 20%)
và show in toàn bộ thông tin đơn hàng khi khách hàng mua chuột máy tính.
- Tạo mỗi lớp 1 đối tượng, nhập thông tin từ bàn phím, in thông tin đơn hàng ra màn hình!
- Code hướng đối tượng, các thuộc tính để private!
Đọc thêm: Nâng cấp đối tượng của bạn
Page 86
Bài 19: Phương thức khởi tạo (constructor) trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 17/7/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,931
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Constructor là gì?
Page 87
- Contructor thật ra là một loại phương thức đặc biệt của lớp.
- Constructor dùng gọi tự động khi khởi tạo một thể hiện của lớp, có thể dùng để khởi gán những giá
trị măc định. Các constructor không có giá trị trả về, và có thể có tham số hoặc
không có tham số.
- Constructor phải có cùng tên với lớp và được gọi đến dùng từ khóa new.
- Nếu một lớp không có constructor thì java sẽ cung cấp cho lớp một constructor mặc định (default
constructor). Những thuộc tính, biến của lớp sẽ được khởi tạo bởi các giá trị mặc định (số: thường là
giá trị 0, kiểu luận lý là giá trị false, kiểu đối tượng giá trị null, …)
- Bạn có thể định nghĩa nhiều phương thức khởi tạo cho một lớp.
- Giống như các phương thức khác, phương thức khởi tạo lớp có thể bị nạp chồng (overload)
** Lưu ý: thông thường để an toàn, dễ kiểm soát và làm chủ mã nguồn chương trình chúng ta nên
khai báo một constructor cho lớp.
*** Tham khảo thêm 2 video của Blog StudyAndShare về Constructor
2, Ví dụ về constructor:
Tạo lớp SinhVien với các thuộc tính hoTen, namSinh, diemTb, lop.
Tạo constructor có 2 tham số truyền vào và 1 constructor overload constructor đó, với 3 tham số
truyền vào: PHP:
package javaandroidvn;
class SinhVien {
private String hoTen;
private int namSinh;
private float diemTb;
private String lop;
public SinhVien() {
}
public SinhVien(String hoTen, int namSinh) {
this.hoTen = hoTen;
this.namSinh = namSinh;
this.lop = "At7a";
System.out.println("Họ tên: " + this.hoTen + " Năm sinh: " + this.nam
Sinh);
System.out.println("Lớp: " + this.lop);
}
//Overloading constructor method
public SinhVien(String hoTen, int namSinh, float diemTb) {
this.hoTen = hoTen;
this.namSinh = namSinh;
this.diemTb = diemTb;
this.lop = "At7a";
System.out.println("Họ tên: " + this.hoTen + " Năm sinh: " + this.nam
Sinh + " Điểm Trung Bình: " + this.diemTb);
System.out.println("Lớp: " + this.lop);
Page 88
}
}
public class JavaAndroidVn {
public static void main(String[] args) {
SinhVien a = new SinhVien("Vũ Văn T", 1992);
SinhVien b = new SinhVien("Trần Thu P", 1996, 9.0f);
}
}
Bài tập về nhà:
Bài 1: Class Đơn Hàng có các thuộc tính: tên hàng, mã hàng, giá bán, số lượng, tỷ lệ % giảm giá.
Tạo constructor có 4 thuộc tính đầu và thêm một overload constructor với 5 thuộc tính .
Cả 2 constructor đều show ra tổng tiền khi các đối tượng đơn hàng được tạo ra! (Làm tương tự ví dụ
trên).
(Chú ý: Các bạn nên tự giác làm bài tập, hoàn thiện rồi đăng lên, các bài bạn đã làm, nên để code
trong thẻ code - chọn thẻ PHP cho rõ ràng và để ẩn code trong thẻ ẩn spoiler, để khi click vào mới hiện code lên , trước khi thử sức tự làm, bạn không nên nhìn code của các bạn khác đã đăng nhé)
Page 89
Bài 20: Inner class trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 20/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,097
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Khái niệm:
Page 90
Một class nằm trong class khác được gọi là inner class. Inner class có thể coi như một thuộc tính của
class. Nghĩa là bạn không thể khởi tạo đối tượng B nếu chưa khởi tạo đối tượng A. PHP:
class A{
class B{
}
}
PHP:
A obj1 = new A();
A.B obj2 = obj1.new B();
Bởi class B nằm trong class A nên nó có thể truy cập tất cả các thuộc tính hay phương thức của class
A PHP:
class A {
private int x = 8;
class B {
public void printInt() {
System.out.println(x);
}
}
}
Để sử dụng method vừa tạo, ta có thể viết:
obj2.printInt();
2, Một số ví dụ:
Ví dụ 1: Ví dụ bên Blog StudyAndShare
PHP:
public class DemoJavaAndroidVn {
public static void main(String[] args) {
Outer out = new Outer();
out.show();
}
}
class Outer {
public void show() {
Inner in = new Inner();
in.display();
}
class Inner {
public void display() {
System.out.println("Đây là inner class.");
}
}
}
class B {
public void show() {
Outer.Inner in = new Outer().new Inner();
Page 91
in.display();
}
}
Ví dụ 2: PHP:
package javaandroidvn;
class ThoiGian {
public int ngay, thang, nam;
class Time {
public int gio, phut, giay;
public void showTime() {
System.out.println("Ngày " + ngay + "/" + thang + "/" + nam);
System.out.println("Time: " + this.gio + ": " + this.phut + ": "
+ this.giay);
}
}
}
public class JavaAndroidVn {
public static void main(String[] args) {
ThoiGian tg = new ThoiGian();
ThoiGian.Time time = tg.new Time();
tg.ngay = 20;
tg.thang = 7;
tg.nam = 1996;
time.gio = 20;
time.phut = 22;
time.giay = 01;
time.showTime();
}
}
Page 92
Bài tập về nhà: Làm lại thành thạo các ví dụ trên!
Đọc thêm: Các lớp con (lớp lồng nhau) trong lập trình Java
Page 93
Bài 21: Final class, abstract class và interface trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 20/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,773
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Final class (Lớp vô sinh):
Lớp không thể có lớp dẫn xuất từ nó (không có lớp con) gọi là lớp “vô sinh”, hay nói cách khác
không thể kế thừa được từ một lớp “vô sinh”. Lớp “vô sinh” dùng để hạn chế, ngăn ngừa các lớp
khác dẫn xuất từ nó.
Để khai báo một lớp là lớp “vô sinh”, chúng ta dùng từ khóa final class.
Tất cả các phương thức của lớp vô sinh đều vô sinh, nhưng các thuộc tính của lớp vô sinh thì có thể
không vô sinh.
- Xem thêm video blog StudyAndShare
Ví dụ: PHP:
public final class A {
public final int x;
private int y;
public final void method_1(){
// …
}
public final void method_2(){
Page 94
// …
}
}
2, Abstract class (Lớp trừu tượng):
Một lớp trừu tượng thì không có thể hiện nghĩa là ta không thể khởi tạo nó bằng toán tử new, và một
phương thức trong nó là abstract thì chỉ được đưa ra định nghĩa (khai báo) mà không được thực thi và
nó sẽ được override lại trong các lớp con kế thừa. Và trong lớp mà tồn tại phương thức abstract thì
lớp đó cũng được định nghĩa abstract.
- Lớp trừu tượng là lớp không có khai báo các thuộc tính thành phần và các phương thức.
- Bất cứ class nào kết thừa abstract class nào đó phải định nghĩa lại các abstract mothods của lớp mà
nó thừa kế hoặc không định nghĩa lại nhưng phải ghi lại abstract mothods đó.
- Abstract class là class có chứa các abstract mothods
- Các methods trong abstract class phải khai báo với từ khóa abstract (không giống như interface vì
interface mặc định gán abstract cho các mothods)
- Một abstract class có thể chứa cả abstract mothods và các mothods thường.
- Khi một class có chứa abstract mothod thì bắt buộc phải có từ khóa abstract đằng trước tên class đó.
PHP:
abstract class A{
abstract void method_1();
}
public class B extends A{
@Override
public void method_1(){
// cài đặt chi tiết cho phương thức method_1
// trong lớp con B.
// …
}
}
public class C extends A{
@Override
public void method_1(){
// cài đặt chi tiết cho phương thức method_1
// trong lớp con C.
// …
}
}
Lưu ý:
* Các phương thức được khai báo dùng các tiền tố private và static thì không được khai báo là trừu
tượng abstract. Tiền tố private thì không thể truy xuất từ các lớp dẫn xuất, còn tiền tố static thì chỉ
dùng riêng cho lớp khai báo mà thôi.
* Phương thức trong abstract class có 2 cách để khai báo:
- Khai báo bình thường như class
- Khai báo giống như interface nhưng phải có thêm từ khóa abstract
Code demo: PHP:
package java.demo.android.vn;
Page 95
abstract class nhanSu {
abstract void show();
}
class hocSinh extends nhanSu {
public String hoTen;
public int namSinh;
public void show() {
System.out.println("Hello " + hoTen + " Năm sinh: " + namSinh);
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
hocSinh a = new hocSinh();
a.hoTen = "Vũ Văn A";
a.namSinh = 1992;
a.show();
}
}
3, Interface (Khác với GUI - Nó không phải là giao diện người
dùng)
- Như chúng ta đã biết một lớp trong java chỉ có một siêu lớp (super class) trực tiếp hay một cha duy
nhất (đơn thừa kế). Để tránh đi tính phức tạp của đa thừa kế (multi-inheritance) trong lập trình hướng
đối tượng, Java thay thế bằng interface. Một lớp có thể kế thừa từ nhiều interface với các lớp khác để
thừa hưởng thêm vùng dữ liệu và phương thức của các interface này.
- Interface được khai báo như một lớp. Nhưng các thuộc tính của interface là các hằng (khai báo
dùng từ khóa final) và các phương thức của interface là trừu tượng (mặc dù không có từ
khóa abstract).
- Mothods trừu tượng là các mothods chỉ có phần header, không có phần body.(Xem ví dụ phía dưới)
- Trong các lớp có cài đặt các interface ta phải tiến hành cài đặt cụ thể các phương thức này.
- Interface được định nghĩa nhằm làm cho code rành mạch hơn vì các class có thể implements các
interface.
Ví dụ: Code ví dụ của video bên blog StudyAndShare
PHP:
public class DemoJavaBasic {
public static void main(String[] args) {
Manager mana = new Manager();
mana.show();
}
}
Page 96
interface Human{
public static final int AVG_AGE = 100;
int AVG_WEIGHT = 60;
public abstract void show();
void study();
}
class Manager implements Human{
@Override
public void show() {
System.out.println("Tuoi trung bình: "+ AVG_AGE);
}
@Override
public void study() {
// TODO Auto-generated method stub
}
}
Có một vấn đề khác với lớp là một giao diện (interface) không chỉ có một giao diện cha trực tiếp mà
có thể dẫn xuất cùng lúc nhiều giao diện khác (hay có nhiều giao diện cha). Khi đó nó sẽ kế thừa tất
cả các giá trị hằng và các phương thức của các giao diện cha. Các giao diện cha được liệt kê thành
chuỗi và cách nhau bởi dấu phẩy “,”. Khai báo như sau: PHP:
public interface InterfaceName extends interface1, interface2,interface3{
// …
}
Ví dụ: PHP:
interface DienTich {
public abstract void sHinhVuong(float a);
public abstract void sHinhChuNhat(float a, float b);
}
interface ChuVi {
public abstract void cVHinhVuong(float a);
public abstract void cVHinhChuNhat(float a, float b);
}
interface CongThuc extends DienTich, ChuVi {
}
class CongThucTinh implements CongThuc {
//Hoặc viết là class CongThucTinh implements DienTich,ChuVi cũng được!
@Override
public void sHinhVuong(float a) {
System.out.println("Diện tích hình vuông là: " + a * a);
Page 97
}
@Override
public void sHinhChuNhat(float a, float b) {
System.out.println("Diện tích hình chữ nhật là: " + a * b);
}
@Override
public void cVHinhVuong(float a) {
System.out.println("Chu vi hình vuông là: " + 4 * a);
}
@Override
public void cVHinhChuNhat(float a, float b) {
System.out.println("Chu vi hình chữ nhật là: " + 2 * (a + b));
}
}
public class JavaAndroidVn {
public static void main(String[] args) {
CongThucTinh x = new CongThucTinh();
x.sHinhVuong(5.0f);
x.cVHinhVuong(5.0f);
x.sHinhChuNhat(5.5f, 10.0f);
x.cVHinhChuNhat(5.5f, 10.0f);
}
}
Đọc thêm về Interface: Các interface (giao diện, bề mặt) trong lập trình Java
4, So sánh abstract class và interface:
Page 98
Mấy đoạn này là mình sưu tầm trên mạng nhé:
- Một class chỉ có thể kế thừa từ một abstract class, nhưng có thể kế thừa nhiều interface.
- Trong Interface chỉ có thể khai báo các fields, methods, mà không được hiện thực nó. Còn đối với
abstract thì dùng các biến, hiện thực cách methods.
- Các fields, methods trong interace đều là public và bắt buộc các class kế thừa phải cài đặt nó
(abstract). Trong abstract class thì có các fields, methods có thể là private, internal, public, protected
và có thể là abstract hoặc non-abstract.
- Interface dùng để gom các hành động cần được hiện thực, các khả năng của một đối tượng, còn
abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái.
- Abstract class có tốc độ thực thi nhanh hơn interface.
- Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.
- Ví dụ về interface, các thành viên của interface phải được thực thi trong các lớp mà kế thừa từ nó.
- Nhìn một cách nào đó, bạn có thể thấy rằng, Interface giống như những câu lạc bộ, và Abstract
class là một ông bố trong gia đình.
Một câu lạc bộ luôn luôn có một bộ quy tắc hay nôi qui mà mọi thành viên luôn phải tuân theo.
Một ông bố trong gia đình thì khác, ông có tài sản mà con cháu có thể kế thừa, ông cũng có những
qui định trong di chúc – ai là người được kế thừa tài sản của ông! Bạn có thể tham gia cùng lúc nhiều
câu lạc bộ như việc một Class "kế thừa" (Implement) nhiều Interface.
Một khi đã tham gia vào CLB nào, bạn phải tuân thủ tất cả các qui tắc của CLB đó, không quan tâm
bạn là thành viên của bao nhiêu CLB. Đó là việc tại sao phải Implement đầy đủ các Interface
member.
CLB không để lại tài sản cho các bạn, nhưng bố của bạn thì có, ông ấy cho bạn tài sản (không nếu
ông ấy không thích Laughing) và cũng bắt bạn tuân theo các qui tắc – gia qui. Và một khi đã là con
của người này thì bạn không thể nào là con của người khác giống như không thể kế thừa từ nhiều
Page 99
Abstract Class!
Bài tập về nhà: Làm lại thành thạo các ví dụ trên!
Đọc thêm: Các interface (giao diện, bề mặt) trong lập trình Java
Page 100
Bài 22: Try, catch, finally trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/7/13.
Theo dõi chủ đề
Trang 1 / 21 2Tiếp >Tới bài đầu tiên đã đọc
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,580
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Trước khi vào chi tiết, mình sẽ nêu 1 tình huống như này, đó là lỗi chia cho 0.
Bình thường theo các bài trước, các bạn sẽ dùng if, else để loại bỏ, in ra lỗi. (tất nhiên nếu bạn đã biết
try catch rồi thì không nói ). Đọc xong bài này, các bạn sẽ có thêm 1 cách khác, và tất nhiên nó còn
sử dụng để bắt và xử lý nhiều loại lỗi hơn!
Ví dụ: Các bạn xem đoạn code này trước khi đọc lý thuyết, chạy thử nó, có thể nó cũng khá dễ hiểu! PHP:
Page 101
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
int a = 5;
int b = 0;
//Cách các bài trước thường làm, dùng if, else:
if (b == 0) {
System.out.println("Lỗi chia cho 0");
} else {
System.out.println("a/b = " + a / b);
}
System.out.println("\nCách dùng try - catch - finally \n");
//Sử dụng try, catch để bắt lỗi:
try {
System.out.println("a/b = " + a / b);
} catch (Exception e1) {
System.out.println("Có lỗi gì đó xảy ra ");
System.out.println("Tên lỗi là: " + e1);
} finally {
System.out.println("Có lỗi hay không thì cái dòng cuối cùng này v
ẫn được in ra!");
}
}
}
1, Try - catch:
- Trong ví dụ trên, trong khối try{} là những dòng lệnh chúng ta cần thực hiện!
Khối catch (Exception e1) {} là nơi chứa các dòng lệnh thực hiện khi phát hiện lỗi!
- Ở đây, ta cần hiểu rõ khái niệm Exception:
Exception (Ngoại lệ) là sự kiện xảy ra khi một chương trình đang chạy mà phát sinh ra lỗi. Nó sẽ
làm gián đoạn chương trình!
(Exception e1) trong đó "e1" là tên của được gán nếu đối tượng bị lỗi, các bạn có thể đặt tên này
bằng các từ khác.
- Bạn có thể in "e1" ra ngoài, sẽ thấy được lỗi cụ thể!
- Exception là lớp cha, nó nói chung, và in ra các lỗi, ngoài ra còn có lớp con cụ thể và các ngoại lệ
khác như sau:
Exception | Lớp nền của run-time
NullPointerException | Một đối tượng không tồn tại
ClassNotFoundException | Không tìm thấy Class
FileNotFoundException | Không tìm thấy file
SecurityException | Exception liên quan đến bảo mật
ArrayIndexOutOfBoundsException | Vượt quá chỉ mục của mảng
IllegalAccessException | Truy cập không hợp lệ
IllegalArgumentException | Đối số hàm
Page 102
ArithmeticException | Lỗi thực thi một phép toán
NumberFormatException | Định dạng số không đúng
IOException | Lỗi nhập xuất
EOFException | Kết thúc một tập tin
NoSuchMethodException | Sai tên phương thức
InterruptedException | Ngắt luồng đang được thực thi
Ví dụ: In ra lỗi cụ thể vượt quá chỉ mục của mảng. PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
int arrInt[] = {1, 2, 4, 7, 10};
try {
System.out.println("arrInt[6] = " + arrInt[6]);
} catch (ArrayIndexOutOfBoundsException e2) {
System.out.println("Lỗi! Vượt quá chỉ mục của mảng! " + e2);
}
}
}
Ngoài ra, để in nhiều Exception thì ra làm như sau: PHP:
try {
//Nội dung muốn bẫy lỗi
} catch (ExceptionType1 e) {
//Khối lệnh cho lỗi
}catch (ExceptionType2 e1) {
//Khối lệnh cho lỗi
} catch (Exception ex) {
//Exception cho những cái còn lại
}
Trong đó ExceptionType là những loại Exception cụ thể đã nêu ở phía trên!
2, Finally?
Nó nằm ở cuối cùng của khối lệnh try - catch - finally, nó luôn luôn được thực hiện ngay cả khi
chương trình có bắt được lỗi
hay không!
Trong khối lệnh đầy đủ như ví dụ ở đầu bài, dòng System.out.println("Có lỗi hay không thì cái dòng
cuối cùng này vẫn được in ra!");
Luôn luôn được thực hiện và in ra khi bạn gán bất giá trị nào cho b!
Xem thêm video nói khá đầy đủ về try - catch - finally của Blog StudyAndShare
Bổ sung thêm video về throw and throws
Page 103
Bài tập về nhà: Làm lại bài giải phương trình ax + b = 0 . Lập trình hướng đối tượng. Các hệ số nhập vào từ bàn
phím. Sử dụng try - catch để bẫy các lỗi khi nhập sai kiểu dữ liệu, ví dụ nhập số lại nhập chữ. Bẫy lỗi
chia cho 0.
Page 104
Bài 23: Enum trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,733
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Kiểu dữ liệu Enum?
Kiểu dữ liệu Enum gần giống với kiểu dữ liệu Array, nhưng các phần tử có thể bổ sung thêm các
Page 105
phương thức!
Enum là 1 kiểu dữ liệu liệt kê. Giúp bạn tổ chức dữ liệu khoa học hơn, code được trong sáng dễ hiểu
hơn.
Ví dụ: Lấy từ blog StudyAndShare:
PHP:
package javaandroidvn;
public class JavaAndroidVn {
enum COLOR {
RED, BLUE, YELLOW
};
public static void main(String[] args) {
System.out.println(COLOR.BLUE);
System.out.println(COLOR.RED);
System.out.println(COLOR.YELLOW);
System.out.println("Cách 2: ");
COLOR c = COLOR.RED;
System.out.println(c);
System.out.println(c.YELLOW);
if (c == COLOR.RED) {
System.out.println("True");
} else {
System.out.println("False");
}
}
}
2, Switch case với Enum:
Code demo: PHP:
package javaandroidvn;
public class JavaAndroidVn {
enum COLOR {
RED, BLUE, YELLOW
};
public static void main(String[] args) {
COLOR c = COLOR.RED;
switch (c) {
case RED: {
System.out.println("Red");
Page 106
break;
}
case BLUE: {
System.out.println("Blue");
break;
}
case YELLOW: {
System.out.println("Yellow");
break;
}
}
}
}
3, Thuộc tính và phương thức trong Enum:
Ví dụ: Lấy dựa vào Video blog StudyAndShare:
PHP:
package javaandroidvn;
public class JavaAndroidVn {
enum COLOR {
RED(5), BLUE(6), YELLOW(7), GREEN(8);
private int value;
COLOR(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
};
public static void main(String[] args) {
COLOR c = COLOR.BLUE;
System.out.println(c + ": " + c.getValue());
System.out.println("ordinal BLUE: " + c.ordinal());
c = COLOR.GREEN;
System.out.println("ordinal GREEN: " + c.ordinal());
}
}
Page 107
Bài tập về nhà: Xem kỹ các video trong bài, làm lại các ví dụ!
Page 108
Bài 24: String và một số phương thức của lớp String trong
Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,689
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 109
Ở những bài trước, chúng ta đã làm quen với String, khi nhập xuất dữ liệu. Trong bài hôm nay, mình
sẽ giới thiệu thật kỹ về lớp này. Tính áp dụng của bài này trong thực tế là rất cao, nên các bạn thật
chú ý làm các ví dụ và bài tập về nhà ở phía cuối. Bài này rất dễ nhưng mình xin nhắc lại là bài này
hết sức quan trọng!
1, Khái niệm, cách khai báo và khởi tạo!
a, Khái niệm: Chuỗi là tập các kí tự đứng liền nhau được giới hạn trong dấu ngoặc kép như: "Hello thế giới Java",
"Hello Android.Vn - Tôi Yêu các bạn!"
Còn các ký tự các bạn nhớ là trong ngoặc đơn 'c', 'a', 'b' ...tránh nhầm lẫn chỗ này!
b, Cách khai báo, khởi tạo:
Các bạn xem code demo dưới đây là hiểu ngay nhé, mình giới thiệu 3 cách khởi tạo ứng với 3 chuỗi
str1, str2, str3:
PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
String str1 = new String();
str1 = "Hello Android.Vn";
String str2 = new String ("Xin chào các bạn, tôi đang tham gia Androi
d.Vn");
String str3 = "Tôi yêu Android.Vn";
System.out.println(str1+"\n"+str2+"\n"+str3);
}
}
c, Khởi tạo chuỗi từ mảng các ký tự: Code demo: Ở đây có 2 cách, và mình bổ sung thêm phần cộng 2 chuỗi - mình cũng chưa nói ở
những bài trước:
PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
char ch[] = {'A', 'n', 'd', 'r', 'o', 'i', 'd', '.', 'V', 'n'};
String str1 = new String(ch);
System.out.println("str1: " + str1);
String str2 = new String(ch, 2, 5); //Lấy từ vị trí số 2, và lấy 5 ký
tự trong mảng kể từ vị trí đó
System.out.println("str2: " + str2);
//Cộng 2 chuỗi - phần này bổ sung thêm
String str3 = str1+ str2;
//String str3 = str1.concat(str2); Cách này cũng nối được 2 chuỗi!
Page 110
System.out.println("str3: "+str3);
}
}
2, Chuyển chuỗi sang mảng ký tự:
Phần 1c, mình đã chia sẻ các phương thức chuyển từ mảng các ký tự sang chuỗi, phần này sẽ là
ngược lại.
Code demo:
PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
String str = "Android.Vn Android.Vn";
//Chuyển chuỗi thành mảng ký tự!
System.out.println("Chuyển chuỗi thành mảng ký tự!");
char arr[] = str.toCharArray();
for (int i = 0; i < str.length(); i++) {
System.out.print(arr[i] + " ");
}
}
}
3,Các phương thức xử lý chuỗi cơ bản:
Phần này rất dễ hiểu, mình sẽ giải thích luôn các phương thức trong code demo, đoạn nào không
hiểu các bạn hỏi ở phía dưới nhé
**Chú ý: Vị trí các ký tự trong chuỗi cũng giống như trong mảng, bắt đầu từ vị trí số 0 và kết thúc là
(độ dài chuỗi - 1).
PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
String str = "Android.Vn Android.Vn";
System.out.println("str = " + str);
// Lấy từ vị trí số 8 tới cuối cùng của chuỗi
System.out.println("str.substring(8) = " + str.substring(8));
//Lấy từ vị trí số 3 tới vị trí số 9
System.out.println("str.substring(3,9) = " + str.substring(3, 9));
//Độ dài chuỗi:
System.out.println("Độ dài chuỗi: str.length() = " + str.length());
//Lấy ra ký tự trong chuỗi theo chỉ số
char ch;
ch = str.charAt(4);
Page 111
System.out.println("str.charAt(4) = " + ch);
// Thay 1 ký tự bằng ký tự khác trong chuỗi:
System.out.println("Thay tất cả ký tự 'n' bằng ký tự 'x' = " + str.re
place('n', 'x'));
//Tìm chuỗi "And" là chuỗi con của chuỗi str, thay kết quả đầu tiên b
ằng chuỗi "xxx"
System.out.println("Thay And đầu tiên bằng xxx = " + str.replaceFirst
("And", "xxx"));
//Thay toàn bộ chuỗi "And" của chuỗi str bằng chuỗi "xxx":
System.out.println("Thay tất cả And bằng xxx = " + str.replaceAll("An
d", "xxx"));
//Chuyển thành chữ thường:
System.out.println("str chuyển về viết thường: " + str.toLowerCase())
;
//Chuyển thành chữ hoa:
System.out.println("str chuyển về viết hoa: " + str.toUpperCase());
//Loại bỏ khoảng trống 2 bên chuỗi
String str1 = " "+str+" ";
System.out.println(" Android.Vn Android.Vn --> "+str1.trim());
}
}
Những phương thức trên là cơ bản nhưng hay dùng, các bạn có thể tìm hiểu thêm
bằng cách ấn "Ctrl + space"
4, Chuyển kiểu dữ liệu từ String sang số:
Các phương thức chuyển kiểu dữ liệu từ String sang số nằm trong gói thư viện java.lang ta có bảng
các phương thức như sau:
Page 112
Ví dụ:
PHP:
String str =new String(“987”);
int a = Integer.parseInt(str);
Kết quả là a = 987;
Mục 4 này thực tế cũng rất hay dùng nhé, các bạn chú ý!
Bổ sung thêm video bên blog StudyAndShare:
Bài tập về nhà:
Page 113
Một bài nho nhỏ thôi, còn lại, chúng ta sẽ thực hành với String kèm theo ở các bài tập các bài sau!
Khai báo 1 mảng các chuỗi là tên học sinh. Tìm kiếm tất cả các học sinh họ "Nguyễn". In kết quả ra
màn hình.
Xem thêm phần mở rộng, cũng hết sức quan trọng:
Phương thức toString (blog studyandshare)
StringBuilder và StringBuffer (blog studyandshare)
Page 114
Bài 25: So sánh chuỗi trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,244
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Ở Bài 24, chúng ta đã làm quen với các phương thức xử lý chuỗi. Nó rất quan trọng, và ngoài ra nó
sẽ thường kết hợp với cá phương thức so sánh nữa để đạt được yêu cầu cần làm trong 1 chương trình
cụ thể! Đặc biệt là những bài tìm kiếm, sắp xếp!
Dưới đây, mình chỉ giới thiệu một vài phương thức cơ bản để so sánh 2 chuỗi hay dùng nhất, các bạn
cần tự tìm hiểu thêm nếu như cần! (Ctrl + space)
Page 115
Code sẽ kèm theo chú thích cụ thể từng phương thức, nếu bạn có gì thắc mắc, hay khó hiểu, bạn có
thể bình luận phía dưới!
PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
String str1 = "Android.Vn Android.Vn";
String str2 = "android.vn android.vn";
System.out.println("So sánh phân biệt chữ hoa chữ thường: "+str1.equa
ls(str2));
System.out.println("So sánh không phân biệt hoa thường: "+str1.equals
IgnoreCase(str2));
// So sánh thứ tự a, b, c ....
String str3 = "abc";
String str4 = "bcde";
System.out.println("So sánh 2 chuỗi thường!");
System.out.println(""+str3.compareTo(str4)); //str3 < str4 , so sánh
trả về -1
System.out.println(""+str4.compareTo(str3)); // str4 > str3, so sánh
trả về 1
System.out.println(""+str3.compareTo(str3)); // str3 = str3, so sánh
trả về 0
System.out.println("So sánh 2 chuỗi hoa và thường");
String str5 = "ANDroid.Vn";
String str6 = "android.vn";
System.out.println(""+str5.compareToIgnoreCase(str6)); // KHông phân
biệt hoa và thường
System.out.println(""+str5.compareTo(str6)); // Phân biệt ch
ữ hoa và chữ thường!
System.out.println("Chuỗi này có là tập con của chuỗi kia không?");
String str7 = "android.vn";
String str8 = "vn";
//Quá trình so sánh có phân biệt chữ hoa và chữ thường!
System.out.println("Chuỗi vn nằm ở vị trí thứ "+str7.indexOf(str8)+"
của chuỗi android.vn");
//Khi so sánh không tìm thấy thì sẽ trả về -1
str8 = "TN";
System.out.println("Chuỗi TN nằm ở vị trí thứ "+str7.indexOf(str8)+"
của chuỗi android.vn");
System.out.println("Chuỗi này có bắt đầu hay kết thúc bằng chuỗi kia
không?");
str7 = "android.vn";
String str9 = "and";
String str10 = "roid.vn";
System.out.println("str7.startsWith(str9) = "+str7.startsWith(str9));
System.out.println("str7.endsWith(str10) = "+str7.endsWith(str10));
Page 116
}
}
Bài tập về nhà:
Tạo 1 mảng các chuỗi là danh sách tên học sinh. Nhập vào 1 chuỗi nào đó.
Sắp xếp danh sách tên theo thứ tự bảng chữ cái a, b, c.....
Tìm kiếm tất cả các tên học sinh giống tuyệt đối hoặc gần giống với từ khóa tìm kiếm đều được hiện
ra.
Ví dụ nhập từ khóa tìm kiếm: "hoang" thì sẽ hiện ra tất cả các tên sau (nếu như chúng có trong danh
sách):
Hoang Thi Yen, Nguyen Hoang Hiep, Vu Van Hoang, hoang, Hoang, hoang van tien, ... (kết quả tìm kiếm không phân biệt chữ hoa và chữ thường!)
Page 117
Bài 26: Giới thiệu luồng và tập tin (Streams & Files) trong
Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 22/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,408
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 118
- Với những kiến thức ở các bài trước, sau khi chương trình kết thúc, dữ liệu sẽ biến mất, vì nó chỉ
được lưu tạm trong RAM. Tắt chương trình hoặc máy tắt đột ngột cũng đồng nghĩa với việc mất sạch
dữ liệu trong chương trình. Điều đó thực sự sẽ không thể đáp ứng được nhu cầu, vì thực tế hầu như
các chương trình đều cần lưu được lại dữ liệu để chúng ta có thể mở lại xem, hoặc tiếp tục chương
trình, nạp thêm dữ liệu ...
- Ở bài này, chúng ta sẽ cùng nhau làm quen với khái niệm luồng (streams) và file. Công việc này nó
thuộc 1 phần của xử lý các luồng.
Từ đó chúng ta biết các làm cho chương trình có thể đọc, ghi dữ liệu trong bộ nhớ lưu trữ, sau này
còn có thể liên quan tới cách xử lý, trao đổi dữ liệu thông qua các kết nối mạng!
1, Luồng (Streams)
a, Khái niệm luồng
- Việc nhập xuất dữ liệu trong thực tế rất đa dạng. Nhập dữ liệu có thể là từ bàn phím, từ trên mạng,
máy scan, camera, .v.v..v. Xuất dữ liệu có thể là ghi ra bộ nhớ, in ra màn hình, máy in, ..v..v.. Những
hoạt động đó được gọi chung lại 1 khái niệm gọi là luồng (stream). Luồng là nơi có thể “sản xuất” và
“tiêu thụ” thông tin.
- Trong lập trình Java, luồng thường được hệ thống xuất nhập gắn kết với một thiết bị vật lý. Thực tế
có rất nhiều các thiết bị vật lý khác nhau, nhưng các luồng lại có cùng 1 nguyên tắc giống nhau để
chúng ta dễ dàng xử lý. Vì vậy cùng một lớp, phương thức xuất nhập có thể dùng chung cho các thiết
bị vật lý khác nhau. Ví dụ cùng là một phương thức có thể dùng để
ghi dữ liệu ra console, đồng thời cũng có thể dùng để ghi dữ liệu xuống một file trên đĩa. Java hiện
thực luồng bằng tập hợp các lớp phân cấp trong gói java.io.
- Java định nghĩa 2 kiểu luồng: byte và ký tự (phiên bản gốc chỉ định nghĩa kiểu luồng byte, và sau
đó luồng ký tự được thêm vào trong các phiên bản về sau).
- Luồng ký tự được thiết kế hỗ trợ việc nhập xuất dữ liệu kiểu ký tự (Unicode). Trong một vài trường
hợp luồng ký tự sử dụng hiệu quả hơn luồng byte, nhưng ở mức hệ thống thì tất cả những xuất nhập
Page 119
đều phải qui về byte. Luồng ký tự hỗ trợ hiệu quả chỉ đối với việc quản lý, xử lý các ký tự.
b, Luồng byte (Byte Streams)
- Các luồng byte được định nghĩa dùng hai lớp phân cấp. Mức trên cùng là hai lớp trừu tượng
InputStream và OutputStream. InputStream định nghĩa những đặc điểm chung cho những luồng nhập
byte. OutputStream mô tả cách xử lý của các luồng xuất byte.
- Các lớp con dẫn xuất từ hai lớp InputStream và OutputStream sẽ hỗ trợ chi tiết tương ứng với việc
đọc ghi dữ liệu trên những thiết bị khác nhau. Có rất nhiều các lớp khác nhau, nhưng khi bạn đã nắm
vững, sử dụng thành thạo một luồng byte nào đó thì bạn sẽ dễ dàng làm việc với những luồng còn lại
nhanh thôi!
Page 121
c, Luồng ký tự (Character Streams)
- Các luồng ký tự được định nghĩa dùng hai lớp phân cấp. Mức trên cùng là hai lớp trừu tượng
Reader và Writer.
- Lớp Reader dùng cho việc nhập dữ liệu của luồng, lớp Writer dùng cho việc xuất dữ liệu cua luồng.
Những lớp dẫn xuất từ Reader và Writer thao tác trên các luồng ký tự Unicode.
Page 122
d, Những luồng được định nghĩa trước (The Predefined Streams)
- Tất cả các chương trình viết bằng java luôn tự động import gói java.lang. Gói này có định nghĩa lớp
System, bao gồm một số đặc điểm của môi trường run-time, nó có ba biến luồng được định nghĩa
trước là in, out và err, các biến này là các fields được khai báo static trong lớp System.
Page 123
- System.out: luồng xuất chuẩn, mặc định là console.
System.out là một đối tượng kiểu PrintStream.
- System.in: luồng nhập chuẩn, mặc định là bàn phím.
System.in là một đối tượng kiểu InputStream.
- System.err: luồng lỗi chuẩn, mặc định cũng là console.
System.out cũng là một đối tượng kiểu PrintStream
giống System.out.
2, Sử dụng luồng Byte
- Như chúng ta đã biết hai lớp InputStream và OutputStream là các lớp cha đối với tất cả những lớp
luồng xuất nhập kiểu byte. Những phương thức trong hai lớp cha này ném ra các lỗi kiểu
IOException. Những phương thức định nghĩa trong 2 lớp cha này là có thể dùng trong các lớp con
của chúng. Vì vậy tập các phương thức đó là tập tối tiểu các chức năng nhập xuất mà những luồng
nhập xuất kiểu byte có thể sử dụng.
- Những phương thức định nghĩa trong lớp InputStream và OutputStream:
Page 125
a, Đọc dữ liệu từ Console Trước đây, khi Java mới ra đời để thực hiện việc nhập dữ liệu từ Console người ta chỉ dùng luồng
nhập byte. Về sau thì chúng ta có thể dùng cả luồng byte và luồng ký tự, nhưng trong một số trường
hợp thực tế để đọc dữ liệu từ Console người ta thích dùng luồng kiểu ký tự hơn, vì lý do đơn giản và
dễ bảo trì chương trình. Ở đây với mục đích minh họa chúng ta dùng luồng byte thực hiện việc nhập
xuất Console.
Ví dụ: Chương trình minh họa việc đọc một mảng bytes từ System.in PHP:
package javaandroidvn;
import java.io.IOException;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
byte duLieu[] = new byte[100];
System.out.print("Nhập dòng ký tự vào: ");
System.in.read(duLieu);
System.out.print("Dòng ký tự vừa nhập: ");
for (int i = 0; i < duLieu.length; i++) {
System.out.print((char) duLieu[i]);
}
}
}
b, Xuất dữ liệu ra Console
- Tương tự như nhập dữ liệu từ Console, với phiên bản đầu tiên của java để xuất dữ liệu ra Console tả
chỉ có thể sử dụng luồng byte. Kể từ phiên bản 1.1 (có thêm luồng ký tự), để xuất dữ liệu ra Console
có thể sử dụng cả luồng ký tự và luồng byte. Tuy nhiên, cho đến nay để xuất dữ liệu ra Console
thường người ta vẫn dùng luồng byte.
- Chúng ta đã khá quen thuộc với phương thức print() và println(), dùng để xuất dữ liệu ra Console.
Bên cạnh đó chúng ta cũng có thể dùng phương thức write().
Ví dụ: Sử dụng phương thức System.out.write() để xuất ký tự ’x’ và mảng ký tự ch[] ra Console PHP:
package javaandroidvn;
public class JavaAndroidVn {
public static void main(String[] args) {
char ch[] = {'a', 'c', 'd', 'e'};
int b;
b = 'x';
System.out.write(b);
System.out.write('\n');
for (int i = 0; i < ch.length; i++) {
System.out.write(ch[i]);
}
System.out.write('\n');
Page 126
}
}
Bài tập về nhà:
Các bạn đọc kỹ lý thuyết trên và thử làm, chạy lại các ví dụ trên! Bài này chỉ mang tính giới thiệu, tổng quát, chúng ta sẽ đi vào 1 số phần cụ thể ở bài sau!
Page 127
Bài 27: Đọc và ghi file dùng luồng byte trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 23/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,108
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
- Với cách đọc ghi này ta tạo một luồng Byte gắn với file chỉ định dùng FileInputStream và
FileOutputStream.
- Để mở một file, đơn giản chỉ cần tạo một đối tượng của những lớp này, tên file cần mở là thông số
trong constructor. Khi file mở, việc đọc và ghi dữ liệu trên file được thực hiện một cách bình thường
thông qua các phương thức cung cấp trong luồng.
Page 128
1, Đọc dữ liệu từ file dùng luồng byte:
- Mở một file để đọc dữ liệu FileInputStream(String fileName) throws FileNotFoundException. Nếu
file không tồn tại: thì ném ra FileNotFoundException.
- Đọc dữ liệu: dùng phương thức read():
int read( ) throws IOException: đọc từng byte từ file và trả về giá trị của byte đọc được. Trả về -1 khi
hết file, và ném ra IOException khi có lỗi đọc.
- Đóng file: dùng phương thức close():
void close( ) throws IOException: sau khi làm việc xong cần đóng file để giải phóng tài nguyên hệ
thống đã cấp phát cho file.
Ví dụ: PHP:
package javaandroidvn;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/*
Tạo file androidvn.txt ở ổ E, gõ nội dung văn bản vào đó rồi lưu lại!
Hiển thị nội dung của một file tên androidvn.txt lưu tại E:\androidvn.txt
*/
public class JavaAndroidVn {
public static void main(String args[]) throws IOException {
FileInputStream f;
try {
f = new FileInputStream("E:\\androidvn.txt");
} catch (FileNotFoundException exc) {
System.out.println("File Not Found");
return;
} catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("Usage: ShowFile File");
return;
}
// Đọc cho tới cuối file
int i;
do {
i = f.read();
if (i != -1) {
System.out.print((char) i);
}
} while (i != -1);
f.close();
}
}
2. Ghi dữ liệu xuống file dùng luồng byte:
- Mở một file để ghi dữ liệu FileOutputStream(String fileName) throws FileNotFoundException
Page 129
Nếu file không tạo được: thì ném ra FileNotFoundException
- Ghi dữ liệu xuống: dùng phương thức write():
void write(int byteval) throws IOException: ghi một byte xác định bởi tham số byteval xuống file, và
ném ra IOException khi có lỗi ghi.
- Đóng file: dùng phương thức close():
void close( ) throws IOException: sau khi làm việc xong cần đóng file để giải phóng tài nguyên hệ
thống đã cấp phát cho file.
Ví dụ: Chương trình sẽ tự tạo file "E:\\output.txt", ghi vào các ký tự từ a -> z PHP:
package javaandroidvn;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
class JavaAndroidVn {
public static void main(String args[]) throws IOException {
FileOutputStream fout;
// Tạo file mới!
try {
fout = new FileOutputStream("E:\\output.txt");
} catch (FileNotFoundException exc) {
System.out.println("Error Opening OutputFile ");
return;
}
// Ghi file theo từng ký tự từ a -> z
int i = 'a';
int j = 'z';
for (i = 'a'; i <= j; i++) {
fout.write(i);
}
fout.close();
}
}
3, Copy file trong Java:
Dưới đây là 1 chương trình đơn giản để copy file trong Java, nó chưa thực sự tối ưu vì mình thấy tốc
độ của nó rất chậm. Bạn có thể dùng để copy bất cứ định dạng nào, không phải chỉ riêng file văn
bản! Nó dùng cách đọc ghi file dùng luồng byte như trên! PHP:
package javaandroidvn;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
class JavaAndroidVn {
Page 130
public static void main(String args[]) throws IOException {
FileInputStream fin;
FileOutputStream fout;
try {
// open input file
try {
fin = new FileInputStream("E:\\in.mp3");
} catch (FileNotFoundException exc) {
System.out.println("Input File Not Found");
return;
}
// open output file
try {
fout = new FileOutputStream("E:\\out.mp3");
} catch (FileNotFoundException exc) {
System.out.println("Error Opening OutputFile ");
return;
}
} catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("Usage: CopyFile From To");
return;
}
// Copy File
int i;
try {
do {
i = fin.read();
if (i != -1) {
fout.write(i);
}
} while (i != -1);
} catch (IOException exc) {
System.out.println("File Error");
}
fin.close();
fout.close();
}
}
Page 131
Bài tập về nhà:
Biến màn hình console thành màn hình lệnh như sau:
- Nếu bạn gõ từ "copy", thì chương trình sẽ hỏi địa chỉ file cần copy, bạn gõ địa chỉ file cần copy vào,
nếu không tồn tại sẽ bắt nhập lại, nếu tồn tại sẽ hỏi địa chỉ file đích, sau đó chương trình sẽ copy file
đó. Tương tự với các lệnh "move", "delete"
- Gợi ý cách xóa file:
Thêm 2 dòng lệnh như ví dụ này là bạn có thể xóa được 1 file: PHP:
File f = new File("E:\\in.mp3");
f.delete();
** Mình chỉ nêu ý cơ bản bài như vậy, bạn hãy cố gắng làm chương trình thật tốt và tiện lợi với
người dùng! Ví dụ nhập lệnh "copy str1 str2" với str1, str2 là đường dẫn nguồn và đích, rồi Enter nó
sẽ copy luôn. ** Làm xong, đừng quên share lên forum để mọi người cùng tham khảo nhé
Page 132
Bài 28: Đọc và ghi dữ liệu nhị phân dùng luồng byte trong
Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 23/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,466
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Ở bài trước chúng ta đã đọc và ghi các bytes dữ liệu là các ký tự mã ASCII. Để đọc và ghi những giá
trị nhị phân của các kiểu dữ liệu trong java, chúng ta sử dụng DataInputStream và
DataOutputStream.
Page 133
1, DataOutputStream:
Dùng để hiện thực interface DataOuput.
Interface DataOutput có các phương thức cho phép ghi tất cả những kiểu dữ liệu cơ sở của java đến
luồng (theo định dạng nhị phân).
Contructor: DataOutputStream(OutputStream outputStream)
OutputStream: là luồng xuất dữ liệu. Để ghi dữ liệu ra file thì đối tượng outputStream có thể là
FileOutputStream.
2, DataInputStream:
Dùng để hiện thực interface DataInput.
Interface DataInput có các phương thức cho phép đọc tất cả những kiểu dữ liệu cơ sở của java (theo
định dạng nhị phân).
Page 134
Contructor: DataInputStream(InputStream inputStream)
InputStream: là luồng nhập dữ liệu. Để đọ dữ liệu từ file thì đối tượng InputStream có thể là
FileInputStream.
Ví dụ: Dùng DataOutputStream và DataInputStream để ghi và đọc những kiểu dữ liệu khác nhau
trên file.
*** Chú ý: Trong ví dụ dưới mình bổ sung thêm cách đọc và ghi chuỗi nữa nhé! (writeUTF và
readUTF) PHP:
package javaandroidvn;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
class JavaAndroidVn {
public static void main(String args[]) throws IOException {
DataOutputStream dataOut;
DataInputStream dataIn;
int i = 2013;
double d = 3.14;
boolean b = true;
char ch = 'A';
String str = "Android.Vn";
try {
dataOut = new DataOutputStream(new FileOutputStream("E:\\androidv
n.dat"));
} catch (IOException exc) {
System.out.println("Cannot open file.");
return;
}
try {
System.out.println("Writing Int: " + i);
dataOut.writeInt(i);
System.out.println("Writing Double: " + d);
dataOut.writeDouble(d);
System.out.println("Writing boolean: " + b);
dataOut.writeBoolean(b);
System.out.println("Writing Double: " + 12.2 * 7.4);
dataOut.writeDouble(12.2 * 7.4);
System.out.println("Writing char: " + ch);
dataOut.writeChar(ch);
System.out.println("Writing String: " + str);
dataOut.writeUTF(str);
} catch (IOException exc) {
System.out.println("Write error.");
}
Page 135
dataOut.close();
System.out.println();
// Next, read and show them from file
try {
dataIn = new DataInputStream(
new FileInputStream("E:\\androidvn.dat"));
} catch (IOException exc) {
System.out.println("Cannot open file.");
return;
}
try {
i = dataIn.readInt();
System.out.println("Reading Int: " + i);
d = dataIn.readDouble();
System.out.println("Reading Boolean: " + d);
b = dataIn.readBoolean();
System.out.println("Reading Double: " + b);
d = dataIn.readDouble();
System.out.println("Reading Double: " + d);
ch = dataIn.readChar();
System.out.println("Reading char: " + ch);
str = dataIn.readUTF();
System.out.println("Reading String: " + str);
} catch (IOException exc) {
System.out.println("Read error.");
}
dataIn.close();
}
}
Bài tập về nhà:
Tạo đối 1 tượng SinhVien gồm các thuộc tính: tên, năm sinh, điểm trung bình. Ghi các thuộc tính này
vào file theo kiểu nhị phân.
Đọc file in thông tin ra ngoài.
Page 136
Nếu chạy lại chương trình mà file đã tồn tại thì không tạo đối tượng mới nữa mà in luôn ra thông tin đối tượng đó được đọc từ file!
Page 137
Bài 29: File truy cập ngẫu nhiên (Random Access Files)
trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 23/7/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,364
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
1, Random Access Files?
- Bên cạnh việc xử lý xuất nhập trên file theo kiểu tuần tự thông qua các luồng, java cũng hỗ trợ truy
cập ngẫu nhiên nội dung của một file nào đó dùng RandomAccessFile.
- RandomAccessFile không dẫn xuất từ InputStream hay OutputStream mà nó hiện thực các interface
DataInput, DataOutput (có định nghĩa các phương thức I/O cơ bản).
Page 138
- RandomAccessFile hỗ trợ vấn đề định vị con trỏ file bên trong một file dùng phương thức
seek(long newPos).
2, Ví dụ:
Bài này lý thuyết ngắn, nhưng ví dụ hơi dài, chủ yếu là đọc code để hiểu!
Chương trình sau sẽ ghi 9 số kiểu double xuống file, rồi đọc lên theo thứ tự ngẫu nhiên. Các bạn xem
code có chỗ nào không hiểu cứ bình luận phía dưới, mọi người cùng nhau giải quyết! ^^ PHP:
package javaandroidvn;
import java.io.*;
class JavaAndroidVn {
public static void main(String args[]) throws IOException {
double data[] = {11.2, 13.6, 255.6, 117.92, 2007.96, 8.9, 9.9, 10.0,
100.6};
double d;
RandomAccessFile raf;
try {
raf = new RandomAccessFile("E:\\random.dat", "rw");
} catch (FileNotFoundException exc) {
System.out.println("Cannot open file.");
return;
}
// Write values to the file.
for (int i = 0; i < data.length; i++) {
try {
raf.writeDouble(data[i]);
} catch (IOException exc) {
System.out.println("Error writing to file.");
return;
}
}
try {
// Now, read back specific values
raf.seek(0 * 8); // seek to first double
d = raf.readDouble();
System.out.println("First value is " + d);
raf.seek(8 * 1); // seek to second double
d = raf.readDouble();
System.out.println("Second value is " + d);
raf.seek(8 * 3); // seek to fourth double
d = raf.readDouble();
System.out.println("Fourth value is " + d);
System.out.println();
//Read All data
System.out.println("Read all: ");
for (int i = 0; i < data.length; i++) {
Page 139
raf.seek(8 * i); // seek to ith double
d = raf.readDouble();
System.out.print(d + " ");
}
System.out.println("");
// Now, read every other value.
System.out.println("Here is every other value: ");
for (int i = 0; i < data.length; i += 2) {
raf.seek(8 * i); // seek to ith double
d = raf.readDouble();
System.out.print(d + " ");
}
System.out.println("\n");
} catch (IOException exc) {
System.out.println("Error seeking or reading.");
}
raf.close();
}
}
Bài tập về nhà:
- Tạo chương trình khi chạy lên nếu như không tồn tại file thì tạo file mới như sau:
- Tạo 1 mảng , các phần tử là các số thực. Các số được ghi vào file theo kiểu ghi ngẫu nhiên.
- Nếu file đã tồn tại, hoặc là ở những lần chạy sau, sau khi đã khởi tạo giá trị, chương trình bỏ qua
bước khởi tạo và dựa vào file in ra những số có chỉ số lẻ trong mảng đã nhập trên bằng cách lấy trực tiếp chỉ số khi đọc file theo cách đọc ngẫu nhiên! (Không dùng cách nạp lại cả file vào mảng)
Page 140
Bài 30: Sử dụng luồng ký tự trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,527
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Ở những bài trước, mình đã giới thiệu với các bạn việc sử dụng luồng byte để nhập và xuất dữ liệu
ký tự. Nhưng trong nhiều trường hợp luồng byte không phải là cách tốt nhất để quản lý nhập xuất dữ
liệu ký tự. Trong lập trình Java có kiểu luồng ký tự phục vụ riêng cho việc nhập xuất dữ liệu trên
luồng. Mức trên cùng là 2 lớp trừu tường Reader và Writer. Các lớp dẫn xuất
từ Reader và Writer hỗ trợ thao tác trên các luồng ký tự Unicode.
- Những phương thức định nghĩa trong lớp trừu tượng
Page 141
Bài này sẽ là nhập xuất ký tự và chuỗi sử dụng luồng ký tự, bài sau mình sẽ giới thiệu cách đọc ghi
file dùng luồng ký tự!
1, Nhập Console dùng luồng ký tự:
- Để đọc dữ liệu nhập từ Console thì lớp tốt nhất là lớp BufferdReader. Nhưng ở đây, chúng ta không
có cách nào xây dựng 1 lớp BufferedReader trực tiếp từ System.in vì thế nên cần chuyển nó thành
luồng ký tự bằng cách dùng InputStreamReader để chuyển byte thành ký tự!
- Để có được một đối tượng InputStreamReader gắn với System.in ta dùng constructor của
Page 142
InputStreamReader.
InputStreamReader(InputStream inputStream) - Tiếp theo dùng đối tượng InputStreamReader đã tạo ra để tạo ra một BufferedReader dùng
constructor BufferedReader.
BufferedReader(Reader inputReader)
**Ví dụ 1: Tạo một đối tượng BufferedReader gắn với bàn phím:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - Sau khi thực hiện câu lệnh trên, br là một luồng ký tự gắn với Console thông qua System.in.
Tiếp theo ta sẽ dùng BufferedReader để đọc từng ký tự từ Console. Việc đọc kết thúc khi gặp dấu
chấm (dấu chấm để kết thúc chương trình). PHP:
package javaandroidvn;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
char c;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Nhập chuỗi ký tự, kết thúc bằng dấu chấm .");
do {
c = (char) br.read();
System.out.println(c);
} while (c != '.');
}
}
**Ví dụ 2: Dùng BufferedReader đọc chuỗi ký tự từ Console. In ký tự vừa nhập vào! PHP:
package javaandroidvn;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
// Tạo đối tượng BufferedReader sử dụng System.in
BufferedReader br = new BufferedReader(new InputStreamReader(System.i
n));
String str;
System.out.print("Nhập chuỗi: ");
//Nhập chữ không dấu thôi nhé!
str = br.readLine();
System.out.println("Chuỗi vừa nhập là: " + str);
Page 143
}
}
2, Xuất dữ liệu ra Console dùng luồng ký tự
Tiếp tục sẽ là 1 cách khác để xuất dữ liệu ra Console. Ở đây mình nhắc tới lớp PrinWriter, nó là 1
trong các lớp luồng ký tự. Ta cần phải chỉ định System.out cho luồng xuất.
**Ví dụ 3: Tạo đối tượng PrintWriter để xuất dữ liệu ra Console, dùng lệnh:
PrintWriter pw = new PrintWriter(System.out, true);
Tiếp theo dùng PrintWriter để xuất dữ liệu ra Console PHP:
package javaandroidvn;
import java.io.IOException;
import java.io.PrintWriter;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
int i = 2013;
String str = "Android.Vn ";
//Xuất dữ liệu sử dụng PrintWriter
PrintWriter pw = new PrintWriter(System.out, true);
pw.println("Using a PrintWriter.");
pw.println(str+i);
}
}
Bài tập về nhà:
Làm lại các ví dụ trên! Mọi thắc mắc các bạn có thể bình luận phía dưới, mọi người cùng nhau thảo
luận!
Page 144
Bài 31: Đọc/ghi file dùng luồng ký tự trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,942
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
- Khi chúng ta thao tác với văn bản, có thể sử dụng luồng byte. Tuy nhiên thì sự lựa chọn tốt nhất
không phải là nó mà là luồng ký tự, việc sử dụng luồng ký tự có ưu điểm là thao tác trực tiếp trên các
ký tự Unicode.
Page 145
- Cụ thể ở bài này mình sẽ giới thiệu 2 lớp luồng thường dùng cho việc đọc , ghi dữ liệu file là
FileReader và FileWriter
1, Ghi dữ liệu xuống file văn bản!
Ví dụ: Nhập danh sách tên của 1 lớp học và ghi chúng xuống file tên là "danhsach.txt". Việc đọc và
ghi kết thúc khi người dùng nhập vào chuỗi "stop". PHP:
package javaandroidvn;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
String str;
FileWriter fw;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
try {
fw = new FileWriter("E:\\danhsach.txt");
} catch (IOException exc) {
System.out.println("Có lỗi xảy ra");
return;
}
System.out.println("Nhập danh sách tên: ('stop' để kết thúc chương tr
ình)");
do {
System.out.print(": ");
str = br.readLine();
if (str.compareTo("stop") == 0) {
break;
}
str = str + "\n"; //Dùng để xuống dòng khi nhập xong 1 chuỗi!
fw.write(str);
} while (str.compareTo("stop") != 0);
fw.close();
System.out.println("Bạn mở file ở đường dẫn E:\\danhsach.txt, dũ liệu
đã được lưu!");
}
}
2, Đọc dữ liệu từ File văn bản
Page 146
Ví dụ: Đọc và hiển thị nội dung của file "danhsach.txt" lên màn hình. Trong đó file là file văn bản,
trong là danh sách tên ghi theo từng dòng! Chương trình sẽ đọc file văn bản từng dòng! PHP:
package javaandroidvn;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
try (FileReader fr = new FileReader("E:\\danhsach.txt")) {
//Bạn có thể tạo dữ liệu văn bản dạng UTF-8 - Tiếng Việt
BufferedReader br = new BufferedReader(fr);
String s;
//Đọc từng dòng văn bản!
while ((s = br.readLine()) != null) {
System.out.println(s);
}
}catch(IOException e){
System.out.println("Đã có lỗi xảy ra!");
}
}
}
Bài tập về nhà:
Viết chương trình copy nội dung file "input.txt" sang file "output.txt" sử dụng cách đọc ghi văn bản!
Bạn nào làm xong cố gắng bớt chút ít thời gian đăng lên cho các bạn khác cùng tham khảo nhé!
Page 147
Bài 32: Tìm hiểu về lớp File trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 1,641
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 148
- Lớp File thường được dùng để lấy các thông tin về tập tin cũng như thư mục.
- Hình ảnh ở trên chắc chắn các bạn thấy rất quen thuộc, đó là quá trình 1 phần mềm duyệt thư mục
và chờ người dùng tìm, chọn mở 1 file hoặc thư mục nào đó.
- Kiến thức ở mục này sẽ giúp các bạn hiểu bản chất các câu lệnh có thể làm được điều này, tuy
nhiên nếu bạn chưa biết về lập trình giao diện trong Java thì chưa thể làm được, ở loạt bài viết về lập
trình giao diện trong Java mình sẽ nhắc lại và cùng mọi người làm 1 chương trình
có thể duyệt được file, thư mục tương tự như hình ảnh trên!
**Chúng ta bắt đầu vào tìm hiểu về lớp File:
1, Tạo đối tượng File từ đường dẫn tuyệt đối public File(String pathname)
Ví dụ: PHP:
//Tạo trước thư mục "demo" trong ổ E, nếu không chương trình sẽ lỗi
File f = new File("E:\\demo\\androidvn.txt");
f.createNewFile();
2, Tạo đối tượng File từ tên đường dẫn thu mục và tên tập tin trong thư mục đó PHP:
//Tạo trước thư mục "demo" trong ổ E, nếu không chương trình sẽ lỗi
File f = new File("E:\\demo","androidvn2.txt");
f.createNewFile();
3, Tạo đối tượng File từ một đối tượng File khác
public File(File parent, String child)
Ví dụ: PHP:
File dir = new File ("E:\\demo");
File f = new File(dir,"androidvn3.txt");
f.createNewFile();
4, Tạo 1 thư mục với đường dẫn
Ví dụ: PHP:
File f = new File("E:\\demo2");
f.mkdir();
5, Một số phương thức thường gặp của lớp File
Page 149
6, Lấy danh sách tên các tập tin và thư mục con của đối tượng: Ta sử dụng:
- public String[] list() File đang xét và trả về trong một mảng.
Ví dụ: PHP:
package javaandroidvn;
import java.io.File;
import java.io.IOException;
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
//Tạo trước thư mục "demo" trong ổ E, tạo 1 vài file và thư mục trong
đó
File dir = new File("E:\\demo");
File[] listFile = dir.listFiles();
System.out.println("Danh sách file trong thư mục E:\\demo là: ");
for (int i = 0; i < listFile.length; i++) {
if (listFile[i].isFile()) {
System.out.println(listFile[i].getName());
}
}
System.out.println("Danh sách thưc mục trong thư mục E:\\demo là: ");
for (int i = 0; i < listFile.length; i++) {
if (listFile[i].isDirectory()) {
System.out.println(listFile[i].getName());
}
}
}
}
Tham khảo thêm 3 video của anh Việt bên blog StudyAndShare
Page 150
Bài tập về nhà:
(Lần này mình giao bài khó khó chút nhé)
Tạo 1 chương trình gần giống cmd trong ms-dos chạy trên màn hình console, chức năng như sau:
- Bật chương trình lên mặc định vào ổ E (hoặc ổ nào tùy ý), hiện lên E:\\ (Tên đường đang hiện hành)
- Gõ "cd tenThuMuc" thì màn hình chuyển và hiện lên E:\\tenThuMuc trong đó tenThuMuc là tên
thư mục tiếp tục muốn truy xuất.
- Gõ "makeFile tenFile" thì sẽ tạo file trong thư mục hiện hành, trong đó tenFile là tên file cần tạo.
- Từ vị trí con trỏ hiện hành, gõ "show" thì hiển thị ra toàn bộ cấu trúc cây thư mục trong thư mục đó.
....
Trình bày khá dài dòng nhỉ, các bạn cứ cố gắng làm càng giống cmd trong ms-dos càng hay, bạn nào làm xong nhớ share mọi người cùng tham khảo nhé
Page 151
Bài 33: Đọc ghi file theo Object trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 22/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,266
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 152
- Đặt 1 tình huống thực tế: khi ta muốn quản lý 1 danh sách sinh viên, tất nhiên sẽ là 1 dãy rất nhiều
đối tượng, mỗi đối tượng sinh viên lại có nhiều thuộc tính: tên, tuổi, điểm, .v..v.. và chúng ta cần lưu
toàn bộ thông tin này vào file, ngoài ra còn phải xử lý, chỉnh sửa thông tin nếu cần. Như vậy, nếu sử
dụng kiến thức ở những bài trước làm điều này thì là rất khó khăn. Nhưng với phần kiến thức ở bài
này thì điều đó lại trở lên cực kỳ dễ dàng. Cụ thể ở bài tập giống như tình huống giả thiết trên, chúng
ta sẽ sử dụng kiểu đọc ghi object để thao thác, lưu trữ từng đối tượng lên file!
- Mình sẽ viết 2 ví dụ cụ thể, với các mức độ khác nhau,từ đơn giản nhất. Nếu bạn thấy khó hiểu chỗ
nào có thể bình luận phía dưới. Mọi người cùng trao đổi.
**Chú ý: Để đọc ghi theo Object trong Java thì tại class Object đó ta cần đặt giao tiếp
java.io.Serializable (implements Serializable)
Ví dụ 1: Đọc ghi 1 đối tượng lên file theo từng object: - Khai báo 1 class SinhVien gồm 2 thuộc tính họ tên, tuổi. Tạo 1 đối tượng cụ thể sinh viên a sau đó
gán thông tin cho sinh viên a rồi ghi đối tượng a này xuống file "E:\\sinhvien.dat"
- Mở file trên ra. Đọc file đó theo kiểu object để lấy đối tượng đó ra, (cần ép kiểu về kiểu dữ liệu của
đối tượng), rồi gán nó vào đối tượng a1. In ra màn hình thông tin đối tượng a1. Code như sau:
PHP:
package javaandroidvn;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class SinhVien implements Serializable {
public String hoTen;
public int tuoi;
}
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
SinhVien a = new SinhVien();
a.hoTen = "Vũ Văn Tường";
a.tuoi = 21;
try {
FileOutputStream f = new FileOutputStream("E:\\sinhvien.dat");
ObjectOutputStream oOT = new ObjectOutputStream(f); // Sử dụng để
ghi file theo từng Object
oOT.writeObject(a); // Ghi Object là đối tượng a xuống file
oOT.close();
f.close();
} catch (IOException e) {
System.out.println("Có lỗi xảy ra!");
}
SinhVien a1 = new SinhVien(); //Tạo đối tượng a1 mới, để phía dưới gá
Page 153
n bằng đối tượng ta lấy được ra từ file
try {
FileInputStream f = new FileInputStream("E:\\sinhvien.dat");
ObjectInputStream oIT = new ObjectInputStream(f); // Sử dụng để đ
ọc file theo từng Object
a1 = (SinhVien) oIT.readObject(); //Đọc Object đầu tiên ép kiểu v
ề kiểu SinhVien sau đó gán bằng đối tượng a1
oIT.close();
f.close();
} catch (IOException io) {
System.out.println("Có lỗi xảy ra!");
} catch (ClassNotFoundException ex) {
System.out.println("Không tìm thấy class");
}
System.out.println("Thông tin sinh vien a1 đọc ra là: \nTên: "+a1.hoT
en+"\nTuổi: "+a1.tuoi);
}
}
Ví dụ 2: Đọc ghi 2 đối tượng lên file theo từng object. Các thuộc tính bài này để
private: (Qua ví dụ này, và kết hợp bài sau, mình sẽ giới thiệu cách đọc ghi 1 danh sách các đối tượng lên
file, giúp việc quản lý danh sách các đối tượng dễ dàng hơn!) PHP:
package javaandroidvn;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class SinhVien implements Serializable {
private String hoTen;
private int tuoi;
public String getHoTen() {
return hoTen;
}
public void setHoTen(String hoTen) {
this.hoTen = hoTen;
}
public int getTuoi() {
return tuoi;
}
public void setTuoi(int tuoi) {
this.tuoi = tuoi;
}
}
Page 154
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
SinhVien a = new SinhVien();
a.setHoTen("Vũ Văn T");
a.setTuoi(21);
SinhVien b = new SinhVien();
b.setHoTen("Nguyễn Văn A");
b.setTuoi(22);
try {
FileOutputStream f = new FileOutputStream("E:\\sinhvien.dat");
ObjectOutputStream oOT = new ObjectOutputStream(f); // Sử dụng để
ghi file theo từng Object
oOT.writeObject(a); // Ghi Object là đối tượng a xuống file
oOT.writeObject(b);
oOT.close();
f.close();
} catch (IOException e) {
System.out.println("Có lỗi xảy ra!");
}
SinhVien a1 = new SinhVien(); //Tạo đối tượng a1 mới, để phía dưới gá
n bằng đối tượng ta lấy được ra từ file
SinhVien b1 = new SinhVien(); //Tạo đối tượng b1 mới, để phía dưới gá
n bằng đối tượng ta lấy được ra từ file
try {
FileInputStream f = new FileInputStream("E:\\sinhvien.dat");
ObjectInputStream oIT = new ObjectInputStream(f); // Sử dụng để đ
ọc file theo từng Object
a1 = (SinhVien) oIT.readObject(); //Đọc Object đầu tiên ép kiểu v
ề kiểu SinhVien sau đó gán bằng đối tượng a1
b1 = (SinhVien) oIT.readObject(); //Đọc Object tiếp theo, ép kiểu
về kiểu SinhVien sau đó gán bằng đối tượng b1
oIT.close();
f.close();
} catch (IOException io) {
System.out.println("Có lỗi xảy ra!");
} catch (ClassNotFoundException ex) {
System.out.println("Không tìm thấy class");
}
System.out.println("Thông tin sinh vien a1 đọc ra là: \nTên: " + a1.g
etHoTen() + "\nTuổi: " + a1.getTuoi());
System.out.println("Thông tin sinh vien b1 đọc ra là: \nTên: " + b1.g
etHoTen() + "\nTuổi: " + b1.getTuoi());
}
}
Page 155
Bài tập về nhà:
Class thẻ thư viện có các thuộc tính: mã thẻ, tên sinh viên, số sách mượn. Tạo ra 3 đối tượng thẻ thư
viện, gán giá trị nhập vào từ bàn phím. Ghi lại thông tin 3 đối tượng này xuống file theo kiểu object rồi đọc file đó, đọc dữ liệu các đối tượng từ trong file vừa ghi, in ra màn hình!
Page 156
Bài 34: ArrayList trong Java (1) Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 23/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 4,056
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
- Thực tế, khi để quản lý 1 danh sách hóa đơn, thông tin khách hàng, học sinh ...v..v..Chúng ta sẽ cần
đến một khái niệm đó là mảng các đối tượng. Nghĩa là mỗi thành phần trong mảng là các đối tượng,
Page 157
các đối tượng lại có rất nhiều thuộc tính.
- Mảng thông thường có thể đáp ứng được một phần, nhưng chưa đủ. Vì trong quá trình thao tác dữ
liệu, ta lại cần thêm, xóa, sửa, chèn. v..v.v.. Nghĩ đến các thao tác này, nếu bạn nào đã từng học C và
Pascal chắc chắn sẽ nghĩ tới con trỏ, vì chỉ có con trỏ mới có thể. Nhưng làm việc với con trỏ trong C
và Pascal khá mệt mỏi và dài dòng, khó hiểu, thậm chí nhiều bạn không thể học nổi khi gặp phần này
và bỏ cuộc với lập trình vì nó! ^^
- Nói vậy các bạn đừng lo lắng, vì ArrayList học cực kỳ dễ dàng, thậm chí bạn không hiểu con trỏ
bạn vẫn có thể thao tác được!
- ArrayList có thể nói nó là 1 phiên bản nâng cấp của mảng. Nó cũng truy xuất dữ liệu theo chỉ số,
nhưng nó có nhiều điều vượt trội hơn rất nhiều so với mảng!
**Một trong những điều khiến mình rất thích khi học các bài Java cơ bản đó chính là ArrayList.
Mình sẽ giới thiệu 1 số phương thức thông dụng hay dùng trong ArrayList , và sẽ giải thích chúng
thông qua các ví dụ phía dưới, còn lại khi thực hiện các bạn tự tìm hiểu bằng "Ctrl + cách"
Ví dụ 1: Tạo 1 mảng kiểu ArrayList để xử lý 1 danh sách tên học sinh, đơn giản thôi nhé, chưa xử lý các đối
tượng nhiều thuộc tính. Ví dụ này chỉ là 1 ArrayList giống 1 mảng thông thường. Với ví dụ này,
chúng ta sẽ làm quen với khác phương thức thêm, chèn, sửa, xóa! PHP:
package javaandroidvn;
import java.util.ArrayList;
public class JavaAndroidVn {
public static void main(String[] args) {
ArrayList listHS = new ArrayList(); // Khai báo 1 đối tượng ArrayList
String ten1 = "Vu Van T"; //Tạo đối tượng ten1 là tên 1 người
listHS.add(ten1); //Thêm đối tượng ten1 vào trong listHS
String ten2 = "Nguyen Van A";
listHS.add(ten2);
String ten3 = "Nguyen Van B";
listHS.add(ten3);
String ten4 = "Vu Van C";
listHS.add(ten4);
//Như vậy tới đoạn code trên, ArrayList listHS đã có 4 đối tượng được
thêm vào!
// Tương tự như mảng, ArrayList truy xuất theo chỉ số và bắt đầu từ 0
for (int i = 0; i < listHS.size(); i++) { // listHS.size() là
lấy ra kích cỡ của listHS
System.out.println(listHS.get(i)); //Lấy ra từng đối tượ
ng theo chỉ số!
}
//Chèn thêm 1 đối tượng tenChen vào vị trí bất kỳ của ArrayList!
String tenChen = "Nguyen Van Chen";
listHS.add(2, tenChen); //Nó sẽ chèn vào vị trí số 2 và đẩy danh sác
Page 158
h dài ra sau!
System.out.println("\nDanh sách sau khi bị chèn thêm: ");
for (int i = 0; i < listHS.size(); i++) {
System.out.println(listHS.get(i));
}
//Sửa giá trị của 1 đối tượng, gán nó bằng đối tượng khác theo chỉ số
!
System.out.println("\nDanh sách sau khi bị sửa giá trị 1 đối tượng: "
);
String tenSet = "Hoang Van Set";
listHS.set(3, tenSet); //Sủa phần tử thứ 3 thành phần tử tenSet
for (int i = 0; i < listHS.size(); i++) {
System.out.println(listHS.get(i));
}
//Xóa 1 phần tử trong ArrayList
System.out.println("\nPhần tử thứ 1 đã bị xóa đi");
listHS.remove(1);
for (int i = 0; i < listHS.size(); i++) {
System.out.println(listHS.get(i));
}
System.out.println("\nXóa toàn bộ các phần tử ArrayList");
listHS.clear();
for (int i = 0; i < listHS.size(); i++) {
System.out.println(listHS.get(i));
} //Sẽ không còn gì để in ra nữa!
}
}
Ví dụ 2: Tạo 1 mảng các đối tượng, mỗi đối tượng gồm 2 thuộc tính tên và tuổi. Gán một vài giá trị rồi in ra
màn hình! Các phương thức thao tác tương tự như ở ví dụ 1, chỉ có sự khác biệt là cách khai báo
mảng, các bạn chú ý nhé! PHP:
package javaandroidvn;
import java.util.ArrayList;
class HocSinh{
public String ten;
public int tuoi;
}
public class JavaAndroidVn {
public static void main(String[] args) {
ArrayList<HocSinh> listHS = new ArrayList(); // Khai báo 1 đối tượng
ArrayList, các phần tử tạo ra từ lớp HocSinh
HocSinh a = new HocSinh();
a.ten = "Vũ Văn A";
a.tuoi = 19;
listHS.add(a); // Thêm đối tượng và listHS
HocSinh b = new HocSinh();
b.ten = "Vũ Văn B";
Page 159
b.tuoi = 20;
listHS.add(b);
HocSinh c = new HocSinh();
c.ten = "Vũ Văn C";
c.tuoi = 22;
listHS.add(c);
System.out.println("Thông tin các học sinh đã thêm vào ArrayList là:
");
for(int i=0; i<listHS.size(); i++){
System.out.println("Tên: "+listHS.get(i).ten+" Tuổi: "+listHS.get
(i).tuoi);
}
}
}
Ví dụ 3: Nhập 1 danh sách học sinh từ bàn phím, danh sách có n phần tử . Mỗi phần tử có 2 thuộc tính là tên
và tuổi. In toàn bộ danh sách ra màn hình! Các thuộc tính để private PHP:
package javaandroidvn;
import java.util.ArrayList;
import java.util.Scanner;
class HocSinh {
private String ten;
private int tuoi;
public String getTen() {
return ten;
}
public void setTen(String ten) {
this.ten = ten;
}
public int getTuoi() {
return tuoi;
}
public void setTuoi(int tuoi) {
this.tuoi = tuoi;
}
}
public class JavaAndroidVn {
public static void main(String[] args) {
ArrayList<HocSinh> listHS = new ArrayList(); // Khai báo 1 đối tượng
ArrayList, các phần tử tạo ra từ lớp HocSinh
Scanner input = new Scanner(System.in);
Page 160
System.out.println("Nhập số học sinh: ");
int n = input.nextInt();
for (int i = 0; i < n; i++) {
HocSinh x = new HocSinh(); //Tạo đối tượng x để lưu tạm thời dữ l
iệu
System.out.println("Học sinh thứ " + i + ": ");
input.nextLine(); //Dòng này tránh bị trượt dòng!
System.out.print("Tên: ");
String tenX = input.nextLine();
System.out.print("Tuổi: ");
int tuoiX = input.nextInt();
x.setTen(tenX);
x.setTuoi(tuoiX);
listHS.add(x); // Thêm đối dữ liệu về x vào trong ArrayList
}
System.out.println("Thông tin danh sách vừa nhập vào là: ");
for (int i = 0; i < listHS.size(); i++) {
System.out.print("Học sinh thứ " + i);
System.out.print(" - Tên " + listHS.get(i).getTen() + " Tuổi: " +
listHS.get(i).getTuoi()+"\n");
}
}
}
Bài này mình giới thiệu chút vậy thôi nhé, bài sau mình sẽ viết tiếp về ArrayList, nó còn khá
nhiều cái hay! ^^
Bài tập về nhà:
Tạo 1 chương trình từ điển Anh - Việt nhỏ gồm 1 mảng các từ. Mỗi từ có 2 thuộc tính là "từ" và
"nghĩa". Số từ của từ điển nhập vào từ bàn phím, nhập các thông tin của từng từ vào.
Page 161
Thêm tính năng tra từ ở phía cuối chương trình, yêu cầu người dùng nhập từ cần tra nghĩa rồi tìm kiếm, in ra màn hình nghĩa của từ vừa yêu cầu tìm!
Page 162
Bài 35: ArrayList trong Java (2) Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 23/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,207
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Ở bài viết này, mình sẽ chia sẽ về cách lưu lại dữ liệu khi trong chương trình sử dụng ArrayList.
Thực ra, kết hợp với bài trước, bài đọc ghi Object, sẽ có nhiều bạn làm được điều này ngay. Nhưng
Page 163
mình sẽ viết để cho một số bạn cảm thấy khó khăn tham khảo luôn. Mình sẽ chú thích trong code!
Về cách lưu lên file ở chương trình có dùng ArrayList, mình dùng 2 cách như sau
Cách 1: Lưu trữ các đối tượng trong một đối tượng ArrayList xuống file!
Chương trình dưới đây sẽ lưu toàn bộ các đối tượng học sinh xuống file, để thao tác, ta nạp các đối
tượng này và 1 đối tượng ArrayList PHP:
package javaandroidvn;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
class HocSinh implements Serializable {
private String ten;
private int tuoi;
public String getTen() {
return ten;
}
public void setTen(String ten) {
this.ten = ten;
}
public int getTuoi() {
return tuoi;
}
public void setTuoi(int tuoi) {
this.tuoi = tuoi;
}
}
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
ArrayList<HocSinh> listHS = new ArrayList(); // Khai báo 1 đối tượng
ArrayList, các phần tử tạo ra từ lớp HocSinh
Scanner input = new Scanner(System.in);
System.out.println("Nhập số học sinh: ");
int n = input.nextInt();
//Lấy dữ liệu và ghi vào file
try {
FileOutputStream f = new FileOutputStream("E:\\hocsinh.dat");
Page 164
ObjectOutputStream oOT = new ObjectOutputStream(f); // Sử dụng để
ghi file theo từng Object
for (int i = 0; i < n; i++) {
HocSinh x = new HocSinh(); //Tạo đối tượng x để lưu tạm thời
dữ liệu
System.out.println("Học sinh thứ " + i + ": ");
input.nextLine(); //Dòng này để tránh bị trượt dòng!
System.out.print("Tên: ");
String tenX = input.nextLine();
System.out.print("Tuổi: ");
int tuoiX = input.nextInt();
x.setTen(tenX);
x.setTuoi(tuoiX);
oOT.writeObject(x); // Ghi Object là đối tượng x xuống file
}
} catch (FileNotFoundException ex) {
Logger.getLogger(JavaAndroidVn.class.getName()).log(Level.SEVERE,
null, ex);
}
//Đọc dữ liệu từ file, lấy các object ra rồi gán vào ListHS
try {
FileInputStream f2 = new FileInputStream("E:\\hocsinh.dat");
ObjectInputStream oIT = new ObjectInputStream(f2); // Sử dụng để
đọc file theo từng Object
HocSinh x = new HocSinh(); //Tạo đối tượng x để lưu tạm thời dữ l
iệu
for (int i = 0; i < n; i++) {
x = (HocSinh) oIT.readObject(); //Đọc Object đầu tiên ép kiểu
về kiểu SinhVien sau đó gán bằng đối tượng a1
listHS.add(x);
}
oIT.close();
f2.close();
} catch (IOException io) {
System.out.println("Có lỗi xảy ra!");
} catch (ClassNotFoundException ex) {
System.out.println("Không tìm thấy class");
}
//In thông tin ra ngoài!
System.out.println("Thông tin danh sách vừa nhập vào là: ");
for (int i = 0; i < listHS.size(); i++) {
System.out.print("Học sinh thứ " + i);
System.out.print(" - Tên " + listHS.get(i).getTen() + " Tuổi: " +
listHS.get(i).getTuoi() + "\n");
}
}
}
Page 165
Cách 2: Lưu đối tượng ArrayList xuống File
Vì bản thân listHS là 1 đối tượng, nên ngắn gọn ta chỉ cần lưu trữ đối tượng listHS là được! PHP:
package javaandroidvn;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
class HocSinh implements Serializable {
private String ten;
private int tuoi;
public String getTen() {
return ten;
}
public void setTen(String ten) {
this.ten = ten;
}
public int getTuoi() {
return tuoi;
}
public void setTuoi(int tuoi) {
this.tuoi = tuoi;
}
}
public class JavaAndroidVn {
public static void main(String[] args) throws IOException {
ArrayList<HocSinh> listHS = new ArrayList(); // Khai báo 1 đối tượng
ArrayList, các phần tử tạo ra từ lớp HocSinh
Scanner input = new Scanner(System.in);
System.out.println("Nhập số học sinh: ");
int n = input.nextInt();
//Lấy dữ liệu và ghi vào file
for (int i = 0; i < n; i++) {
HocSinh x = new HocSinh(); //Tạo đối tượng x để lưu tạm thời dữ l
iệu
System.out.println("Học sinh thứ " + i + ": ");
input.nextLine(); //Dòng này để tránh bị trượt dòng!
Page 166
System.out.print("Tên: ");
String tenX = input.nextLine();
System.out.print("Tuổi: ");
int tuoiX = input.nextInt();
x.setTen(tenX);
x.setTuoi(tuoiX);
listHS.add(x);
}
try {
FileOutputStream f = new FileOutputStream("E:\\hocsinh.dat");
ObjectOutputStream oOT = new ObjectOutputStream(f); // Sử dụng để
ghi file theo từng Object
oOT.writeObject(listHS); // Ghi Object là đối tượng x xuống file
} catch (FileNotFoundException ex) {
Logger.getLogger(JavaAndroidVn.class.getName()).log(Level.SEVERE,
null, ex);
}
//Đọc dữ liệu từ file, lấy các object ra rồi gán vào ListHS
ArrayList<HocSinh> listHS2 = new ArrayList(); // Khai báo 1 đối tượng
ArrayList thứ 2, các phần tử tạo ra từ lớp HocSinh
//Dùng để lưu dữ liệu riêng khi ta đọc file!
try {
FileInputStream f2 = new FileInputStream("E:\\hocsinh.dat");
ObjectInputStream oIT = new ObjectInputStream(f2); // Sử dụng để
đọc file theo từng Object
listHS2 = (ArrayList<HocSinh>) oIT.readObject(); //Ép kiểu đối tư
ợng lấy từ file ra về dạng ArrayList<HocSinh>
oIT.close();
f2.close();
} catch (IOException io) {
System.out.println("Có lỗi xảy ra!");
} catch (ClassNotFoundException ex) {
System.out.println("Không tìm thấy class");
}
//In thông tin ra ngoài! Thông tin lấy từ đối tượng ListHS2 vừa đọc t
ừ file
System.out.println("Thông tin danh sách vừa nhập vào là: ");
for (int i = 0; i < listHS2.size(); i++) {
System.out.print("Học sinh thứ " + i);
System.out.print(" - Tên " + listHS2.get(i).getTen() + " Tuổi: "
+ listHS2.get(i).getTuoi() + "\n");
}
}
}
Page 167
Bài tập về nhà:
Làm chương trình từ điển. Danh sách từ là danh sách các đối tượng gồm 2 thuộc tính từ và nghĩa
Số từ nhập vào từ màn hình. Nhập dữ liệu các từ qua màn hình console. Khi nhập dữ liệu xong, toàn
bộ dữ liệu được lưu vào file theo kiểu object.
Sau đó chương trình hỏi từ cần tìm, nhập từ cần tìm. Chương trình đọc file vừa ghi, rồi tìm kiếm nghĩa của từ vừa nhập, in ra nghĩa của từ cần tra cứu!
Page 168
Bài 36: Sắp xếp các đối tượng trong ArrayList Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 23/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,558
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
Page 169
**Trong thực tế khi lập trình, công việc sắp xếp 1 danh sách các đối tượng phải áp dụng rất nhiều. Ví
dụ:
- Sắp xếp họ tên theo thứ tự a, b, c.
- Sắp xếp danh sách kết quả thi theo thứ tự từ cao xuống thấp.
- Sắp xếp tài liệu theo thứ tự mới trước, cũ sau.
- ..v.v..
- Việc sắp xếp một các đối tượng trong 1 ArrayList có thể có nhiều cách. Các bạn có thể áp dụng các
phương pháp cơ bản, hoán đổi vị trí khi so sánh giống như việc sắp xếp các phần tử trong mảng đã
dùng. Tuy nhiên, ở bài này mình sẽ giới thiệu 1 cách sắp xếp cực ngắn gọn, Java đã hỗ trợ sẵn, đó là
phương thức sắp xếp Collection.sort.
- Mình sẽ nêu một vài ví dụ cụ thể để các bạn cùng tìm hiểu!
Ở các ví dụ này, các thuộc tính đối tượng mình để public cho ngắn gọn, chúng ta tập trung vào đoạn
sắp xếp!
Ví dụ 1: Sắp xếp một danh sách các đối tượng sinh viên có 2 thuộc tính họ tên và
điểm thi. Các bạn chú ý đoạn này: PHP:
//Sắp xếp danh sách theo theo số điểm giảm dần!
Collections.sort(danhSach, new Comparator<SinhVien>() {
@Override
public int compare(SinhVien sv1, SinhVien sv2) {
if (sv1.diem < sv2.diem) {
return 1;
} else {
if (sv1.diem == sv2.diem) {
return 0;
} else {
return -1;
}
}
}
});
- Trên là cách sử dụng phương thức Collections.sort với danhSach là một đối tượng ArrayList, bên
trong chứa danh sách các đối tượng SinhVien
- Phương thức public int compare(SinhVien sv1, SinhVien sv2) trả về kiểu giá trị nguyên. Đoạn
code trên là giúp sắp xếp theo thứ tự giảm dần của số điểm từng đối tượng sinh viên. Nếu bạn muốn
sắp xếp tăng dần thì đổi chỗ 1 và -1 cho nhau là được! PHP:
Collections.sort(danhSach, new Comparator<SinhVien>() {
@Override
public int compare(SinhVien sv1, SinhVien sv2) {
if (sv1.diem < sv2.diem) {
return -1;
} else {
if (sv1.diem == sv2.diem) {
return 0;
} else {
return 1;
}
Page 170
}
}
});
Toàn bộ code chương trình như sau: PHP:
package javaandroidvn;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
class SinhVien {
public String hoTen;
public int diem;
}
public class JavaAndroidVn {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Nhập số sinh viên: ");
int n = input.nextInt();
ArrayList<SinhVien> danhSach = new ArrayList();
for (int i = 0; i < n; i++) {
input.nextLine();
SinhVien x = new SinhVien();
System.out.println("Thông tin sinh viên thứ " + i);
System.out.print("Họ và Tên: ");
x.hoTen = input.nextLine();
System.out.print("Điểm: ");
x.diem = input.nextInt();
danhSach.add(x);
}
//Sắp xếp danh sách theo số điểm giảm dần!
Collections.sort(danhSach, new Comparator<SinhVien>() {
@Override
public int compare(SinhVien sv1, SinhVien sv2) {
if (sv1.diem < sv2.diem) {
return 1;
} else {
if (sv1.diem == sv2.diem) {
return 0;
} else {
return -1;
}
}
}
});
System.out.println("Danh sách sắp xếp theo thứ tự điểm giảm dần là: "
);
Page 171
for (int i = 0; i < danhSach.size(); i++) {
System.out.println("Tên: " + danhSach.get(i).hoTen + " Điểm: " +
danhSach.get(i).diem);
}
}
}
Ví dụ 2: Sắp xếp danh sách các đối tượng theo thứ tự trong bảng chữ cái! a b c PHP:
package javaandroidvn;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
class SinhVien {
public String hoTen;
public int diem;
}
public class JavaAndroidVn {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Nhập số sinh viên: ");
int n = input.nextInt();
ArrayList<SinhVien> danhSach = new ArrayList();
for (int i = 0; i < n; i++) {
input.nextLine();
SinhVien x = new SinhVien();
System.out.println("Thông tin sinh viên thứ " + i);
System.out.print("Họ và Tên: ");
x.hoTen = input.nextLine();
System.out.print("Điểm: ");
x.diem = input.nextInt();
danhSach.add(x);
}
//Sắp xếp danh sách theo theo thứ tự a b c!
Collections.sort(danhSach, new Comparator<SinhVien>() {
@Override
public int compare(SinhVien sv1, SinhVien sv2) {
return (sv1.hoTen.compareTo(sv2.hoTen));
// Muốn đảo danh sách các bạn đối thành
//return (sv2.hoTen.compareTo(sv1.hoTen));
}
});
System.out.println("Danh sách sắp xếp theo tên trong bảng chữ cái a -
b - c: ");
for (int i = 0; i < danhSach.size(); i++) {
System.out.println("Tên: " + danhSach.get(i).hoTen + " Điểm: " +
danhSach.get(i).diem);
Page 172
}
}
}
Bài tập về nhà:
- Nhập dữ liệu danh sách nhân viên trong công ty. Các phần tử trong danh sách có các thuộc tính họ
tên, năm sinh, lương. Các thuộc tính để private.
- Viết chương trình nhập dữ liệu từ bàn phím thông tin số nhân viên, thông tin từng nhân viên. Cuối
chương trình có menu chọn.
+ Nếu ấn 1 thì sắp xếp theo thứ tự tên a, b, c. In danh sách ra màn hình.
+ Nếu ấn 2 thì sắp xếp theo mức lương giảm dần từ người cao xuống người thấp. In danh sách ra màn hình.
Page 173
Bài 37: HashMap trong Java Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 24/8/13.
Theo dõi chủ đề
1.
Tiasangmoi92Super Moderator
Lượt xem: 2,510
/* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
trên diễn đàn Android.Vn, bạn có thể vào đây đọc
để hiểu hơn về khóa học và tham gia ngay cùng mọi người */
** Gần giống với ArrayList, tuy nhiên HashMap là 1 kiểu đối tượng lưu giá trị theo cặp key / value
Key trong 1 đối tượng kiểu HashMap là duy nhất. HashMap truy cập theo key, không theo số thứ tự
Page 174
giống ArrayList hoặc Array.
** Với mỗi key, bạn sẽ tìm được giá trị tương ứng với key đó. Các key là duy nhất nhưng các giá trị
tương ứng với các key khác nhau thì có thể trùng nhau.
** Kiểu đối tượng của giá trị key/value của HashMap phải đồng nhất. Trong trường hợp không xác
định kiểu dữ liệu thì java sẽ xem như là kiểu Object – là cha của tất cả đối tượng khác trong Java.
1, Khởi tạo một Hashmap
**Khởi tạo từ interface Map, chưa định nghĩa kiểu giá trị PHP:
Map hMap1 = new HashMap();
**Khởi tạo từ interface Map, định nghĩa trước kiểu giá trị PHP:
Map<Integer, String> hMap2 = new HashMap();
**Khởi tạo từ HashMap, chưa định nghĩa trước kiểu giá trị PHP:
HashMap hMap3 = new HashMap();
**Khởi tạo từ HashMap, định nghĩa trước kiểu giá trị PHP:
HashMap<Integer, String> hMap4 = new HashMap();
HashMap hMap5 = new HashMap<Integer, String>();
HashMap<Integer, String> hMap6 = new HashMap<Integer, String> ();
**Chú ý: HashMap chỉ chấp nhận dữ liệu (cả key và value) là các đối tượng. Do đó, các kiểu int,
long, double,… không được chấp nhận mà phải dùng Integer, Long, Double,…
2, Cách thức đưa dữ liệu vào và lấy dữ liệu ra từ đối tượng HashMap.
Không phải là phương thức add giống ArrayList, khác biệt một chút! Ta sử dụng put và get PHP:
hashmap.put (key, value); //đưa key và value vào hashmap
hashmap.get(key); // Lấy value tương ứng với key trong hashmap
Ví dụ 1: PHP:
package javaandroidvn;
import java.util.HashMap;
public class JavaAndroidVn {
public static void main(String[] args) {
HashMap user = new HashMap();
user.put("ID1", "TranvanA");
user.put("ID2", "NguyenVanT");
user.put("ID3", "VuVanT");
System.out.println(user.get("ID1"));
System.out.println(user.get("ID2"));
System.out.println(user.get("ID3"));
Page 175
}
}
Ví dụ 2: PHP:
package javaandroidvn;
import java.util.HashMap;
public class JavaAndroidVn {
public static void main(String[] args) {
HashMap<Integer, String> user = new HashMap<> ();
user.put(1, "Vu Van A");
user.put(2, "Nguyenvan t");
user.put(3, "Nguyenvan C");
user.put(4, "NguyenvanE");
System.out.println(user.get(1));
System.out.println(user.get(2));
System.out.println(user.get(3));
System.out.println(user.get(4)+"\n");
//Hoặc nếu key gán theo thứ tự số nguyên, có thể dùng :
for (int i=1; i<5; i++){
System.out.println(user.get(i));
}
}
}
**Chú ý: Dữ liệu đưa vào HashMap phải ứng với kiểu dữ liệu đã định nghĩa lúc khởi tạo HashMap.
3, Cách lấy tất cả các giá trị của HashMap
Các bạn xem ví dụ, nó sẽ lấy toàn bộ dữ liệu từ trong đối tượng HashMap ra: PHP:
package javaandroidvn;
import java.util.HashMap;
public class JavaAndroidVn {
public static void main(String[] args) {
HashMap<Integer, String> user = new HashMap<>();
user.put(8, "Vu Van A");
user.put(5, "Nguyenvan t");
user.put(3, "Nguyenvan C");
user.put(10, "NguyenvanE");
for (Integer i : user.keySet()) {
System.out.println(i + " " + user.get(i));
}
}
}
Page 176
**Ngoài ra còn có một vài phương thức như remove, clear dùng để xóa bỏ một đối tượng và xóa
sạch các đối tượng trong HashMap
Xem thêm video blog StudyAndShare
Bài tập về nhà:
Tạo một đối tượng HashMap gồm key là tài khoản, value là mật khẩu. Nhập giá trị các tài khoản và
mật khẩu của 5 đối tượng từ bàn phím. In thông tin tất cả ra ngoài màn hình console!