Chào bạn, bạn đang muốn tự học lập trình Java? Tự học Java tại nhà để tiết kiệm chi phí?





Đây là bài hướng dẫn chi tiết sẽ giúp bạn tự học lập trình Java từ cơ bản đến nâng cao (rất phù hợp dành cho người mới bắt đầu).









Hướng dẫn Tự học Lập trình Java (One for All)





Cũng đừng lo lắng nếu bạn chưa biết gì về lập trình. Bạn sẽ học được tất cả trong bài hướng dẫn này (One for All - Một cho tất cả).









Giới thiệu Series Tự học Java | NIIT - ICT Hà Nội





Việc của bạn là ngồi vào máy tính và bắt đầu đọc và làm theo hướng dẫn.





Bài viết hướng dẫn tự học lập trình Java bao gồm:





Mục tiêu của bài viết này là giúp bạn có kiến thức vững chắc về ngôn ngữ lập trình Java trước khi bạn rời đi.

Chú ý!



KHÓA HỌC JAVA > Nếu bạn muốn học Java nhanh hơn, trực tiếp với chuyên gia doanh nghiệp thì đăng ký ngay:

Một điều cần nhớ trước khi bạn bắt đầu tự học lập trình Java:

"MỖI MỘT VÍ DỤ ĐỀU SẼ GIÚP BẠN HIỂU VÀ QUEN VỚI LẬP TRÌNH JAVA. VÌ THẾ HÃY TỰ CODE LẠI TẤT CẢ CÁC VÍ DỤ ÍT NHẤT 1 - 2 LẦN"







Thế nên, phải quyết tâm cao độ khi bắt đầu tự học Java theo hướng dẫn này.





> Mình khuyên bạn nên đọc bài viết: 6 BƯỚC TỰ HỌC LẬP TRÌNH (như người có kinh nghiệm) để biết có thêm kinh nghiệm khi tự học. Còn nếu bạn thấy lười làm lại ví dụ, thì kết quả chắc chắn sẽ không được tốt.Thế nên, phải quyết tâm cao độ khi bắt đầu tự học Java theo hướng dẫn này.

Nào, giờ nếu bạn đã chắc chắn. Hãy bắt đầu chinh phục ngôn ngữ lập trình Java.

CHƯƠNG I: BẮT ĐẦU TỰ HỌC LẬP TRÌNH JAVA

Để bắt đầu, như mọi lập trình viên khác.





Chúng ta sẽ thử viết chương trình "Hello Word" với Java.

Chương I. Phần 1. Viết chương trình Hello World bằng Java

"Hello, World!" là một chương trình đơn giản để xuất ra dòng chữ Hello, World! trên màn hình.





Vì đây là một chương trình rất đơn giản, nên nó thường được sử dụng để giới thiệu một ngôn ngữ lập trình mới cho người mới học.





Hãy cùng mình xem cách chương trình "Hello, World!" hoạt động.





Nếu bạn muốn chạy chương trình này trong máy tính của mình, bạn phải cài đặt Java đúng cách.

phần mềm lập trình Java (gọi tắt là IDE hoặc trình soạn thảo văn bản) để viết và chỉnh sửa code Java. Ngoài ra, bạn cần một(gọi tắt là IDE hoặc trình soạn thảo văn bản) để viết và chỉnh sửa code Java.

* Bạn có thể tải bộ cài nhanh VSCode for Java với package đóng gói sẵn (chỉ khoảng 38MB) -> Và install.

Chương I. Phần 1.1. Chương trình Hello World trong Java





Video tự học Java 01: Viết chương trình Java đầu tiên: Hello World!



Đây là code của chương trình Hello World bằng ngôn ngữ Java:



// Chương trình "Hello World!"

class HelloWorld { public static void main ( String [] args ) { System . out . println ( "Hello World!" ); } }



Lưu ý: Nếu bạn đã copy code chính xác, bạn cần lưu tên tệp là HelloWorld.java . Đó là vì Java yêu cầu tên của class (lớp) phải giống tên tệp (class chứa hàm main).





Khi bạn chạy chương trình, kết quả sẽ là:



Hello World!



Chương I. Phần 1.2. Chương trình "Hello World!" bằng Java hoạt động thế nào?

Bây giờ, mình sẽ giải thích cách chương trình "Hello World!" hoạt động, từng phần, từng phần 1.



// Your First Program



Trong Java, bất kỳ dòng nào bắt đầu bằng // là một comment (nhận xét).





Comment chỉ dành cho người đọc code để hiểu rõ hơn về ý định và chức năng của chương trình.

Nó hoàn toàn bị bỏ qua trình biên dịch Java.

Máy ảo Java (JVM) dịch chương trình Java sang Java bytecode mà máy tính có thể thực thi.

comment trong Java. Để tìm hiểu thêm về comment, hãy đọc bài viết



class HelloWorld { ... }



Trong Java, mọi ứng dụng bắt đầu với một định nghĩa class.





Trong chương trình trên, HelloWorld là tên của class.





Bây giờ,





Bạn chỉ cần nhớ rằng, mọi ứng dụng Java đều phải định nghĩa class.





Tên của class phải khớp với tên của tệp.



public static void main ( String [] args) { ... }



Đây là phương thức main





Mọi ứng dụng trong Java phải chứa một phương thức main





Và, Trình biên dịch Java sẽ bắt đầu thực thi chương trình từ phương thức main này.

Vì đây là là một chương trình cơ bản để giới thiệu ngôn ngữ lập trình Java cho người mới học.



Nên bạn chưa cần hiểu cách main hoạt động.



Chúng ta sẽ tìm hiểu về public, static, void và cách một phương thức Java hoạt động trong phần sau.

Bây giờ, chỉ cần nhớ rằng máy sẽ đi vào phương thức main đầu tiên.





Và,





Bắt buộc phải có phương thức main trong một chương trình Java.





Tiếp theo,



System . out . println ( "Hello World!" );



Đoạn code trên in chuỗi bên trong dấu ngoặc kép Hello, World! đến đầu ra tiêu chuẩn (màn hình của bạn).

Lưu ý, câu lệnh này nằm trong hàm main, hàm main nằm trong class HelloWorld

Chương I. Phần 1.3. Bạn học được gì từ chương trình Hello, World với Java?

Ok,

Bây giờ bạn đã đi hết phần viết chương trình "Hello, World!" bằng Java.

Và đây là những thứ bạn cần phải nhớ:

Mỗi ứng dụng Java hợp lệ phải có định nghĩa class (khớp với tên tệp)

Phương thức main (bắt buộc phải có) được đặt trong class

Trình biên dịch thực thi code từ hàm main

Đây là một chương trình Java hợp lệ mà không thực hiện gì cả.



// Ví dụ một chương trình Java hợp lệ

public class HelloWorld { public static void main ( String [] args ) { // Viết code gì đó tại đây } }



Đừng lo lắng nếu bạn không hiểu ý nghĩa của class , static , phương thức ( method ), v.v.

Bạn sẽ được học chi tiết trong các phần sau.

Chú ý!



Phần 2.1, 2.2, 2.3 ngay bên dưới đây là một phần khá là lý thuyết để giúp bạn hiểu về cấu trúc của ngôn ngữ Java và JVM. Bạn cũng có thể lướt qua nhanh hoặc đi ngay vào phần 3.

Chương I. Phần 2. Tìm hiểu về JDK, JRE và JVM

Trong phần này, bạn sẽ được tìm hiểu về sự khác biệt chính giữa JDK, JRE và JVM.

Chương I. Phần 2.1. JVM là cái gì? Có gì ảo diệu?

JVM (Máy ảo Java) là một máy trừu tượng cho phép máy tính của bạn chạy chương trình Java.

Khi bạn chạy chương trình Java,

Trước tiên, trình biên dịch Java sẽ biên dịch mã Java của bạn thành bytecode.

Sau đó, JVM dịch bytecode thành mã máy gốc (tập hợp các hướng dẫn mà CPU của máy tính thực thi trực tiếp).

Java là một ngôn ngữ độc lập với nền tảng.

Đó là bởi vì khi bạn viết mã Java, nó được viết cho JVM chứ không phải máy tính vật lý (máy tính) của bạn.

Do đó, chỉ cần có JVM là code Java của bạn chạy mọi nơi (Độc lập với nền tảng)







Cách chương trình Java hoạt động, thực thi

Máy ảo Java. Nếu bạn quan tâm đến việc tìm hiểu về Kiến trúc JVM, hãy đọc bài viết

Chương I. Phần 2.2. JRE là cái gì?

JRE (Java Runtime Environment) có nghĩa là môi trường thực thi Java.





JRE là gói phần mềm cung cấp các thư viện Java class, cùng với Máy ảo Java (JVM) và các thành phần khác để chạy các ứng dụng được viết bằng Java.





Hiểu đơn giản JRE là:





JRE = Java class + JVM







Bạn có thể tải xuống JRE từ trang chủ của Oracle (Ông chú phát hành Java) Nếu bạn cần chạy các chương trình Java, nhưng không phát triển ứng dụng nào cả, JRE là thứ bạn cần.Bạn có thể tải xuống JRE từ trang chủ của(Ông chú phát hành Java)

Chương I. Phần 2.3. JDK là gì?

JDK (Java Development Kit) là một bộ công cụ phát triển phần mềm để phát triển các ứng dụng trong Java.





Khi bạn tải xuống JDK, JRE cũng được tải xuống và không cần tải xuống riêng.





Ngoài JRE, JDK cũng chứa số lượng công cụ phát triển (trình biên dịch, JavaDoc, Trình gỡ lỗi Java, v.v.).





JDK = JRE + Compiler + Debugger + ...



JDK.





Đây là mối quan hệ giữa JVM, JRE và JDK. Nếu bạn muốn lập trình ứng dụng Java, hãy tải xuốngĐây là mối quan hệ giữa JVM, JRE và JDK.





Mối liên hệ giữa JVM, JRE và JDK





Chương I. Phần 3. Biến và Kiểu dữ liệu Nguyên thủy

Trong phần này, bạn sẽ tìm hiểu về các biến, cách tạo ra biến trong Java.





Và các kiểu dữ liệu khác nhau mà ngôn ngữ lập trình Java hỗ trợ để tạo các biến.

Chương I. Phần 3.1. Biến trong Java





Video Tự học Java 02: Tìm hiểu về Biến trong Java

biến là một vị trí trong bộ nhớ (vùng lưu trữ) để giữ dữ liệu.





Để chỉ ra vùng lưu trữ, mỗi biến phải được đặt một tên duy nhất (mã định danh). Tìm hiểu thêm về cách đặt tên trong Java. Mộtlà một vị trí trong bộ nhớ (vùng lưu trữ) để giữ dữ liệu.Để chỉ ra vùng lưu trữ, mỗi biến phải được đặt một tên duy nhất (mã định danh). Tìm hiểu thêm về

Chương I. Phần 3.2. Cách khai báo biến trong Java

Đây là một ví dụ để khai báo một biến trong Java.



int tocDoToiDa = 80 ;



Ở đây,





tocDoToiDa là một biến có kiểu dữ liệu int và được gán giá trị 80 . Có nghĩa là biến tocDoToiDa có thể lưu trữ các giá trị nguyên.





* Bạn sẽ tìm hiểu về các kiểu dữ liệu Java một cách chi tiết sau trong bài viết này.

Trong ví dụ này, chúng ta đã gán giá trị cho biến trong quá trình khai báo.





Tuy nhiên, nó không bắt buộc.





Bạn có thể khai báo các biến mà không cần gán giá trị, và sau đó bạn có thể lưu trữ giá trị theo ý muốn. Ví dụ:



int tocDoToiDa ; tocDoToiDa = 80 ;





Giá trị của biến này có thể thay đổi trong chương trình, ví dụ:







int tocDoToiDa ; ... tocDoToiDa = 90 ;







Java là một ngôn ngữ gõ tĩnh (static-typed).





Đọc thêm: Hiểu ngay về Static và Dynamic



Có nghĩa là tất cả các biến phải được khai báo trước khi chúng có thể được sử dụng.





Ngoài ra, trong Java, bạn không thể khai báo 2 biến trùng tên trong cùng phạm vi biến (Variable Scope).





Phạm vi biến là gì?





Đừng vội quan tâm về nó bây giờ.





Bây giờ, bạn chỉ cần nhớ, bạn không thể làm như thế này.







int speedLimit = 80 ; ... .. ... int speedLimit ;







Chương I. Phần 3.3. Quy tắc đặt tên biến trong Java





Ngôn ngữ lập trình Java có bộ quy tắc và quy ước riêng để đặt tên biến.





Đây là những gì bạn cần biết:





Biến trong Java phân biệt chữ HOA - chữ thường





Tên của biến là một chuỗi các chữ cái và chữ số Unicode. Nó có thể bắt đầu bằng một chữ cái, $ hoặc _





Tuy nhiên, tốt hơn hết là sử dụng chữ cái để bắt đầu tên của một biến.





Ngoài ra, tên biến không thể sử dụng khoảng trắng.





Khi tạo các biến, nên chọn một tên có ý nghĩa. Ví dụ: diemSo , soChan , capDo tốt hơn là d , s , c .





Nếu bạn chọn biến là một từ, nên sử dụng chữ cái viết thường. Ví dụ: tốt hơn là sử dụng diem thay vì dIEM hay là DIEM .





Còn nếu bạn muốn đặt tên biến có từ 2 từ trở lên?





Hãy viết thường cho từ đầu tiên, các từ sau viết Hoa chữ cái đầu, ví dụ: tocDoToiDa





Có 4 loại biến trong ngôn ngữ lập trình Java:





Instance Variables (Biến thể hiện / Biến đối tượng)

Class Variables (Biến class) (Static Fields)

Local Variables (Biến cục bộ)

Parameters (Tham số)







Bạn sẽ tìm hiểu về 4 loại biến này ở các chương sau.





Như đã đề cập ở trên, Java là một ngôn ngữ được gõ tĩnh.





Điều này có nghĩa là, tất cả các biến phải được khai báo trước khi chúng có thể được sử dụng.







int tocDo ;





Ở đây, tocDo là một biến và kiểu dữ liệu của nó là int .





Kiểu dữ liệu int xác định rằng biến tocDo chỉ có thể chứa số nguyên (integer).





Nói một cách đơn giản, kiểu dữ liệu của biến xác định các giá trị mà biến có thể lưu trữ.





Có 8 kiểu dữ liệu được xác định trước trong ngôn ngữ lập trình Java, được gọi là kiểu dữ liệu nguyên thủy.





Ngoài các kiểu dữ liệu nguyên thủy, còn có các kiểu dữ liệu được tham chiếu trong Java (bạn sẽ được học về chúng trong các chương sau).





Chương I. Phần 3.4. 8 Kiểu dữ liệu nguyên thủy trong Java





Kiểu dữ liệu #1. Boolean





Video Tự học Java 03: Kiểu dữ liệu Boolean trong Java



Kiểu dữ liệu boolean có hai giá trị có thể là true hoặc false .





Giá trị mặc định: false .





Chúng thường được sử dụng cho các điều kiện đúng / sai.





Ví dụ:



class ViDuKieuBoolean { public static void main ( String [] args ) { boolean dapAn = true ; System . out . println (dapAn); } }







Khi bạn chạy chương trình, kết quả sẽ là:







true







Kiểu dữ liệu #2. byte











Video Tự học Java 04: Kiểu dữ liệu Byte trong Java



Kiểu dữ liệu byte có thể có giá trị từ -128 đến 127.





Kiểu byte được sử dụng để thay thế kiểu int để tiết kiệm bộ nhớ nếu dữ liệu nằm trong khoảng từ [-121, 127].





Giá trị mặc định: 0





Ví dụ:



class ViDuKieuByte { public static void main ( String [] args ) { byte testSo ; testSo = 124 ; System . out . println (testSo); } }



Khi bạn chạy chương trình. Kết quả nhận được là:



124



Kiểu dữ liệu #3. short









Video Tự học Java 05: Kiểu dữ liệu Short trong Java

Kiểu dữ liệu short có thể chứa giá trị từ -32768 đến 32767.

Kiểu short được sử dụng để thay thế kiểu

int

để tiết kiệm bộ nhớ nếu dữ liệu nằm trong khoảng từ [-32768, 32767].

Giá trị mặc định: 0





Ví dụ:



class ViDuKieuShort { public static void main ( String [] args ) { short nhietDo ; nhietDo = - 200 ; System . out . println (nhietDo); } }



Khi bạn chạy chương trình. Kết quả nhận được là:



-200



Kiểu dữ liệu #4. int









Video Tự học Java 06: Kiểu dữ liệu Int trong Java

Kiểu dữ liệu int có thể chứa giá trị từ -2^31 đến 2^31 - 1





Giá trị mặc định: 0





Ví dụ:



class ViDuKieuInt { public static void main ( String [] args ) { int soNguyenA = 5000000 ; System . out . println (soNguyenA); } }



Khi bạn chạy chương trình. Kết quả nhận được là:



5000000



Kiểu dữ liệu #5. long

Kiểu dữ liệu

long

có thể chứa giá trị từ -2^63 đến 2^63 - 1.





Giá trị mặc định: 0





Ví dụ:







class ViDuKieuLong { public static void main ( String [] args ) { long soB = 42332200000L ; System . out . println (soB); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







42332200000







Lưu ý!



Chữ L ở cuối số 42332200000 là không thể tách rời. Nó đại diện cho dữ liệu kiểu long .



Kiểu dữ liệu #6. double







Video Tự học Java 07: Kiểu dữ liệu Double và Float trong Java



Kiểu dữ liệu double là kiểu số thập phân 64-bit





Giá trị mặc định: 0.0 ( 0.0d )





Ví dụ:







class ViDuKieuDouble { public static void main ( String [] args ) { float soDouble = - 10.5d ; System . out . println (soDouble); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







-10.5







Kiểu dữ liệu #7. float



Kiểu dữ liệu float là kiểu số thập phân 32-bit.





Giá trị mặc định: 0.0 ( 0.0f )





Ví dụ:







class ViDuKieuFloat { public static void main ( String [] args ) { float soFloat = - 6.9f ; System . out . println (soFloat); } }





Khi bạn chạy chương trình. Kết quả nhận được là:





-6.9



Kiểu dữ liệu #8. char







Video Tự học Java 08: Kiểu dữ liệu char trong Java



Kiểu dữ liệu char có thể chứa giá trị unicode 16-bit





Giá trị tối đa của kiểu dữ liệu char là '\u0000' (0). Giá trị tối thiểu là '\uffff'





Giá trị mặc định: '\u0000'





Ví dụ:







class ViDuKieuChar { public static void main ( String [] args ) { char letter = ' \u 0051' ; System . out . println (letter); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







Q





Bạn nhận dược giá trị Q bởi vì ký tự tương ứng với giá trị Unicode '\u0051' là Q .





Đây là một ví dụ khác về kiểu dữ liệu char:







class ViDuKieuChar2 { public static void main ( String [] args ) { char letter1 = '9' ; System . out . println (letter1); char letter2 = 65 ; System . out . println (letter2);

} }





Khi bạn chạy chương trình. Kết quả nhận được là:







9 A







Ngoài ra, Java cũng hỗ trợ cho chuỗi ký tự char thông qua class java.lang.String.





Bạn có thể tạo đối tượng chuỗi trong Java như sau:







chuoiCuaToi = "Tự học Lập trình Java" ;





Chuỗi trong Java là một chủ đề quan trọng.





Chúng ta sẽ tìm hiểu về chúng trong những phần tiếp theo của bài hướng dẫn này.





Chương I. Phần 3.5. Java literals



Để hiểu về literals, hãy lấy một ví dụ về gán giá trị cho biến.







boolean dapAn = false ;





Ở đây:





boolean là kiểu dữ liệu dapAn là biến false là literal



Theo nghĩa đen, literals là code đại diện cho một giá trị cố định.





Các giá trị 3 , 2.5 , true , false xuất hiện trực tiếp trong chương trình mà không đòi hỏi tính toán là literals.





Trong ví dụ trên dapAn là một biến. boolean là kiểu dữ liệu, nó cho phép biến dapAn có thể lưu trữ giá trị true hoặc false .





Để trình biên dịch hiểu nó, nó đã yêu cầu phải tính toán.





Tuy nhiên, literals như là -5 , 'a' , true đại diện cho giá trị cố định.





Chương I. Phần 3.6. Integer Literals



Integer Literals được sử dụng để khởi tạo các biến dữ liệu kiểu nguyên như byte , short , int và long .





Nếu một số nguyên có kết thúc là l hoặc L , nó là kiểu dữ liệu long .





Lưu ý!



Nên sử dụng L thay vì l





// Lỗi! literal 42332200000 của kiểu type nằm ngoài phạm vi long giaTriKieuLong1 = 42332200000 ;

// 42332200000L là kiểu long, nó không nằm ngoài phạm vi long giaTriKieuLong2 = 42332200000L ;





Integer literals có thể được thể hiện trong số thập phân và nhị phân số hệ thống.





Những con số bắt đầu với tố 0x đại diện cho thập lục phân. Tương tự, số bắt đầu với tố 0b đại diện cho nhị phân.







// Hệ Thập phân int soThapPhan = 34 ;

// 0x Đại diện cho hệ thập lục phân int soThapLucPhan = 0x2F ;

// 0b Đại diện cho hệ nhị phân int soNhiPhan = 0b10010 ;





Chương I. Phần 3.7. Floating-point Literals



Floating-point Literals được sử dụng để khởi tạo biến của dữ liệu loại float và double .





Nếu một thập phân số kết thúc với f hoặc F , nó là loại float . Nếu không, nó là của double .





Một số double có thể tùy chọn kết thúc với D hay d . Tuy nhiên, nó không cần thiết.





Chúng cũng có thể biểu diễn trong ký hiệu khoa học sử dụng E hoặc e







class ViDuKieuDouble2 { public static void main ( String [] args ) { double soDouble = 3.4 ; float soFloat = 3.4F ; // 3.445*10^2 double soDoubleKieuKhoaHoc = 3.445e2 ;

System . out . println (soDouble); System . out . println (myFsoFloatloat); System . out . println (myDoubleScientific); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







3.4

3.4

344.5



Chương I. Phần 3.8. Ký tự và Chuỗi literals



Chúng chứa các ký tự Unicode (UTF-16)





char literals thì chúng ta sử dụng dấu nháy đơn ' ' . Ví dụ, 'a' , '\u0000'





String literals thì chúng ta sử dụng dấu nháy kép " " . Ví dụ, "Tự học Lập trình Java" , "Lập trình Java"





Bên cạnh đó, Java cũng hỗ trợ một vài ký tự đặc biệt:





\b là Backspace \t là tab

là một dòng mới \r là return Sử dụng ký tự \ trước khi thêm ký tự đặc biệt. Ví dụ, \" , \' , \\





class ViDuVeLiterals { public static void main ( String [] args ) { char giaTriChar = 'g' ; char themDongMoi = '

' ; String giaTriString = "Lập trình Java" ; System . out . println (giaTriChar); System . out . println (themDongMoi); System . out . println (giaTriString); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







g



Lập trình Java







Ok, đến đây bạn đã biết về một số kiểu dữ liệu trong Java.





Bây giờ, chúng ta sẽ tiếp tìm hiểu về toán tử và hiểu sâu hơn về các kiểu dữ liệu





Chương I. Phần 4. Toán tử trong Java



Trong phần hướng dẫn tự học Java này, bạn sẽ tìm hiểu các kiểu toán tử khác nhau trong ngôn ngữ Java.





Và tìm hiểu cách các toán tử chúng hoạt động thông qua các ví dụ.





Toán tử là gì?





Toán tử là biểu tượng đặc biệt (ký tự đặc biệt) thực hiện các hoạt động trên toán hạng (biến và giá trị).





Ví dụ, toán tử + sẽ thực hiện cộng các toán hạng.





Trong phần 3 bạn đã được học cách khai báo biến và gán giá trị cho biến. Bây giờ, bạn sẽ học tiếp cách sử dụng toán tử để thao tác với các biến.





Chương I. Phần 4.1. Toán tử gán trong Java.







Video tự học Java 09: Toán tử gán trong Java



Toán tử gán trong Java được sử dụng để gán giá trị cho biến. Ví dụ:







int tuoi ; tuoi = 18 ;





Hành động này có nghĩa là, giá trị ở phía bên phải được gán cho biến nằm ở phía bên trái. Bạn không thể làm ngược lại.





Còn nhiều thứ về toán tử gán.





Tuy nhiên, để thật đơn giản, chúng ta sẽ tìm hiểu đến chúng sau.





Ví dụ về toán tử gán:







class ViDuToanTuGan { public static void main ( String [] args ) { int so1 , so2 ; // Gán 6 cho so1 so1 = 6 ; System . out . println (so1); // Gán giá trị của so1 cho so2 so2 = so1; System . out . println (so2); } }







Khi bạn chạy chương trình. Kết quả nhận được là:







6

6





Chương I. Phần 4.2. Toán tử toán học trong Java



Toán tử toán học được sử dụng để tính toán như: Cộng, Trừ, Nhân, Chia





+ Cộng (Hoặc nối chuỗi)

- Trừ

* Nhân

/ Chia

% Lấy phần dư





Ví dụ về toán tử toán học:







class ViDuToanTuToanHoc { public static void main ( String [] args ) { double so1 = 12.5 , so2 = 3.5 , ketQua; // Cộng hai số ketQua = so1 + so2; System . out . println ( "so1 + so2 = " + ketQua); // Trừ hai số ketQua = so1 - so2; System . out . println ( "so1 - so2 = " + ketQua); // Nhân hai số ketQua = so1 * so2; System . out . println ( "so1 * so2 = " + ketQua);

// Chia hai số ketQua = so1 / so2; System . out . println ( "so1 / so2 = " + ketQua); // lấy phần dư của so1 chia so2 ketQua = so1 % so2; System . out . println ( "so1 % so2 = " + ketQua); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







so1 + so2 = 16.0 so1 - so2 = 9.0

so1 * so2 = 43.75

so1 / so2 = 3.5714285714285716

so1 % so2 = 2.0







Trong ví dụ trên tất cả toán hạng được sử dụng biến.





Tuy nhiên, nó không bắt buộc. Bạn hoàn toàn có thể thực hiện giữa biến và số ...





Ví dụ:







ketQua = so1 + 5.2 ; ketQua = 2.3 + 4.5 ; so2 = so1 - 2.9 ;





Ngoài ra, bạn cũng có thể sử dụng toán tử + để nối 2 hoặc nhiều chuỗi với nhau.





Ví dụ nối chuỗi bằng toán tử cộng:







class NoiChuoiVoiToanTuCong { public static void main ( String [] args ) { String chuoi1 , chuoi2 , chuoi3 , ketQua ; chuoi1 = "Bài viết: " ; chuoi2 = "Tự học lập trình Java. " ; chuoi3 = "One for All" ; ketQua = chuoi1 + chuoi2 + chuoi3; System . out . println (ketQua); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







Bài viết: Tự học lập trình Java. One for All





Chương I. Phần 4.3. Toán tử đơn phương







Video Tự học Java 12: Toán tử đơn phương trong Java



Toán tử đơn phương trong Java thực hiện hoạt động chỉ với một toán hạng.





+ Biểu diễn số dương (không cần thiết)



- Đảo chiều thành số âm



++ Tăng lên 1 giá trị



-- Giảm đi 1 giá trị



! Đảo ngược giá trị logic





Ví dụ về toán tử đơn phương:







class ViDuToanTuDonPhuong { public static void main ( String [] args ) { double so = 5.2 , ketQua; boolean giaTriSai = false ; System . out . println ( "Kết quả: +so = " + +so); // Kết quả: +so = 5.2 System . out . println ( "Kết quả: -so = " + -so); // Kết quả: -so = -5.2 // ++so tương đương với so = so + 1 System . out . println ( "Kết quả: so++ = " + ++so); // Kết quả: so++ = 6.2

// --so tương đương với so = so - 1 System . out . println ( "Kết quả: --so = " + --so); // Kết quả: --so = 5.2

System . out . println ( "Ket qua: !giaTriSai = " + !giaTriSai); // Ket qua: !giaTriSai = true } }





Bạn cũng có thể sử dụng toán tử tăng ++ và giảm -- như là tiền tố hoặc hậu tố.





Ví dụ:







int a = 5 ; ++a // a = 6 a++ // a = 7 --a // a = 6 a-- // a = 5





Đến bây giờ, có thể bạn vẫn dễ hiểu bởi vì mọi thứ đang rất đơn giản.





Tuy nhiên, có một sự khác biệt giữa việc đặt toán tử tăng, giảm làm tiền tố hoặc hậu tố.





Ví dụ:







class ViDuToanTuDonPhuong2 { public static void main ( String [] args ) { int a = 5 ;

System . out . println (a++); System . out . println (a);

System . out . println (++a); System . out . println (a); } }





Khi bạn chạy chương trình. Kết quả nhận được là:







5 6 7 7





Các toán tử tăng giảm được đặt làm hậu tố như a++ sẽ được câu lệnh đánh giá giá trị trước sau đó mới tăng và lưu giá trị vào biến.





Chính vì thế, câu lệnh System.out.println(a++); cho ra kết quả 5 .





Và câu lệnh sau đó, Sytem.out.println(a); cho ra kết quả 6 .





Toán tử tăng giảm được đặt làm tiền tố có hành vi ngược lại.





Khi máy đọc câu lệnh, nó sẽ đọc từ trái sang phải.





Nó sẽ thấy và thực thi toán tử ++ , lưu giá trị mới vào biến a trước. Sau đó câu mới đánh giá giá trị a .





Chương I. Phần 4.5. Toán tử bằng và các toán tử quan hệ







Video tự học Java 13: Toán tử quan hệ trong Java



Toán tử bằng và toán tử quan hệ xác định mối quan hệ giữa hai toán hạng.





Nó sẽ kiểm tra nếu một toán hạng lớn hơn, nhỏ hơn, bằng nhau, không bằng nhau...





Tùy thuộc vào các mối quan hệ, nó sẽ cho kết quả hoặc là true hoặc false .





== toán tử so sánh sự bằng nhau



!= toán tử so sánh sự không bằng nhau



> toán tử so sánh lớn hơn



< toán tử so sánh nhỏ hơn



>= toán tử so sánh lớn hơn hoặc bằng



<= toán tử so sánh nhỏ hơn hoặc bằng





Cũng đơn giản như so sánh trong toán học thôi đúng không?





Chỉ khác một điều là toán tử so sánh bằng trong lập trình là ==





Bởi vì toán tử = đã được sử dụng để làm toán tử gán, nên để so sánh sự bằng nhau chúng ta sử dụng ==





Ví dụ sử dụng toán tử quan hệ:







class ViDuToanTuQuanHe { public static void main ( String [] args ) { int so1 = 5 , so2 = 6 ;

if (so1 > so2){ System . out . println ( "Số 1 lớn hơn Số 2." ); } else { System . out . println ( "Số 2 lớn hơn hoặc bằng Số 1" ); } } }





Khi bạn chạy chương trình. Kết quả nhận được là:







Số 2 lớn hơn hoặc bằng Số 1





Trong ví dụ trên, bởi vì if (so1 > so2) đúng khi và chỉ khi so1 lớn hơn so2 .





Nếu so2 lớn hơn hoặc bằng so1 thì điều kiện trên sẽ bị đánh giá là false .





Do đó, chương trình đã thực thi câu lệnh trong khối else .





Nếu bạn chưa hiểu chương trình trên thì cũng không sao. Chúng ta sẽ cùng tìm hiểu kỹ hơn trong phần if...else .





Còn bây giờ bạn chỉ cần hiểu là việc sử dụng toán tử quan hệ là để mong muốn kiểm tra xem biểu thức kiểm tra đó trả về giá trị true hay false .





Dựa vào kết quả trả về, chúng ta sẽ thực hiện các bước tiếp theo.





Ngoài các toán tử quan hệ, còn có một toán tử instanceof được sử dụng để so sánh kiểu của một đối tượng với một kiểu xác định.





# Sử dụng toán tử instanceof để so sánh kiểu đối tượng



Như đã nói ở trên, toán tử instanceof được sử dụng để so sánh kiểu của một đối tượng với một kiểu xác định nào đó.





Ví dụ:







class ViDuInstanceof { public static void main ( String [] args ) { String test = "abcxyz" ; boolean result ; result = test instanceof String; System . out . println (result); } }





Khi chúng ta chạy chương trình. Chúng ta nhận được kết quả là true .





Bởi vì biến test là kiểu String .





Lưu ý!



Bạn sẽ tìm hiểu thêm về cách toán tử instanceof hoạt động khi bạn đã được học về Class và Object trong Java.



Chương I. Phần 4.6 Toán tử Logic







Video tự học Java 14: Toán tử Logic trong Java



Chúng ta có hai toán tử logic trong Java đó là, || và &&





Chúng được sử dụng trong biểu thức điều kiện boolean. Đây là cách chúng làm việc:





|| (toán tử OR ): Trả về giá trị true nếu ít nhất một điều kiện là true

&& ( toán tử AND): Trả về giá trị true nếu tất cả điều kiện true



Ví dụ về toán tử logic:







class ViDuToanTuLogic { public static void main ( String [] args ) { int so1 = 1 , so2 = 2 , so3 = 9 ; boolean ketQua ; // Ít nhất một biểu thức đúng để trả về giá trị true ketQua = (so1 > so2) || (so3 > so1); // Kết quả sẽ là true. Bởi vì so3 > so1 System . out . println (ketQua); // Tất cả biểu thức phải đúng để trả về giá trị true ketQua = (so1 > so2) && (so3 > so1); // Kết quả nhận được là false vì biểu thức so1 > so2 bị sai System . out . println (ketQua); } }





Khi chúng ta chạy chương trình, kết quả nhận được là:







true false







Chú ý!



Toán tử logic thường xuyên được sử dụng trong vòng lặp.

Chương I. Phần 4.7. Toán tử Ternary







Video tự học Java 15: Toán tử Ternary trong Java



Toán tử Ternary (hay còn gọi là toán tử 3 ngôi) ? : là cách viết tắt của câu lệnh if ... else .





Cú pháp của toán tử Ternary là:







bienKetQua = BieuTHucDieuKien ? bieuThuc1 : bieuThuc2



Đây là cách toán tử ternary làm việc:





Nếu BieuThucDieuKien là true thì thực hiện bieuThuc1 Ngược lại thì thực hiện bieuThuc2 Sau đó giá trị trả về gán vào bienKetQua



Ví dụ về toán tử Ternary:







class ViDuToanTuTernary { public static void main ( String [] args ) { int tuoi = 18 ; String ketQua ; ketQua = (tuoi >= 18 ) ? "Được xem phim 18+" : "Chưa được xem phim 18+" ; System . out . println (ketQua); } }





Khi chúng ta chạy chương trình. Kết quả nhận được là:







Được xem phim 18+







Còn khá nhiều toán tử khác. Tuy nhiên, bạn cũng chưa cần biết sâu lắm như toán tử Bitwise và toán tử Bit shift. (Thế nên bài này mình sẽ không nói tới)





Và một số toán tử toán học sẽ được giải thích khi chúng ta sử dụng đến chúng.





Còn bây giờ, bạn chỉ cần hiểu được những toán tử mình vừa giới thiệu ở trên là được thôi.





Chương I. Phần 5. Java Output và Input







Video tự học Java 16: Nhập / Xuất dữ liệu trong Java



Trong phần này bạn sẽ được học về cách hiển thị dữ liệu đầu ra (output) và lấy dữ liệu từ người dùng (input)





Chương I. Phần 5.1. Java Output



Bạn có thể hiện thị dữ liệu đầu ra với:





System.out.println()

System.out.print()

System.out.print()



Ví dụ:







class ViDuOutput1 { public static void main ( String [] args ) { System . out . println ( "Tự học Lập trình Java (One for All)." ); } }





Kết quả:







Tự học Lập trình Java (One for All)







Vậy,



# Sự khác biệt giữa println(), print() và printf() là gì?



print() là in chuỗi trong dấu nháy println() tương tự như print() nhưng sau đó con trỏ sẽ bắt đầu ở dòng mới printf() in chuỗi định dạng theo chuẩn đầu ra



Ví dụ về print() và println():







class ViDuOutput2 { public static void main ( String [] args ) { System . out . println ( "1. println " ); System . out . println ( "2. println " ); System . out . print ( "1. print " ); System . out . print ( "2. print" ); } }





Khi chạy chương trình, chúng ta nhận được kết quả:







1. println

2. println

1. print 2. print







> Bạn có thể đọc bài viết này để hiểu thêm về printf() trong Java.





Chúng ta hãy xem ví dụ khác: Chúng ta hãy xem ví dụ khác:







class ViDuOutput3 { public static void main ( String [] args ) { Double soAm = - 6.9 ; System . out . println ( 5 ); System . out . println (soAm); } }





Khi chạy chương trình, chúng ta nhận được kết quả:









5

-6.9





Như bạn thấy ở trên, chúng ta không sử dụng dấu nháy.





Ví dụ sử dụng toán tử + trong khi sử dụng println():







class ViDuOutput4 { public static void main ( String [] args ) { Double soAm = - 6.9 ; System . out . println ( "Tự học " + "Lập trình Java." ); System . out . println ( "Số = " + soAm); } }





Khi chạy chương trình, chúng ta nhận được kết quả:







Tự học Lập trình Java.

Số = -6.9







Bạn hãy nhìn vào dòng System.out.println("Tự học " + "Lập trình Java.");







Hai chuỗi này đã nối lại với nhau do chúng ta sử dụng toán tử +





Và dòng System.out.println("Số = " + soAm);





Ở đây vì soAm không được đặt trong dấu nháy nên nó được đánh giá như một biến.





Sau đó, giá trị double được trình biên dịch chuyển thành String .





Cuối cùng nó được nối vào chuỗi "Số = " và in tất cả ra màn hình.





Chương I. Phần 5.2. Java input



Có một số cách để có được đầu vào (input) từ người dùng trong Java.





Trong bài này, bạn sẽ học cách lấy đầu vào bằng cách sử dụng đối tượng Scanner .





Để làm điều đó, bạn cần import class Scanner bằng cách sử dụng cú pháp:







import java.util.Scanner;





Sau đó, chúng ta sẽ tạo một đối tượng của lớp Scanner sẽ được sử dụng để nhận đầu vào từ người dùng.







Scanner input = new Scanner ( System . in ); int soInput = input . nextInt ();





Ví dụ lấy input từ người dùng:







import java.util.Scanner;

class ViDuInput1 { public static void main ( String [] args ) {

// Tạo đối tượng input Scanner input = new Scanner ( System . in );

// Xuất ra thông báo cho người dùng nhập dữ liệu System . out . print ( "Nhập vào một số nguyên: " );

// Lấy dữ liệu người dùng vừa nhập // Gán vào biến soNguyen int soNguyen = input . nextInt ();

// In dữ liệu vừa lấy được ra màn hình System . out . println ( "Số bạn vừa nhập là: " + soNguyen); } }





Khi chạy chương trình, output sẽ tương tự thế này:







Nhập vào một số nguyên: 6996

Số bạn vừa nhập là: 6996





Ở đây,





Sau khi đối tượng input của class Scanner được tạo. Phương thức nextInt() của class Scanner sẽ lấy dữ liệu do người dùng nhập vào.





Để lấy các giá trị long , float , double và String thì bạn cần sử dụng các phương thức tương ứng như: nextLong() , nextFloat() , nextDouble() và next()







Ví dụ lấy dữ liệu kiểu float, double và String từ người dùng:







class ViDuInput2 { public static void main ( String [] args ) { Scanner input = new Scanner ( System . in ); // Lấy số float từ người dùng System . out . print ( "Nhập số Float: " ); float soFloat = input . nextFloat (); System . out . println ( "Số Float bạn vừa nhập là: " + soFloat); // Lấy số double từ người dùng System . out . print ( "Nhập số double: " ); double soDouble = input . nextDouble (); System . out . println ( "Số Double bạn vừa nhập là: " + soDouble); // Lấy chuỗi từ người dùng System . out . print ( "Nhập vào một chuỗi: " ); String chuoiString = input . next (); System . out . println ( "Chuỗi bạn vừa nhập là: " + chuoiString); } }





Khi chạy chương trình, output sẽ tương tự thế này:







Nhập số Float: 6.9

Số Float bạn vừa nhập là: 6.9

Nhập số Double: -9.6

Số Double bạn vừa nhập là: -9.6

Nhập vào một chuỗi: Tôi tự học Lập trình Java

Chuỗi bạn vừa nhập là: Tôi tự học Lập trình Java



Stack Overflow Như đã nói, có nhiều cách để lấy dữ liệu từ người dùng. Bạn có thể tham khảo thêm tại thảo luận trên





Chương I. Phần 6. Biểu thức, Câu lệnh và Khối trong Java



Trong bài viết này, bạn sẽ tìm hiểu về Expression (Biểu thức), Statement (Câu lệnh) và Block (Khối) trong Java.





Chúng ta đã sử dụng chúng qua các ví dụ mà không cần hiểu gì quá nhiều.





Phần này chỉ giúp bạn nhận biết rõ hơn về chúng.





Chương I. Phần 6.1. Biểu thức trong Java



Biểu thức bao gồm các biến, toán tử, listerals và các cuộc gọi phương thức được ước tính thành một giá trị duy nhất.





Hãy làm một ví dụ:







int diemThi ; diemThi = 9 ;





Ở đây, diemThi = 9; là một biểu thức trả về giá trị kiểu int







Double a = 6.9 , b = 9.6 , ketQua; ketQua = a + b - 6.5 ;







Ở đây, ketQua = a + b - 6.5; là biểu thức.







if (so1 == so2) System . out . println ( "Số 1 bằng Số 2" );







Ở đây, so1 == so2 là biểu thức trả về giá trị Boolean .





Còn "Số 1 bằng Số 2" là một biểu thức trả về String .



Chương I. Phần 6.2. Câu lệnh trong Java



Câu lệnh trong Java là tất cả mọi thứ tạo nên một đơn vị hoàn chỉnh.





Ví dụ:







int diemSo = 6 * 9 ;







Ở đây, 6*9 là một biểu thức trả về giá trị 54 và int diemSo = 6*9; là một câu lệnh.





Biểu thức làm một phần của câu lệnh.





Một vài biểu thức có thể biến thành câu lệnh với việc kết thúc bằng dấu ;





Nó gọi là câu lệnh biểu thức.





Ví dụ:







diemSo = 10 ;





# Câu lệnh khai báo



Câu lệnh khai báo được sử dụng để khai báo biến.







Double thueVat = 0.1 ;







Ở đây, câu lệnh này khai báo biến thueVat và khởi tạo cho nó giá trị là 0.1







Ngoài ra, chúng ta còn có các câu lệnh điều khiển, phần này các bạn sẽ được học trong phần sau.



Chương I. Phần 6.3. Khối trong Java



Một khối trong Java (Java Block) là một nhóm các câu lệnh được bao bọc bởi cặp dấu ngoặc nhọn { }





Ví dụ:







class ViDuKhoi { public static void main ( String [] args ) { String ngoNguLapTrinh = "Java" ; if (thuongHieu == "Java" ) { // Bắt đầu block System . out . print ( "Học " ); System . out . print ( "Java ngay!" ); } // Kết thúc block } }





Ở đây, chúng ta có 2 câu lệnh System.out.print("Học "); và System.out.print("Java ngay!"); nằm bên trong một khối.





Lưu ý!



Một khối cũng có thể không có câu lệnh nào.



Đến đây, bạn đã cơ bản làm quen bước đầu với ngôn ngữ lập trình Java.





Phần tiếp theo, chúng ta sẽ đi sâu hơn về một phần rất quan trọng trong lập trình, không chỉ riêng ngôn ngữ Java.





CHƯƠNG II: HỌC LẬP TRÌNH CẤU TRÚC ĐIỀU KHIỂN TRONG JAVA



Trong phần này, bạn sẽ được học về các cấu trúc điều khiển trong lập trình Java như:







Cấu trúc if...else

Câu lệnh switch

Vòng lặp for

Vòng lặp for...each

Vòng lặp while

Câu lệnh break

Câu lệnh continue



Chúng ta sẽ đi ngay vào phần đầu tiên.





Chương II. Phần 1: Cấu trúc if...else trong Java







Video tự học Java 17: Cấu trúc IF ELSE trong Java



Trong phần hướng dẫn tự học lập trình Java này, bạn sẽ học sử dụng hai câu lệnh if và if...else để kiểm soát dòng chảy của chương trình.





Trong lập trình, chúng ta thường chỉ muốn thực thi một phần code nào đó nếu điều kiện kiểm tra là đúng hoặc sai (true hay false).





Nhưng trường hợp như thế này chúng ta sẽ cần cấu trúc điều khiển.



Chương II. Phần 1.1. Câu lệnh if



Cú pháp của câu lệnh if trong Java là:





if (BieuThucDieuKien) { // Các câu lệnh ... }



Trong đó:





BieuThucDieuKien : Là biểu thức logic sẽ trả về giá trị true hoặc false Nếu BieuThucDieuKien trả về giá trị là true thì các câu lệnh bên trong khối được thực thi. Nếu BieuThucDieuKien trả về giá trị là false thì chương trình sẽ bỏ qua các câu lệnh trong khối.







Lưu đồ thuật toán if trong Java



Ví dụ về câu lệnh if trong Java:







class ViDuCauLenhIf { public static void main ( String [] args ) {

int so = 10 ;

if (so > 0 ) { System . out . println ( "Số Dương" ); } System . out . println ( "Câu lệnh này luôn được thực thi." ); } }





Khi chạy chương trình, bạn nhận được kết quả là:







Số Dương Câu lệnh này luôn được thực thi.





Như bạn thấy trong ví dụ trên:





so được gán bằng 10 nên lớn hơn 0. Do đó biểu thức so > 0 trả về giá trị true Vậy nên, code bên trong khối if được thực thi.



Bây giờ, hãy thử đổi giá trị so thành số âm ( -10 ) và chạy lại chương trình xem sao.





Kết quả trong trường hợp này sẽ là:







Câu lệnh này luôn được thực thi.





Đúng như bạn nghĩ,





Khi so = -10 thì nhỏ hơn 0. Do đó, biểu thức so > 0 trả về giá trị false . Máy tính sẽ bỏ qua các câu lệnh bên trong khối if. Câu lệnh System.out.println("Câu lệnh này luôn được thực thi."); không nằm trong khối if nên vẫn được thực thi bình thường



Chương II. Phần 1.2. Câu lệnh if...else trong Java



Câu lệnh if chỉ định máy tính thực thi các câu lệnh bên trong nó nếu điều kiện là true .





Tuy nhiên, câu lệnh if cũng có thể có khối else .





Các câu lệnh trong khối else sẽ được thực thi khi điều kiện được đánh giá là false .





Cú pháp câu lệnh if...else trong Java:







if (bieuThucDieuKien) { // Code thực thi khi biểu thức biểu thức điều kiện đúng } else { // Code thực thi khi biểu thức biểu thức điều kiện sai }









Lưu đồ thuật toán if...else trong Java



Ví dụ sử dụng câu lệnh if...else trong Java:







class ViDuCauLenhIfElse { public static void main ( String [] args ) { int so = 10 ; if (so > 0 ) { System . out . println ( "Số Dương." ); } else { System . out . println ( "Số Âm." ); }

System . out . println ( "Câu lệnh này luôn được thực thi." ); } }





Khi chạy chương trình, kết quả nhận được là:







Số Dương Câu lệnh này luôn được thực thi.





Chương trình được thực thi tương tự như ví dụ trên.





Bây giờ, hãy đổi lại giá trị của so thành -10 và chạy lại chương trình.





Kết quả nhận được là:







Số Âm Câu lệnh này luôn được thực thi.





Chương II. Phần 1.3. Câu lệnh if...else...if trong Java











Video tự học Java 18: Cấu trúc IF ELSE IF trong Java



Trong Java, nếu bạn muốn đánh giá điều kiện và chỉ thực thi một block code trong số nhiều block.





Trong trường hợp này bạn có thể sử dụng câu lệnh if else if.





Cú pháp câu lệnh if....else...if trong Java:







if (BieuThucDieuKien1) { // codes } else if (BieuThucDieuKien2) { // codes } else if (BieuThucDieuKien3) { // codes } . . else { // codes }





Câu lệnh if được đánh giá từ trên xuống dưới.





Nếu biểu thức điều kiện nào là true , máy tính thực thi code bên trong khối đó. Sau đó nó thoát ra khỏi cấu trúc if else if.





Nếu tất cả biểu thức điều kiện là false , code bên trong khối else sẽ được thực thi.





Ví dụ sử dụng câu lệnh if...else...if trong Java:







class ViDuIfElseIf { public static void main ( String [] args ) { int so = 0 ; if (so > 0 ) { System . out . println ( "Số Dương." ); } else if (so < 0 ) { System . out . println ( "Số Âm." ); } else { System . out . println ( "Số 0." ); } } }





Khi chạy chương trình, kết quả nhận được là:







Số 0.





Chương II. Phần 1.4. Câu lệnh if else lồng nhau trong Java









Video tự học Java 19: Cấu trúc NESTED IF trong Java



Trong Java, bạn hoàn toàn có thể đặc câu lệnh if...else bên trong câu lệnh if...else khác.



> LƯU Ý: Code trong Video sẽ không giống hoàn toàn trong bài viết bởi mình mong muốn bạn xem video thì học được logic. Sau đó đọc ví dụ trong bài viết để kiểm chứng kiến thức vừa học. Nếu hiểu -> Đó là một thành công.



Nó được gọi là câu lệnh if...else lồng nhau (Hay là NESTED IF)





Ví dụ câu lệnh if else if lồng nhau để tìm số lớn nhất trong 3 số nguyên cho trước:







class ViDuIfElseLongNhau { public static void main ( String [] args ) {

int a = 1 , b = 5 , c = 8 , max;

if (a >= b) { if (a >= c) { max = a; } else { max = c; } } else { if (b >= c) { max = b; } else { max = c; } }

System . out . println ( "Số lớn nhất là: " + max); } }





Khi chạy chương trình, kết quả nhận được là:







Số lớn nhất là: 8





Chương II. Phần 2: Câu lệnh switch trong Java







Video tự học Java 20: Cấu trúc SWITCH CASE trong Java



Trong phần này, bạn sẽ được học cách sử dụng câu lệnh switch trong Java. (Hay còn gọi là Cấu trúc Switch Case)





Câu lệnh switch có thể được sử dụng để thay thế cho câu lệnh if...else...if để đạt được tính dễ đọc hơn.





Cú pháp câu lệnh switch trong Java:







switch (bien / BieuThucDieuKien) { case value1 : // statements break ; case value2 : // statements break ; .. .. ... .. .. ... default: // statements }





Câu lệnh switch đánh giá biểu thức (chủ yếu được sử dụng cho biến) và so sánh với giá trị của mỗi case .





Điểm khác của switch so với câu lệnh if...else...if là:





Câu lệnh switch sẽ thực hiện tất cả các câu lệnh nếu bất kỳ case nào được khớp. Còn câu lệnh if...else...if sẽ thoát hoàn toàn sau khi thực hiện câu lệnh với biểu thức được khớp.



Do đó, nếu đã có một case được khớp, chương trình đã thực thi tất cả câu lệnh bên trong khối đó xong.





Bạn muốn thoát hoàn toàn khỏi câu lệnh switch cũng như không cần đánh giá các case tiếp theo, chúng ta sẽ sử dụng câu lệnh break .





Ngoài ra, khối default sẽ được thực thi nếu không có case nào được khớp.









Lưu đồ thuật toán câu lệnh switch trong Java



Và nên nhớ, câu lệnh switch chỉ hoạt động với:



Dữ liệu nguyên thủy: byte , short , char và int Java Enums String class và Character , Byte , Short và Integer



Ví dụ sử dụng câu lệnh switch trong Java:







class ViDuCauLenhSwitch { public static void main ( String [] args ) { int soChoNgoi = 4 ; String loaiXe ; switch (soChoNgoi) { case 2 : loaiXe = "Xe Thể thao" ; break ; case 4 : loaiXe = "Sedan" ; break ; case 7 : loaiXe = "SUV" ; break ; default: loaiXe = "Xe khác" ; break ; } System . out . println (loaiXe); } }





Khi chạy chương trình, kết quả nhận được là:







Sedan





Một ví dụ khác về cách sử dụng câu lệnh switch trong Java:





Chúng ta sẽ sử dụng switch để thực hiện Cộng + , trừ - , Nhân * , Chia / hai số cho nhau. Hai số này này lấy từ người dùng.





Và, người dùng có thể quyết định lựa chọn phép tính nào.





Lưu ý!



Bạn sẽ cần đến kiến thức trong phần Java input đã học ở trên.







import java.util.Scanner;

class MayTinhDonGian { public static void main ( String [] args ) {

char phepTinh ; Double so1 , so2 , ketQua ; Scanner scanner = new Scanner ( System . in ); System . out . print ( "Chọn phép tính (+, -, * hoặc /): " ); operator = scanner . next (). charAt ( 0 ); System . out . print ( "Nhập Số 1 và Số 2: " ); so1 = scanner . nextDouble (); so2 = scanner . nextDouble (); switch (phepTinh) { case '+' : ketQua = so1 + so2; System . out . print (so1 + " + " + so2 + " = " + ketQua); break ;

case '-' : ketQua = so1 - so2; System . out . print (so1 + " - " + so2 + " = " + ketQua); break ;

case '*' : ketQua = so1 * so2; System . out . print (so1 + " * " + so2 + " = " + ketQua); break ;

case '/' : ketQua = so1 / so2; System . out . print (so1 + " / " + so2 + " = " + ketQua); break ;

default: System . out . println ( "Phép tính không hợp lệ" ); break ; } } }





Khi bạn chạy chương trình, out sẽ tương tự như thế này:







Chọn phép tính (+, -, * hoặc /): *

Nhập Số 1 và Số 2: 6

9

6 * 9 = 54





Chương II. Phần 3: Vòng lặp for trong Java



Vòng lặp được sử dụng trong lập trình để lặp lại một hành động (khối code) cụ thể.





Trong phần hướng dẫn tự học Java này, bạn sẽ tìm hiểu để tạo ra một vòng lặp trong lập trình.





Chương II. Phần 3.1. Vòng lặp for là gì?



Vòng lặp for là một vòng lặp đơn giản, thường xuyên được sử dụng trong lập trình Java.





Vòng lặp for thực hiện một khối code cho đến khi điều kiện đánh giá thành false.





Cú pháp của vòng lặp for trong Java:







for (KhoiTaoBienDem; BieuThucDieuKien; CapNhatBienDem){ // Code thực thi hành động nào đó }





Để hiểu vòng lặp for trong Java hoạt động như thế nào, chúng ta hãy xem lưu đồ thuật toán sau:









Lưu đồ thuật toán vòng lặp for trong Java



Ví dụ về vòng lặp for trong Java:







// Chương trình in ra số từ 1 đến 5

class ViDuVongLapFor { public static void main ( String [] args ) { for ( int i = 1 ; i <= 5 ; ++i) { System . out . println ( "Số " + i); } } }





Khi chạy chương trình, chúng ta nhận được kết quả:







Số 1

Số 2

Số 3

Số 4

Số 5





Giải thích chương trình vòng lặp for:





Chúng ta khởi tạo giá trị i = 1

Thực hiện đánh giá biểu thức i <= 5 . Nếu true thì thực hiện câu lệnh println() bên trong.

Sau đó, update điều kiện, thực thi ++i .

Bây giờ, i có giá trị là 2 , i vẫn nhỏ hơn hoặc bằng 5 .

Tiếp tục thực hiện câu lệnh println()

...

Khi i tăng lên thành 6 . Biểu thức i <= 5 trả về giá trị false thì thoát khỏi vòng lặp.

Chúng ta sẽ tiếp tục thực hiện một vòng lặp nữa để hiểu sâu hơn về vòng lặp for trong Java:







// Chương trình cộng các số từ 1 đến 100

class ViDuVongLapFor2 { public static void main ( String [] args ) { int tong = 0 ; for ( int i = 1 ; i <= 100 ; ++i) { tong += i; // sum = sum + i } System . out . println ( "Tổng = " + tong); } }





Khi chạy chương trình, chúng ta nhận được kết quả:







Tổng = 5050





Ở đây:





Biến tong được khởi tạo giá trị 0 Sau đó trong vòng lặp for . Khởi tạo biến đếm i = 0 . Kiểm tra biểu thức i <= 100 . Nếu true , thì thực hiện cộng i vào biến tong . Tiếp tục, tăng giá trị i thêm 1 . Tiếp tục đánh giá biểu thức i <= 100 ... Khi i lớn hơn 100 . Thoát khỏi vòng lặp và in giá trị của tong ra màn hình

# Vòng lặp for vô cực

Nếu biểu thức kiểm tra không bao giờ false, vòng lặp for sẽ chạy mãi mãi. Đây gọi là vòng lặp Vô cực (vô hạn, vĩnh cửu) (Nghe 'Vô cực" ngầu hơn nhỉ =)) )





Hãy cùng làm thử một ví dụ:







// Vòng lặp vô cực

class ViDuVongLapForVoCuc { public static void main ( String [] args ) { for ( int i = 1 ; i <= 10 ; --i) { System . out . println ( "Tự học JAVA Không phải JAV" ); } } }





Khi chúng ta đặt biểu thức kiểm tra là i <= 10 , nhưng khi update điều kiện thì chúng ta lại đặt là --i .





Điều này khiến i <= 10 luôn luôn đúng ( true ).





Dẫn tới vòng lặp for này chạy không bao giờ nghỉ.





Lưu ý!



Biểu thức khởi tạo, biểu thức kiểm tra, biểu thức update đều là tùy chọn, có thể có hoặc không.



Vì thế, đây cũng là một vòng lặp vô cực.







for ( ; ; ) {

}





Ok, vậy là bạn đã hiểu về vòng lặp for trong Java.





Bây giờ, hãy cùng tìm hiểu về vòng lặp for - each trong Java.





Chương II. Phần 4: Vòng lặp for each trong Java



Vòng lặp for each trong Java là vòng lặp chuyên được sử dụng để lặp qua các mảng, tập hợp.





Vòng lặp for each còn được gọi là Vòng lặp for tăng cường.





Đây là một ví dụ để lặp qua các phần tử của một mảng bằng cách sử dụng vòng lặp for tiêu chuẩn:







class ViDuVongLapForTieuChuan { public static void main ( String [] args ) { char [] mangKyTu = { 't' , 'u' , 'h' , 'o' , 'c' }; for ( int i = 0 ; i < mangKyTu . length ; ++ i) { System . out . println (mangKyTu[i]); } } }





Và, thay vì sử dụng vòng lặp for tiêu chuẩn.





Java cung cấp một vòng lặp for each để chuyên làm những việc tương tự như thế này.







class ViDuVongLapForEach { public static void main ( String [] args ) {

char [] mangKyTu = { 't' , 'u' , 'h' , 'o' , 'c' }; // Vòng lặp for each for ( char kytu : mangKyTu) { System . out . println (kytu); } } }





Khi chạy cả hai vòng lặp này, chúng ta được một kết quả tương tự:







t

u

h

o

c





Việc sử dụng vòng lặp for each dễ viết hơn và làm cho code của bạn dễ đọc hơn.





Do đó, người ta khuyến nghị sử dụng vòng lặp for each hơn vòng lặp for tiêu chuẩn (bất cứ khi nào có thể)





Chương II. Phần 4.1. Cú pháp vòng lặp for each trong Java



Ở trên chúng ta đã thử làm ví dụ bằng vòng lặp for each. Bây giờ, hãy phân tích cú pháp của vòng lặp for each xem nào:







for (data_type item: collection){

}





Trong đó:





data_type là kiểu dữ liệu của item item là tên đại diện cho từng phần tử trong collection (bạn có thể đặt tùy ý) collection là tập hợp hoặc tên của mảng bạn đang muốn lặp qua nó



Chương II. Phần 4.2. Ví dụ vòng lặp for each trong Java



Để bạn hiểu hơn cách hoạt động của vòng lặp for each hãy cùng thực hiện thêm các ví dụ.





Đây là một chương trình tính tổng của các phần tử trong mảng.







class TinhTongPhanTuTrongMang { public static void main ( String [] args ) {

int [] mangSoNguyen = { 2 , 0 , 2 , 0, 0 , 3 }; int tong = 0 ;

for ( int soNguyen : mangSoNguyen) { tong += soNguyen; }

System . out . println ( "Tổng = " + tong); } }





Khi chạy chương trình, kết quả nhận được là:





Tổng = 7





Lưu ý!



tong += soNguyen tương đương với tong = tong + soNguyen .



Giải thích chương trình:





Lặp lần 1: tong = 0 , soNguyen = 2 . Thực hiện tong += soNguyen . Lúc này, tong = 2 . Lặp lần 2: tong = 2 , soNguyen = 0. Thực hiện tong += soNguyen . Lúc này, tong = 2 . Lặp lần 3: tong = 2 , soNguyen = 2 . Thực hiện tong += soNguyen . Lúc này, tong = 4 . Lặp lần 4: tong = 4 , soNguyen = 0 . Thực hiện tong += soNguyen . Lúc này, tong = 4 . Lặp lần 5: tong = 4 , soNguyen = 0 . Thực hiện tong += soNguyen . Lúc này, tong = 4 . Lặp lần 6: tong = 4 , soNguyen = 3 . Thực hiện tong += soNguyen . Lúc này, tong = 7 . Thoát khỏi vòng lặp. Thực hiện in giá trị tong ra màn hình.



Như vậy, bạn đã hiểu các thực hiện lặp qua mảng bằng vòng lặp for each chưa?





Chương II. Phần 5: Vòng lặp while trong Java



Vòng lặp while cũng được sử dụng lặp lại một khối code cụ thể. Trong phần này, bạn sẽ học cách tạo vòng lặp while và do ... while trong Java.





Vòng lặp while sẽ lặp lại một khối code cụ thể cho đến khi điều kiện nhất định được thỏa mãn (biểu thức kiểm tra trở thành false).





Vòng lặp while thường được sử dụng nếu bạn không biết trước số lần lặp, ví dụ:





Tiếp tục hiển thị thêm các bài viết khi người dùng còn lăn chuột trên newsfeed.

Tiếp tục đếm thời gian (đồng hồ tính giờ) khi người dùng chưa bấm dừng lại.

....

Chương II. Phần 5.1. Cú pháp vòng lặp while trong Java



Cú pháp của vòng lặp while trong Java là:







while (bieuThucDieuKien) { // Code thực thi cái gì đó }





Trong đó:



while là từ khóa bieuThucDieuKien là biểu thức điều kiện trả về giá trị boolean (true hay false)



Chương II. Phần 5.2. Vòng lặp while hoạt động thế nào?



Dưới đây là cách vòng lặp while trong Java hoạt động.





Biểu thức bieuThucDieuKien là biểu thức boolean trả về giá trị true hoặc false . Nếu bieuThucDieuKien được đánh giá là true . Code bên trong vòng lặp sẽ được thực thi một lần. Tiếp tục đánh giá bieuThucDieuKien lần nữa. Nếu bieuThucDieuKien được đánh giá là true . Code bên trong vòng lặp sẽ được thực thi một lần. ... Khi bieuThucDieuKien trả về giá trị false . Thoát khỏi vòng lặp

Xem lưu đồ thuật toán vòng lặp while để hiểu dòng chảy của vòng lặp.











Lưu đồ thuật toán vòng lặp while



Chương II. Phần 5.3. Ví dụ về vòng lặp while trong Java.



Để hiểu cách vòng lặp while hoạt động, hãy cùng xem ví dụ sau:







// Chương trình in ra số từ 1 đến 10

class ViDuVongLapWhile { public static void main ( String [] args ) {

int i = 1 ;

while (i <= 10 ) { System . out . println ( "Số: " + i); ++i; } } }





Khi chạy chương trình, kết quả bạn nhận được là:







Số: 1

Số: 2

Số: 3

Số: 4

Số: 5

Số: 6

Số: 7

Số: 8

Số: 9

Số: 10









Chú ý, câu lệnh ++i bên trong thân vòng lặp while.





Sau lần lặp thứ 10, biến i sẽ có giá trị 11 .





Khi đó, kiểm tra biểu thức điều kiện i <=10 trả về giá trị false .





Điều này dẫn tới việc chấm dứt vòng lặp while.





Chúng ta cũng có thể vận dụng vòng lặp while để xử lý bài toán cộng từ 1 đến 100 như sau:







// Chương trình cộng 1 đến 100 sử dụng vòng lặp while

class CongTu1Den100 { public static void main ( String [] args ) {

int tong = 0 , i = 100 ;

while (i != 0 ) { tong += i; // Tương đương với tong = tong + i --i; }

System . out . println ( "Tổng = " + tong); } }





Khi chạy chương trình, kết quả nhận được là:







Tổng = 5050





* Kết quả giống như sử dụng vòng lặp for đúng không?





Chương II. Phần 5.4. Vòng lặp do while trong Java



Vòng lặp do while trong Java cũng lặp lại một khối code cụ thể cho đến khi thỏa mãn điều kiện nào đó.





Vòng lặp do while hoạt động tương tự như vòng lặp while.





Tuy nhiên, điểm khác biệt là vòng lặp do while sẽ thực hiện khối code ít nhất 1 lần, cho dù điều kiện đúng hay sai.





Nghĩa là, lần lặp đầu tiên, khối code sẽ được thực thi, sau đó mới kiểm tra điều kiện.





Cú pháp vòng lặp do while trong Java là:







do { // Code thực thi cái gì đó } while (bieuThucDieuKien);





Trong đó:





do , while là từ khóa bieuThucDieuKien là biểu thức điều kiện boolean trả về giá trị true hoặc false .



Chương II. Phần 5.5. Vòng lặp do while hoạt động thế nào?



Đây là cách vòng lặp do while trong Java hoạt động:





Thực hiện khối code bên trong vòng lặp 1 lần Đánh giá biểu thức bieuThucDieuKien Nếu bieuThucDieuKien trả về giá trị true . Tiêp tục thực hiện khối code trong block do Tiếp tục đánh giá biểu thức bieuThucDieuKien . Nếu true thì thực hiện khối code trong block do ... Nếu bieuThucDieuKien trả về giá trị false . Chấm dứt vòng lặp



Xem lưu đồ thuật toán vòng lặp do while để hiểu dòng chảy của vòng lặp.











Lưu đồ thuật toán vòng lặp do while



Để hiểu sâu hơn về cách vòng lặp do while hoạt động, hãy cùng làm ví dụ sau:





Chương trình này tính tổng các số được người dùng nhập vào cho đến khi người dùng nhập vào 0.





Đẩy lấy được dữ liệu đầu vào (input) từ người dùng, hãy xem lại phần Java input ở trên.





Code chương trình:







import java . util . Scanner ;

class TinhTong { public static void main ( String [] args ) {

Double so , tong = 0.0 ; Scanner input = new Scanner ( System . in ); // Vòng lặp do while do { System . out . print ( "Nhập vào một số: " ); so = input . nextDouble (); tong += so; } while (so != 0.0 );

System . out . println ( "Tổng = " + tong); } }





Khi chạy chương trình, kết quả nhận được là:







Nhập vào một số: 2.5 Nhập vào một số: 1.0

Nhập vào một số: 2.5

Nhập vào một số: 5.0

Nhập vào một số: 0.0

Tổng = 11.0







Chương II. Phần 5.6. Vòng lặp while vô cực



Tương tự như ở trong vòng lặp for vô cực.





Vòng lặp while vô cực (vô hạn) sẽ liên tục thực hiện khối code nào đó nếu điều kiện kiểm tra luôn đúng.





Ví dụ vòng lặp while vô cực:







class VongLapWhileVoCuc { public static void main ( String [] args ) {

int i = 100 ;

// Vòng lặp while vô cực while (i == 100 ) { System . out . println ( "Tự học Lập trình Java" );

} } }





Ở đây, điều kiện i == 100 luôn đúng ( true ), thế nên câu lệnh System.ou.println()... sẽ được thực thi liên tục, không dừng lại.







Lưu ý!



Chương trình lặp vô hạn có thể làm treo máy của bạn.



Vì thế hãy cẫn thận khi lập trình.



Chương II. Phần 6. Câu lệnh break trong Java



Trong phần câu lệnh switch bạn đã nhìn thấy giải thích qua về các hoạt động của câu lệnh break.





Phần này, chúng ta sẽ tìm hiểu kỹ hơn một chút về câu lệnh break.





Câu lệnh break thường được sử dụng để chấm dứt vòng lặp ngay lập tức mà không cần đợi kiểm tra biểu thức.





Chương trình sẽ chuyển sang câu lệnh tiếp theo sau vòng lặp ngay lập tức.





Cú pháp của câu lệnh break:







break ;





Chương II. Phần 6.1. Ví dụ về cách sử dụng câu lệnh break trong Java



Để hiểu cách hoạt động của câu lệnh break trong Java, hãy cùng làm một vài ví dụ:







// Ví dụ câu lệnh break class ViDuBreak1 { public static void main ( String [] args ) {

for ( int i = 1 ; i <= 10 ; ++i) { // Chấm dứt vòng lặp nếu i bằng 5 if (i == 5 ) { break ; } System . out . println (i); } } }





Khi chạy chương trình, kết quả nhận được là:







1

2

3

4





Như bạn thấy, biểu thức kiểm tra là i <= 10 . Khi i == 5 vẫn thỏa mãn biểu thức kiểm tra của vòng lặp.





Tuy nhiên, câu lệnh break; đã chấm dứt vòng lặp tại đây.





Dẫn tới, 5, 6, 7, 8, 9, 10 không được in ra màn hình.





Hãy cùng làm một ví dụ khác để hiểu về câu lệnh break.





Chương trình lấy các số được người dùng nhập vào để tính tổng cho đến khi người dùng nhập số âm.





* Bạn nên xem lại cách lấy dữ liệu từ người dùng trong phần Java input.





Code chương trình:







import java . util . Scanner ;

class TinhTongSoDuong { public static void main ( String [] args ) {

// Khởi tạo biến Double so , tong = 0.0 ; Scanner input = new Scanner ( System . in ); // Sử dụng vòng lặp while để tính tổng while ( true ) { System . out . print ( "Nhập vào một số: " ); so = input . nextDouble (); /* Sử dụng break để chấm dứt vòng lặp khi người dùng nhập vào số âm */ if (so < 0.0 ) { break ; }

tong += so; } System . out . println ( "Tổng = " + tong); } }





Khi chạy chương trình, output sẽ tương tự như thế này:







Nhập vào một số: 1.0

Nhập vào một số: 2.5

Nhập vào một số: 1.5

Nhập vào một số: 3.5

Nhập vào một số: -1.0

Tổng = 8.5



Trong chương trình trên, biểu thức điều kiện luôn đúng.





Lẽ ra vòng lặp while sẽ lặp lại vô hạn.





Tuy nhiên, chúng ta lại thiết lập khi người dùng nhập vào số âm thì thực hiện break.





Do đó, nếu muốn dừng tính tổng, người dùng chỉ cần nhập số âm.





Sau đó, tổng các số đã nhập (trừ số âm) sẽ được in ra màn hình.





Ngoài ra, chúng ta hoàn toàn có thể đặt vòng lặp bên trong vòng lặp (Vòng lặp lồng nhau)





Và ở vòng lặp bên trong chúng ta đặt câu lệnh break;





Khi câu lệnh break được kích hoạt, nó sẽ không thoát hoàn toàn khỏi vòng lặp, mà chỉ dừng vòng lăp bên trong.





Và tiếp tục chạy vòng lặp bên ngoài, như ví dụ sau:







class VongLapLongNhau { public static void main ( String [] args ) {

for ( int i = 1 ; i <= 3 ; ++i) { System . out . println ( "Chương " + i); for ( int j = 1 ; i <= 5 ; ++j) { System . out . println ( "Phần " + j); if (j == 3 ) { System . out . println ( "Thoát vòng lặp bên trong" ); break ; } } } System . out . println ( "Kết thúc chương trình lặp" ); } }





Ở vòng lặp for bên trong, chúng ta đặt biểu thức điều kiện là j <= 5.





Khi j được tăng lên thành 3 (vẫn nhỏ hơn 5).





Tuy nhiên, khi j == 3 thì chúng ta đặt câu lệnh break và thoát khỏi vòng lặp for này.





Vòng lặp for bên ngoài tiếp tục tăng giá trị i thêm 1.





Sau đó, tiếp tục chạy lại vòng lặp for bên trong.





Do đó, kết quả bạn nhận được sẽ là như thế này:







Chương 1

Phần 1

Phần 2

Phần 3

Thoát vòng lặp for bên trong

Chương 2

Phần 1

Phần 2

Phần 3

Thoát vòng lặp for bên trong

Chương 3

Phần 1

Phần 2

Phần 3

Thoát vòng lặp for bên trong

Kết thúc chương trình lặp



Còn có một cách bạn có thể thoát khỏi vòng lặp theo chỉ định bằng cách đặt label cho vòng lặp.





Sau đó, chúng ta sẽ sử dụng break label; tương tự như ví dụ sau:







class ViDuBreakLabel { public static void main ( String [] args ) {

vongLap1 : for ( int i = 1 ; i < 5 ; i++) {

vongLap2 : for ( int j = 1 ; j < 3 ; j ++ ) { System . out . println ( "i = " + i + " và j = " +j);

if ( i == 2 ) { break vongLap1; } } } } }





Khi chạy chương trình, kết quả nhận được là:







i = 1 và j = 1

i = 1 và j = 2

i = 2 và j = 1





Như bạn thấy, khi i bằng 2 , chương trình vẫn in ra i = 2 và j = 1 .





Tuy nhiên, sau khi in, điều kiện i == 2 sẽ được đánh giá và trả lại giá trị true . Lúc này, câu lệnh break vongLap1; được kích hoạt.





Và chương trình lặp thoát hoàn toàn, không giống như chỉ thoát vòng lặp bên trong như ở ví dụ trên.





Và nếu, chúng ta thực hiện đánh giá điều kiện i == 2 trước, như thế này:







class ViDuBreakLabe2 { public static void main ( String [] args ) {

vongLap1 : for ( int i = 1 ; i < 5 ; i++) {

vongLap2 : for ( int j = 1 ; j < 3 ; j ++ ) { if ( i == 2 ) { break vongLap1; } System . out . println ( "i = " + i + " và j = " +j); } } } }





Kết quả nhận được là:







i = 1 và j = 1

i = 2 và j = 2





Ok, cho đến bây giờ, bạn đã hiểu về câu lệnh break trong Java chưa?





Chương II. Phần 7. Câu lệnh continue trong Java



Trong phần này, bạn sẽ học cách sử dụng câu lệnh continue trong Java.





Câu lệnh continue sẽ cho phép chương trình bỏ qua lần lặp hiện tại của một vòng lặp.





Khi câu lệnh continue được thực thi, trình điều khiển chương trình nhảy đến cuối vòng lặp.





Sau đó, biểu thức kiểm tra điều khiển vòng lặp được đánh giá.





Trong trường hợp của vòng lặp for, câu lệnh cập nhật được thực thi trước khi biểu thức kiểm tra được đánh giá.



Chương II. Phần 7.1. Ví dụ về cách sử dụng continue trong lập trình Java.



Để hiểu cách hoạt động của câu lệnh coutinue, chúng ta hãy cùng làm một vài ví dụ.







// Chương trình ví dụ về câu lệnh continue trong Java class ViDuContinue { public static void main ( String [] args ) {

// Lặp từ 1 đến 10 for ( int i = 1 ; i <= 10 ; ++i) { // Bỏ qua 5, 6, 7, 8 if (i > 4 && i < 9 ) { continue ; } // In ra số từ 1 đến 10 System . out . println (i); } } }







Khi chạy chương trình trên, chúng ta có được kết quả:







1

2

3

4

9

10





Khối if trong vòng lặp for có biểu thức điều kiện là i > 4 && i < 9 .





Lưu ý!



Trong vòng lặp for, trước khi đánh giá biểu thức điều kiện, chương trình đã thực hiện ++i



Do đó, khi i bằng 5 , 6 , 7 , 8 sẽ bị trình điều khiển chương trình bỏ qua.





Tiếp đó, i = 9 , chương trình sẽ tiếp tục in giá trị của i ra màn hình.





Tiếp tục, chúng ta cùng đên với một ví dụ khác về câu lệnh continue





Chương trình tính tổng tối đa 5 số được nhập vào bởi người dùng. Nếu người dùng nhập số âm hoặc số 0, nó sẽ không được cộng vào tổng.





* Nếu bạn quên cách lấy dữ liêu của người dùng thì hãy đọc lại phần Java input







import java.util.Scanner;

class TinhTongSoDuong { public static void main ( String [] args ) {

Double so , tong = 0.0 ; Scanner input = new Scanner ( System . in );

for ( int i = 1 ; i < 6 ; ++i) {

System . out . print ( "Nhập vào một số Dương: " ); so = input . nextDouble (); /* Nếu người dùng nhập vào 0 hoặc số âm thì bỏ qua */ if (so <= 0.0 ) { continue ; }

tong += so; } System . out . println ( "Tổng = " + tong); } }





Khi chạy chương trình, output sẽ tương tự như:







Nhập vào một số Dương: 1

Nhập vào một số Dương: -1

Nhập vào một số Dương: 2

Nhập vào một số Dương: 0

Nhập vào một số DƯơng: 2.0

Tổng = 5





Bài tập: Bạn thử sử dụng câu lệnh continue trong vòng lặp lồng nhau thử xem. Nó hoạt động như thế nào?





Chương II. Phần 7.2. Câu lệnh continue label trong Java



Bạn cũng có thể sử dụng câu lệnh continue trong Java để bỏ qua vòng lặp hiện tại và tiếp tục thực hiện một vòng lặp được chỉ định (label).





Cách sử dụng cũng giống như câu lệnh break.





Hãy cùng xem ví dụ về continue label trong Java:







// Ví dụ sử dụng continue label trong Java class ViDuContinueLabel { public static void main ( String [] args ) {

vongLapFor1 : for ( int i = 1 ; i <= 3 ; ++i) { for ( int j = 1 ; j <= 3 ; ++j) {

/*Khi j = 2 thì bỏ qua lần lặp này và tiếp tục chạy vòng lặp vongLapFor1*/ if (j == 2 ) continue vongLapFor1; System . out . println ( "i = " + i + "; j = " + j); } } } }





Khi chạy chương trình, kết quả nhận được là:







i = 1 và j = 1

i = 2 và j = 1

i = 3 và j = 1





Lưu ý!



Việc sử dụng label trong lập trình không được khuyến khích vì nó làm code của bạn khó hiểu.



Nếu đứng trước tình huống sử dụng label thì tốt hơn hết là nên tái cấu trúc lại code. Cố gắng tìm cách giải quyết khác.

Continue trong Java nhé. > Nếu bạn chưa hiểu lắm về continue thì tiếp tục đọc bàinhé.



Như vậy là đến đây, bạn đã được hướng dẫn tự học ngôn ngữ Java với:





Chương 1: Làm quen với ngôn ngữ lập trình Java Chương 2: Cấu trúc điều khiển trong Java.



Tiếp theo, chúng ta sẽ đến với một phần rất quan trọng trong lập trình Java, đó là Mảng trong Java.





Trong khi làm việc thực tế, chúng ta sẽ thao tác với mảng rất nhiều. Do đó, phần Mảng sẽ là một chương.





CHƯƠNG III: HỌC LẬP TRÌNH VỚI MẢNG TRONG JAVA



Trong chương này, bạn sẽ học cách làm việc với các mảng trong Java.





Bạn sẽ học được cách khai báo, khởi tạo và truy cập các phần tử mảng qua từng ví dụ cụ thể.





Mảng trong Java giống như một con tàu chở một loại mặt hàng duy nhất.





Nó được sinh ra để chứa nhiều giá trị cùng loại.





Trước khi chưa biết về mảng, chúng ta thường tạo nhiều biến để lưu giá trị, như thế này:







int a = 1 ; int b = 2 ; int c = 3 ; int d = 4 ; int e = 5 ; ... int x =





Nhưng với mảng, chúng ta chỉ chỉ cần tạo một mảng duy nhất:







int [] diem = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };





Chương III. Phần 1. Cách khai báo Mảng trong Java



Đây là cách bạn có thể khai báo một mảng trong Java:







dataType[] arrayName;







Trong đó:



dataType có thể là một kiểu dữ liệu nguyên thủy (int, char, Double, byte...) hoặc một đối tượng (chúng ta sẽ học về đối tượng sau)

arrayName là tên của mảng do bạn định nghĩa



Hãy lấy một ví dụ đơn giản như thế này:







int [] diem ;





Ở đây, mảng diem có thể chứa các số nguyên (int)





Nhưng,





Mảng có thể lưu trữ bao nhiêu phần tử?





Ngôn ngữ Java được sử dụng rất phổ biến bởi tính chặt chẽ của nó. Nó cho phép chúng ta kiểm soát tài nguyên, bộ nhớ rất tốt.





Khi khai báo mảng diem ở trên, chúng ta chưa phân bổ bộ nhớ cho các phần tử của mảng.





Bây giờ, hãy phân bổ cho nó.







diem = new int [ 10 ];





Bây giờ, mảng diem đã có thể chứa được 10 phần tử kiểu int (độ dài của mảng là 10).





Lưu ý!



Trong Java, một khi độ dài được xác định, nó không thể thay đổi



Bạn cũng có thể vừa khai báo, vừa phân bổ bộ nhớ cho mảng trong một câu lệnh, như thế này:







int [] diem = new int [ 10 ];





Chương III. Phần 2. Chỉ số Mảng trong Java



Trong Java, bạn có thể truy cập các phần tử của mảng thông qua chỉ số (index)





Hãy xem xét lại ví dụ trước:







int [] diem = new int [ 10 ];









Hình ảnh minh họa mảng trong Java Hình ảnh minh họa mảng trong Java





Trong đó:





0 là vị trí của phần tử đầu tiên (Trong lập trình, máy đếm từ 0, 1, 2, 3, ...) Để truy cập phần tử đầu tiên ta sử dụng diem[0] , phần tử thứ hai là diem[1] , .... Nếu độ dài của mảng là n thì phần tử cuối cùng là diem[n - 1] Giá trị mặc địch ban đầu của các phần tử mảng số là 0 , và false đối với mảng logic.



Ví dụ chứng minh giá trị mặc định của các phần tử mảng số là 0 :







class ViDuMang1 { public static void main ( String [] args ) {

int [] diem = new int [ 5 ];

System . out . println (diem[ 0 ]); System . out . println (diem[ 1 ]); System . out . println (diem[ 2 ]); System . out . println (diem[ 3 ]); System . out . println (diem[ 4 ]); } }





Khi chạy chương trình, kết quả nhận được là:







0

0

0

0

0





Cách tốt hơn để truy cập các mảng trong Java là sử dụng vòng lặp.







// Sử dụng vòng lặp for để lặp qua mảng trong Java class ViDuLapMang { public static void main ( String [] args ) {

int [] diem = new int [ 5 ];

for ( int i = 0 ; i < 5 ; ++i) { System . out . println (diem[i]); } } }





Chương III. Phần 2.1. Cách khởi tạo Mảng trong Java



Trong Java, bạn có thể khởi tạo mảng trong khi khai báo hoặc bạn có thể khởi tạo (hoặc thay đổi giá trị) sau này trong chương trình theo yêu cầu của bạn.







int [] diem = { 9 , 8 , 1 , 7 , 4 };





Câu lệnh trên khởi tạo mảng ngay khi khai báo.





Độ dài của mảng được xác định bằng số lượng giá trị phân tách nhau bằng dấu phảy ,





Trong ví dụ này, độ dài của mảng là 5.









Ví dụ khởi tạo mảng trong Java



Bây giờ, hãy viết một chương trình đơn giản để in các giá trị này ra màn hình:







class ViDuMang2 { public static void mani ( String [] args ) {

int [] diem = { 9 , 8 , 1 , 7 , 4 };

// Sử dụng vòng lặp for để lặp qua mảng for ( int i = 0 ; i <= 5 ; ++i) { System . out . println ( "Phần tử ở vị trí " + i + " là: " + diem[i]); } } }







Khi chạy chương trình, kết quả nhận được là:







Phần tử ở vị trí 0 là: 9

Phần tử ở vị trí 1 là: 8

Phần tử ở vị trí 2 là: 1

Phần tử ở vị trí 3 là: 7

Phần tử ở vị trí 4 là: 4





Chương III. Phần 2.2. Cách truy cập phần tử mảng trong Java.



Trong lập trình Java, bạn có thể dễ dàng truy cập phần tử của mảng thông qua chỉ số (index) của nó.





Ví dụ:







class ViDuMang3 { public static void mani ( String [] args ) {

int [] diem = { 9 , 8 , 1 , 7 , 4 };

diem[ 2 ] = 10 ;

// Sử dụng vòng lặp for để lặp qua mảng System . out . println ( "Phần tử đầu tiên của mảng diem là " + diem[ 0 ]); System . out . println ( "Phần tử thứ 3 của mảng diem là " + diem[ 2 ]); System . out . println ( "Phần tử thứ 4 của mảng diem là " + diem[ 3 ]); } }





Khi chạy chương trình, kết quả nhận được là:







Phần tử đầu tiên của mảng diem là: 9

Phần tử thứ 3 của mảng diem là: 10

Phần tử thứ 4 của mảng diem là: 7





* Lưu ý: Trong lập trình, máy tính đếm từ 0, 1, 2, 3, 4, 5, ...





Như vậy, câu lệnh diem[2] = 0; đã thực hiện gán lại giá trị của phần tử thứ 3 trong mảng diem.





Một ví dụ khác bên dưới đây sẽ tính tổng và giá trị trung bình của điểm trong mảng diem int:







class ViDuMang4 { public static void main ( String [] args ) {

int [] diemToan = { 9 , 8 , 1 , 7 , 4 };

int tong = 0 ; Double diemTrungBinh ;

// Sử dụng for each để lặp for ( int diem : diemToan) { tong += diem; }

// Tính toán độ dài của mảng int doDaiMang = diemToan . length ;

// Ép kiểu của tong và doDaiMang về kiểu double // và tính điểm trung bình môn Toán

diemTrungBinh = (( double )tong / ( double )doDaiMang);

// In kết quả ra màn hình System . out . println ( "Tổng điểm = " + tong); System . out . println ( "Điểm trung bình môn Toán = " + diemTrungBinh); } }







Khi chạy chương trình, kết quả nhận được là:







Tổng điểm = 29

Điểm trung bình môn Toán = 5.8





Chương trình ở trên chắc không có gì khó hiểu nhỉ?





Chỉ có phần (double)tong và (double)doDaiMang là có thể bạn chưa được học.





Trong ngôn ngữ Java, kiểu dữ liệu rất chặt chẽ, do đó nếu dữ liệu không khớp với kiểu đã khai báo thì sẽ gây ra lỗi.





Chính vì thế, khi tính điểm trung bình rất có khả năng giá trị trả về sẽ là số thập phân.





Vì thế, chúng ta cần ép kiểu của tong và doDaiMang về kiểu double để kết quả trả về phù hợp với kiểu dữ liệu của diemTrungBinh mà chúng ta đã khai báo.





* Bạn cũng có thể chỉ cần ép kiểu 1 biến (double)tong hoặc (double)doDaiMang .





Chương III. Phần 2. Mảng đa chiều trong Java.



Trong Java, bạn có thể khai báo một mảng chứa các mảng được gọi là mảng đa chiều.





Trước khi tìm hiểu mảng đa chiều, hãy chắc chắn bạn đã đọc kỹ phần mảng một chiều trong Java và tự tay làm qua các ví dụ.





Trong phần đó bạn đã được học cách khai báo, khởi tạo, truy cập mảng. Mảng đa chiều cũng tương tự như vậy.





Ví dụ:







int [][] a = new int [ 3 ][ 4 ];





Ở đây, a là một mảng 2 chiều (còn gọi là mảng 2d).





Mảng này có thể chứa 12 phần tử kiểu int.









Khai báo mảng 2 chiều trong Java.



Lưu ý!



Trong Java, máy tính bắt đầu đếm từ 0. Do đó mảng bắt đầu từ 0 chứ không phải 1



Tương tự như vậy, bạn có thể khai báo mảng 3 chiều như thế này:







int [][][] a = new int [ 3 ][ 4 ][ 2 ];





Ở đây, a chứa được tối đa 3*4*2 (24) phần tử int.





Lưu ý!



Trong Java, độ dài của các hàng trong mảng có thể khác nhau.



Chương III. Phần 2.1. Cách khởi tạo Mảng đa chiều trong Java.

Đây là cách bạn có thể khởi tạo mảng 2 chiều trong Java.







int [][] a = { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, }



Như đã nói ở trên, mỗi thành phần của mảng a là một mảng và chiều dài của mỗi hàng cũng khác nhau.









Ví dụ khởi tạo mảng 2 chiều trong Java





Thử viết chương trình để chứng minh ví dụ trên:







class ViDuMangDaChieu1 { public static void main ( String [] args ) {

int [][] a = { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, };

System . out . println ( "Độ dài hàng 1: " + a[ 0 ]. length ); System . out . println ( "Độ dài hàng 2: " + a[ 1 ]. length ); System . out . println ( "Độ dài hàng 3: " + a[ 2 ]. length ); } }





Khi chạy chương trình, kết quả bạn nhận được là:







Độ dài hàng 1: 3

Độ dài hàng 2: 4

Độ dài hàng 3: 1





Bởi vì, mỗi một thành phần của một mảng đa chiều cũng là một mảng.





Vì thế, a[0] , a[1] , a[2] cũng là một mảng.





Do đó, bạn có thể sử dụng thuộc tính length để tính độ dài của chúng.





Chương III. Phần 2.2. Ví dụ về mảng đa chiều trong Java.



Để hiểu hơn về mảng đa chiều, hãy cùng làm thêm ví dụ về chúng.



Ví dụ dưới đây sẽ sử dụng vòng lặp for để in ra tất cả các phần tử trong mảng.







class ViDuMangDaChieu2 { public static void main ( String [] args ) {

// Khởi tạo mảng int [][] a = { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, };

// Lặp qua mảng và in ra các phần tử for ( int i = 0 ; i < a . length ; ++i) { for ( int j = 0 ; j < a[i]. length ; ++j) { System . out . println ( "Phần tử a[" + i + "]" + "[" + j + "] là: " + a[i][j]);

} } } }





Khi chạy chương trình, kết quả nhận được là:







Phần tử a[0][0] là: 2

Phần tử a[0][1] là: 3

Phần tử a[0][2] là: 4

Phần tử a[1][0] là: 3

Phần tử a[1][1] là: 4

Phần tử a[1][2] là: 5

Phần tử a[2][0] là: 3





Cách làm trên cũng ổn.





Tuy nhiên, để lặp qua mảng, tốt hơn hết là sử dụng vòng lặp for each.







class ViDuMangDaChieu3 { public static void main ( String [] args ) {

// Khởi tạo mảng int [][] a = { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, };

// Lặp qua mảng và in ra các phần tử // Sử dụng vòng lặp for each for ( int [] mangCon : a) { for ( int giaTri : mangCon) { System . out . println (giaTri); } } } }





Khi chạy chương trình, kết quả nhận được là:







2

3

4

3

4

3

5

3





Qua 2 ví dụ ở trên, chúng ta đa thử khởi tạo mảng 2 chiều và thao tác với chúng.





Bây giờ, hãy thử tạo mảng 3 chiều thử xem nhé.





// Khởi tạo mảng 3 chiều int [][][] mang3Chieu = { { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, },

{ { 1 , 2 , 3 , 4 }, { 5 , 5 } } };





Bạn có thể hiểu đơn giản thế này, mảng 3 chiều là mảng các mảng 2 chiều.





Có nghĩa là, mỗi phần tử của mảng có thể là một mảng 2 chiều.





Tương tự như mảng 2d, mảng 3d có thể có độ dài khác nhau.





Ví dụ sử dụng vòng lặp for each để in tất cả các phần tử trong mảng 3D.







class ViDuMangDaChieu4 { public static void manin ( String [] args ) { // Khởi tạo mảng 3 chiều int [][][] mang3Chieu = { { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, },

{ { 1 , 2 , 3 , 4 }, { 5 , 5 } }

};

// In tất cả các phần tử trong mảng 3D // Sử dụng vòng lặp for each

for ( int [][] mang2Chieu : mang3Chieu) { for ( int [] mangCon : mang2Chieu) { for ( int giaTri : mangCon) { System . out . println (giaTri); } } } } }





Khi chạy chương trình, kết quả nhận được là:











2

3

4

3

4

3

5

3

1

2

3

4

5

5

Vậy,

Lưu ý!



Mảng càng sâu sẽ làm hiệu suất của chương trình càng chậm

Chương III. Phần 3. Cách copy mảng trong Java.

Trong phần hướng dẫn tự học lập trình Java này, bạn sẽ tìm hiểu về các cách sao chép mảng / copy mảng trong Java (cả một chiều và hai chiều).

Chương III. Phần 3.1. Sao chép mảng Java sử dụng toán tử gán

Bạn có thể sao chép mảng bằng cách sử dụng toán tử gán =, ví dụ:



class ViDuCopyMang1 { public static void main ( String [] args ) { int [] diemToan = { 1 , 2 , 3 , 4 , 5 , 6 };

// Copy mảng sử dụng toán tử gán int [] diemToan1 = diemToan;

for ( int diem : diemToan1) { System . out . print (diem + ", " ); } } }



Khi chạy chương trình, kết quả nhận được là:



1, 2, 3, 4, 5, 6,



Mặc dù kỹ thuật sao chép mảng trong Java bằng toán tử gán có vẻ làm rất tốt.





Nhưng có một vấn đề với cách sao chép mảng này:





Nếu bạn thay đổi phần tử của 1 mảng, mảng còn lại cũng thay đổi theo. Ví dụ:



class ViDuCopyMang1 { public static void main ( String [] args ) { int [] diemToan = { 1 , 2 , 3 , 4 , 5 , 6 };

// Copy mảng sử dụng toán tử gán int [] diemToan1 = diemToan;

// Thay đổi phần tử trong mảng diemToan diemToan[ 0 ] = 10 ; System . out . print ( "Mảng diemToan1: " ); // In tất cả các phần tử trong mảng diemToan1 for ( int diem : diemToan1) { System . out . print (diem + ", " ); }

// Thay đổi phần tử trong mảng diemToan1 diemToan1[ 1 ] = 10 ; System . out . print ( '

' + "Mảng diemToan: " ); // In tất cả phần tử trong mảng diemToan for ( int diem : diemToan) { System . out . print (diem + ", " ); } } }



Kết quả:



Mảng diemToan1: 10, 2, 3, 4, 5, 6,

Mảng diemToan: 10, 10, 3, 4, 5, 6,



Như bạn thấy, trong ví dụ trên:

Chúng ta gán lại phần tử đầu tiên của mảng diemToan

Sau đó in ra tất cả các phần tử của mảng diemToan1 .

Nhận thấy mảng diemToan1 đã thay đổi theo sự thay đổi của mảng diemToan

Tương tự,

Chúng ta thử nghiệm thay đổi phần tử thứ 2 của mảng diemToan1

Rồi thử in tất cả các phần tử của mảng diemToan

Nhận thấy, mảng diemToan cũng đã thay đổi theo sự thay đổi của mảng diemToan1

Như vậy, kết luận là, sử dụng toán tử gán để sao chép mảng dẫn tới 2 mảng cùng tham chiếu đến cùng một vị trí.





Sự thay đổi của mảng này sẽ kéo theo sự thay đổi của mảng kia.





Đây được gọi là sao chép nông (shallow copy).

Chương III. Phần 3.2. Sao chép mảng Java sử dụng vòng lặp

Chúng ta cũng có thể sao chép mảng trong Java bằng cách sử dụng vòng lặp, ví dụ:



import java.util.Arrays;

class ViDuCopyMang2 { public static void main ( String [] args ) {

int [] diemToan = { 1 , 2 , 3 , 4 , 5 , 6 }; int [] diemVan = new int [ 6 ];

for ( int i = 0 ; i < diemToan . length ; ++i) { diemVan[i] = diemToan[i]; }

// Chuyển đổi mảng thành chuỗi System . out . println ( Arrays . toString (diemVan)); } }



Khi chạy chương trình copy mảng trên, kết quả nhận được là:



[1, 2, 3, 4, 5, 6]



Ở đây, chúng ta đã tạo ra một mảng trống là diemVan với độ dài là 6 phần tử.





Quay mỗi lần lặp, chúng ta lại sao chép phần tử trong mảng diemToan sang mảng diemVan (với cùng vị trí).





Khi sử dụng cách sao chép mảng này, mảng diemToan và diemVan không chia sẻ cùng một tham chiếu.





Do đó, nếu sau khi copy, bạn thay đổi mảng diemToan hoặc mảng diemVan thì chúng không ảnh hưởng đến nhau.

Lưu ý!



Phương thức toString() được sử dụng để chuyển đổi mảng thành chuỗi (để hỗ trợ in ra màn hình)

Chương III. Phần 3.3. Sao chép mảng Java sử dụng phương thức arraycopy()

System chứa phương thức arraycopy() cho phép bạn sao chép dữ liệu từ mảng này sang mảng khác.





Phương thức arraycopy() rất linh hoạt và hiệu quả.





Nó cũng cho phép bạn sao chép một phần theo chỉ định của mảng nguồn vào mảng đích. Classchứa phương thứccho phép bạn sao chép dữ liệu từ mảng này sang mảng khác.Phương thứcrất linh hoạt và hiệu quả.Nó cũng cho phép bạn sao chép một phần theo chỉ định của mảng nguồn vào mảng đích.



// Cú pháp sao chép mảng sử dụng phương thức arraycopy() public static void arraycopy ( Object mangNguon, int viTriBatDauMangNguon, Object mangDich, int viTriBatDauMangDich, int doDai)



Trong đó:

mangNguon : Là mảng bạn muốn sao chép

viTriBatDauMangNguon : Là vị trí bắt đầu mảng nguồn (index) bạn muốn sao chép

mangDich : Là mảng bạn muốn sao chép đến

viTriBatDauMangDich : Là vị trí bắt đầu mảng đich (index) bạn muốn sao chép đến

doDai : là số phần tử bạn muốn sao chép

Hãy thử làm ví dụ sao chép mảng trong Java bằng phương thức arraycopy():



// Import cái này để sử dụng phương thức toString() import java.util.Arrays;

class ViDuCopyMang3 { public static void main ( String [] args ) { int [] n1 = { 1 , 2 , 3 , 4 , 5 , 6 }; int [] n3 = new int [ 5 ];

// Tạo mảng n2 có độ dài của mảng n1 int [] n2 = new int [ n1 . length ]; // Sao chép mảng n1 sang mảng n2 System . arraycopy (n1, 0 , n2, 0 , n1 . length ); System . out . println ( "Mảng n2 = " + Arrays . toString (n2)); // Sao chép 2 phần tử mảng n1, bắt đầu từ phần tử // có index là 2 đến mảng n3 (bắt đầu từ vị trí index 1)

System . arraycopy (n1, 2 , n3, 1 , 2 ); System . out . println ( "Mảng n3 = " + Arrays . toString (n3)); } }



Khi chạy chương trình, kết quả nhận được là:



Mảng n2 = [1, 2, 3, 4, 5, 6]

Mảng n3 = [0, 3, 4, 0, 0]



Lưu ý!



Giá trị ban đầu mặc định của mảng int là 0

Chương III. Phần 3.4. Sao chép mảng Java sử dụng phương thức copyOfRange()

java.util.Arrays để sao chép mảng.





Như thế, bạn sẽ không cần tạo mảng đích trước khi gọi phương thức này.





Đây là cách phương thức copyOfRange() hoạt động: Ngoài ra, bạn có thể sử dụng phương thức copyOfRange() được định nghĩa trong classđể sao chép mảng.Như thế, bạn sẽ không cần tạo mảng đích trước khi gọi phương thức này.Đây là cách phương thứchoạt động:



// Để sử dụng Phương thức toString() và copyOfRange() import java.util.Arrays;

class ViDuCopyMang4 { public static void main ( String [] args ) { int [] mangNguon = { 1 , 2 , 3 , 4 , 5 }; // Sao chép mảng nguồn đến mảng đích 1 int [] mangDich1 = Arrays . copyOfRange (mangNguon, 0 , mangNguon . length ); System . out . println ( "Mảng mangDich1 = " + Arrays . toString (mangDich1)); // Sao chép mảng nguồn đến mảng đích 2 // từ index bằng 2 đến index bằng 4 (Không bao gồm ví trí index 4) // Có nghĩa là chỉ sao chép giá trị 3, 4 trong mảng nguồn int [] mangDich2 = Arrays . copyOfRange (mangNguon, 2 , 4 ); System . out . println ( "Mảng mangDich2 = " + Arrays . toString (mangDich2)); } }



Kết quả khi chạy chương trình nhận được là:



Mảng mangDich1 = [1, 2, 3, 4, 5]

Mảng mangDich2 = [3, 4]



Chương III. Phần 3.5. Sao chép mảng 2 chiều sử dụng vòng lặp

Ở trên chúng ta đã học được cách sao chép mảng 1 chiều. Và dĩ nhiên, chúng ta cũng có thể sao chép mảng 2 chiều.





Ví dụ sử dụng vòng lặp để sao chép mảng 2 chiều:



import java.util.Arrays;

class ViDuCopyMang2Chieu { public static void main ( String [] args ) {

int [][] mangNguon = { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, };

int [][] mangDich = new int [ mangNguon . length ][];

for ( int i = 0 ; i < mangDich . length ; ++i) {

// Phân bổ không gian cho mỗi hàng của mảng đích mangDich[i] = new int [mangNguon[i]. length ];

for ( int j = 0 ; j < mangDich[i]. length ; ++j) { mangDich[i][j] = mangNguon[i][j]; } }

// Hiển thị mảng đích System . out . println ( Arrays . deepToString (mangDich)); } }



Khi chạy chương trình, kết quả nhận được là:



[[2, 3, 4], [3, 4, 3, 5], [3]]









Phương thức deepToString() hiển thị trực quan rất tốt phải không?





Bạn có thể tìm hiểu thêm về deepToString() trong tài liệu của Oracle.





Ngoài ra, bạn cũng có thể sử dụng System.arraycopy() hoặc Arrays.copyOf() trong trường hợp mảng 1 chiều. Bạn có thể thấy chúng ta đã sử dụng phương thức deepToString() của class Arrays.Phương thức deepToString() hiển thị trực quan rất tốt phải không?Bạn có thể tìm hiểu thêm về deepToString() trong tài liệu củaNgoài ra, bạn cũng có thể sử dụnghoặctrong trường hợp mảng 1 chiều.



import java.util.Arrays;

class ViDuCopyMang2Chieu2 { public static void main ( String [] args ) {

int [][] mangNguon = { { 2 , 3 , 4 }, { 3 , 4 , 3 , 5 }, { 3 }, };

int [][] mangDich = new int [ mangNguon . length ][];

for ( int i = 0 ; i < mangNguon . length ; ++i) {

// Phân bổ không gian cho mỗi hàng của mảng đích mangDich[i] = new int [mangNguon[i]. length ]; System . arraycopy (mangNguon[i], 0 , mangDich[i], 0 , mangDich[i]. length ); }

// Hiển thị mảng đích System . out . println ( Arrays . deepToString (mangDich)); } }



Kết quả:



[[2, 3, 4], [3, 4, 3, 5], [3]]



Ok, vậy là bạn đã được học về mảng trong Java.





Đi tới đây cũng là khá xa, nắm kha khá về ngôn ngữ Java rồi đấy.





Và, để tiếp tục.

Bạn nên biết rằng: Java là ngôn ngữ lập trình hướng đối tượng (OOP).





Trong chương tới đây, bạn sẽ được học OOP thật kỹ càng. Học từ cách thể tạo class và object tùy chỉnh cho đến việc vận dụng các tính chất của OOP.

CHƯƠNG IV. HỌC LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (Part1)

Chương IV. Phần 1. Class và Object trong Java

Java là một ngôn ngữ lập trình hướng đối tượng (OOP).



OOP là viết tắt của từ Object-oriented programming



Lập trình hướng đối tượng cho phép bạn chia các vấn đề phức tạp thành các tập nhỏ hơn bằng cách tạo ra các đối tượng.





Những đối tượng này có chung đặc điểm:

Trạng thái / thuộc tính

Hành vi

Hãy cùng lấy một ví dụ:

Đèn là một đối tượng

Đèn có thuộc tính sáng hoặc không sáng

Đèn có thể có hành vi tắt đèn và bật đèn

Tương tự:

Ô tô là một đối tượng

Ô tô có thuộc tính bánh xe, tên, thương hiệu, ghế ngồi ...

Ô tô có hành vi là di chuyển, rẽ trái, rẽ phải. lùi ...

Bạn sẽ được học về 3 đặc điểm của hướng đối tượng như đóng gói dữ liệu, kế thừa, đa hình ở chương tiếp theo.





Trong chương này, hãy để mọi thứ đơn giản nhất đã.









Video tự học Java 30: Class và Object trong Java

Chương IV. Phần 1.1. Class trong Java

Trước khi bạn tạo ra các đối tượng trong Java, bạn cần định nghĩa một class.





Một class là một bản kế hoạch chi tiết cho đối tượng.





Chúng ta có thể nghĩ về class như một bản thiết kế ngôi nhà.





Nó chứa tất cả các chi tiết về sàn nhà, cửa ra vào, cửa sổ... Và dựa trên những mô tả này, chúng ta có thể xây dựng ra các ngôi nhà.





Ở đây, Nhà là đối tượng (object).

Chương IV. Phần 1.2. Cách định nghĩa class trong Java

Đây là cách bạn có thể định nghĩa một class trong Java:



class TenClass { // Biến // Phương thức }



Còn đây, là một ví dụ về class đèn mà chúng ta đã mô tả ở trên:



class Den { // Biến thể hiện (instance variable) private String denSang ;

// Phương thức bật đèn public void batDen (){ denSang = "Đèn đang sáng" ; }

// Phương thức tắt đèn public void tatDen () { denSang = "Đèn đang tắt" ; } }



Ở đây, chúng ta đã định nghĩa:

Một class tên là Den (Xem thêm vê quy tắc đặt tên class trong Java)

Một biến thể hiện là denSang , có kiểu dữ liệu là String .

Hai phương thức batDen() và tatDen()

Tất cả biến và phương thức trong class được gọi là members của class.





Và lưu ý, chúng ta có từ khóa public và private . Đây là từ khóa được sử dụng để điều chỉnh mức độ truy cập.

Từ khóa private làm cho biến thể hiện và phương thức chỉ có thể truy cập được từ bên trong cùng class.

Từ khóa public làm cho biến thể hiện và phương thức có thể truy cập được từ bên ngoài class.

Trong chương trình trên, biến denSang là private .





Nếu bạn cố gắng truy cập vào biến denSang từ class khác (mà không phải bên trong class Den ) thì trình biên dịch sẽ ném ra lỗi.

Chương IV. Phần 1.3. Cách tạo Object trong Java

Khi class được định nghĩa, chỉ có đặc tả của đối tượng được xác định. Bộ nhớ chưa được phân bổ.





Để truy cập các thành viên được định nghĩa bên trong class, bạn cần tạo các đối tượng.





Hãy thử tạo các đối tượng của class Den .



class Den { // Biến thể hiện (instance variable) private String denSang ;

// Phương thức bật đèn public void batDen (){ denSang = "Đèn đang sáng" ; }

// Phương thức tắt đèn public void tatDen () { denSang = "Đèn đang tắt" ; } }

class TaoDoiTuongDen { public static void main ( String [] args ) {

// Tạo đối tượng den1 từ class Den Den den1 = new Den (); // Tạo đối tượng den2 từ class Den Den den2 = new Den (); } }



Ở đây, chúng ta đã tạo ra 2 đối tượng den1 và den2 từ class Den .

Chương IV. Phần 1.4. Cách truy cập thành viên trong Java

Bạn có thể truy cập các thành viên (members) bạn có thể sử dụng toán tử dot .





Ví dụ truy cập phương thức batDen() trong class Den :



den1 . batDen ();



Bạn đã nghe thấy từ "Phương thức" (method) rất nhiều rồi đúng không?





Trong phần tiếp theo chúng ta sẽ tìm hiểu kỹ hơn. Bây giờ hãy để mọi thứ đơn giản đã.





Khi bạn gọi đến phương thức:

Tất cả các câu lệnh trong phương thức sẽ được thực thi

Sau đó, trình điều khiển chương trình nhảy trở lại, tiếp tục thưc thi câu lệnh ngay sau câu lệnh vừa được gọi.









Ảnh minh họa cách thực thi phương thức trong Java

Tương tự, bạn cũng có thể truy cập vào biến thể hiện.



den1 . denSang = "Đèn sáng rồi ...." ;



Chú ý, từ khóa private khiến cho biến denSang chỉ có thể truy cập được từ bên trong class Den .





Vì thế, nếu câu lệnh den1.denSang = "Đèn sáng rồi ...."; được đặt trong phương thức main() ở class TaoDoiTuongDen thì chương trình sẽ ném ra lỗi.

Chương IV. Phần 1.5. Ví dụ về Class và Object trong Java

Bây giờ, hãy làm một ví dụ hoàn chỉnh về class và object trong Java.





Lần này chúng ta chỉ cần tạo một đối tượng đèn để ngắn gọn hơn.



class Den { // Biến thể hiện (instance variable) private String denSang ;

// Phương thức bật đèn public void batDen (){ denSang = "Đèn đang sáng" ; }

// Phương thức tắt đèn public void tatDen () { denSang = "Đèn đang tắt" ; }

public void thongBao () { System . out . println ( "Thông báo: " + denSang); } } class TaoDoiTuongDen { public static void main ( String [] args ) {

// Tạo đối tượng den1 từ class Den Den den = new Den ();

// Bật đèn den . batDen (); // Thông báo trạng thái của đèn den . thongBao ();

// Tắt đèn den . tatDen (); // Thông báo trạng thái của đèn den . thongBao ();

} }



Khi chúng ta chạy chương trình, kết quả nhận được là:



Thông báo: Đèn đang sáng

Thông báo: Đèn đang tắt



Trong chương trình trên:

Chúng ta đã tạo một class Den để định nghĩa các biến và phương thức.

Biến denSang nhận giá trị dạng String .

Hai phương thức batDen() và tatDen() là để gán giá trị cho biến denSang .

Phương thức thongBao() là để in ra giá trị denSang đang chứa.

Tiếp đó:

Chúng ta tạo class TaoDoiTuongDen

Câu lệnh Den den = new Den(); là để tạo một đối tượng den từ class Den

Sau đó, chúng ta thử bật đèn. Câu lệnh den.batDen(); chỉ định chương trình thực thi code bên trong phương thức batDen() .

Có nghĩa là gán giá trị "Đèn đang sáng" cho biến denSang .

Và in ra giá trị denSang đang chứa bằng câu lệnh den.thongBao();

Tương tự, chúng ta tắt đèn bằng cách gọi đến phương thức tatDen() và lại in thông báo.

Lưu ý rằng, biến được định nghĩa bên trong class được gọi là biến thể hiện (instance variable) là có lý do của nó.





Vì khi một đối tượng được khởi tạo, nó được gọi là một thể hiện (instance).





Mỗi thể hiện chứa bản sao riêng của các biến này. Thế nên gọi là biến thể hiện (instance variable)





Ví dụ, biến denSang ở trên đầu được tạo ra cho đối tượng den1 và den2 là khác nhau.

Chương IV. Phần 2. Phương thức trong Java

Ok, như đã đề cập ở trên, phần này bạn sẽ được học về Phương thức trong Java.





Bạn sẽ học được cách định nghĩa phương thức, cách sử dụng phương thức trong lập trình.





Vậy...





Chính xác thì ....

Chương IV. Phần 2.1. Phương thức là gì?

Trong Toán học, chắc bạn đã được học về hàm.





Ví dụ, hàm f(x) = x ^ 2 là một hàm trả về giá trị bình phương của x.

Nếu x = 2 thì f(2) = 4

Nếu x = 3 thì f(3) = 9

Cứ thế ...

Tương tự, trong lập trình cũng thế. Một hàm là một khối code thực hiện một nhiệm vụ cụ thể nào đó.





Và trong phương pháp lập trình hướng đối tượng, hàm được gọi với tên gọi khác là "Phương thức" để gần với ý nghĩa hướng đối tượng hơn.



Phương thức trong tiếng Anh là method

Các phương thức này được liên kết với một class. Và nó định nghĩa hành vi của class đó.

Chương IV. Phần 2.2. Các kiểu phương thức.

Tùy thuộc vào việc một phương thức được định nghĩa bởi người dùng hay có sẵn trong thư viện chuẩn mà chia thành hai loại phương thức:

Standard Library Methods

User-defined Methods

Chương IV. Phần 2.3 Phương thức trong thư viện tiêu chuẩn









Video tự học Java 31: Phương thức dựng sẵn (Có trong thư viện tiêu chuẩn)

Các phương thức kiểu Standard Library Methods là các phương thức được dựng sẵn trong Java (Built-in Functions).





Bạn có thể gọi để sử dụng chúng ngay.





Các thư viện chuẩn này đi kèm với Thư viện Java Class (JCL) trong tệp lưu trữ Java (* .jar) với JVM và JRE.





Ví dụ:

print() là phương thức trong java.io.PrintSteam.

sqrt() là phương thức trong lớp Math.

Ví dụ về phương thức sqrt():



// Ví dụ phương thức sqrt() có sẵn trong class Math public class ViDuSqrtMethod { public static void main ( String [] args ) { System . out . print ( "Căn bậc 2 của 4 là: " + Math . sqrt ( 4 )); } }



Khi chạy chương trình, kết quả nhận được là:



Căn bậc 2 của 4 là: 2



Chương IV. Phần 2.4. Phương thức tự định nghĩa trong Java









Video tự học Java 32: Phương thức tự định nghĩa trong Java



Bạn cũng có thể tự định nghĩa các phương thức bên trong một class theo mong muốn của bạn.





Các phương thức như vậy được gọi là phương thức do người dùng định nghĩa (user-defined methods)





Trước khi bạn có thể sử dụng (gọi một phương thức), bạn cần định nghĩa nó.





Đây là cách bạn định nghĩa các phương thức trong Java:



public static void myMethod () { System . out . println ( "Phương thức myMethod được gọi" ); }



Ở đây, chúng ta đã định nghĩa phương thức có tên là myMethod

Bạn có thể thấy:

Từ khóa public cho phép bạn có thể truy cập phương thức từ bên ngoài class nó được định nghĩa.

Từ khóa static cho phép bạn có thể truy cập phương thức mà không cần tạo đối tượng.

Từ khóa void biểu thị rằng phương thức này không trả về bất kỳ giá trị nào.

Trong chương trình trên, phương thức myMethod không chấp nhận bất kỳ đối số nào.





Do đó dấu ngoặc tròn () này không có gì.

Lưu ý!



Bạn sẽ được học cách truyền đối số cho một phương thức trong các phần sau.

Cú pháp đầy đủ để định nghĩa một phương thức trong Java là:



modifier static returnType nameOfMethod ( Parameter List) { // method body }



Trong đó:

modifier: Xác định mức độ truy cập như public, private và protected

static: Nếu bạn sử dụng từ khóa static thì phương thức có thể được truy cập mà không cần tạo đối tượng.

returnType: Giá trị phương thức có thể trả về

Nó có thể trả về các kiểu dữ liệu gốc (int, float, double, v.v.), các đối tượng gốc (String, Map, List, v.v.) hoặc bất kỳ đối tượng nào được tích hợp hoặc đối tượng do người dùng định nghĩa.

nameOfMethod: Tên (định danh) của phương thức

Bạn có thể đặt bất kỳ tên nào cho một phương thức.



Tuy nhiên, thông thường, tên phương thức được đặt theo hành vi của nó ví dụ: tinhDiemTrungBinh , tinhDienTichHinhTron , ...

Parameters (Arguments): Các tham số là các giá trị được truyền cho một phương thức.

Bạn có thể truyền đối số cho một phương thức với số lượng bất kỳ.

Method body: Nó xác định phương thức thực sự làm gì, cách các tham số được thao tác với các câu lệnh lập trình và giá trị nào được trả về. Các câu lệnh được đặt bên trong dấu ngoặc nhọn { } là phần thân của phương thức.

Sau khi bạn đã định nghĩa phương thức. Nó có thể được gọi trong main





Khi bạn gọi phương thức, đây là câu lệnh thường dùng để gọi phương thức kiểu static .



myMethod ();



Còn khi gọi phương thức non-static , chúng ta gọi thông qua đối tượng (Giả sử mình đã tạo đối tượng den của class Den):



den . myMethod ();



Đầu tiên, trình điều khiển chương trình bắt đầu trong hàm main. (Không quan tâm main được đặt ở đầu / giữa / cuối)

Khi gặp phương thức nào hợp lệ. Thì nhảy đến thực thi code bên trong phương thức (đã được định nghĩa trong class)

Sau đó, trình điều khiển lại tiếp tục nhảy đến dòng tiếp theo (trong main), sau phương thức vừa thực thi.

Chương IV. Phần 2.5. Ví dụ phương thức trong Java.

Để hiểu hơn về phương thức trong Java, hãy cùng làm theo ví dụ:



// Ví dụ phương thức trong Java class Main {

public static void main ( String [] args ) { System . out . println ( "Sắp gọi đến một phương thức" );

// Gọi phương thức myMethod ();

System . out . println ( "Phương thức thực thi thành công" ); }

// Định nghĩa phương thức private static void myMethod (){ System . out . println ( "Dòng này in từ trong myMethod" ); } }



Khi chạy chương trình, kết quả nhận được là:



Sắp gọi đến một phương thức

Dòng này in từ trong myMethod

Phương thức thực thi thành công



Phương thức myMethod() trong chương trình trên không chấp nhận bất kỳ đối số nào.





Ngoài ra, phương thức không trả về bất kỳ giá trị nào (kiểu trả về là void ).





Lưu ý rằng, chúng ta đã gọi phương thức mà không tạo đối tượng của class. Đó là vì myMethod() là static .





Dưới đây là một ví dụ khác về phương thức trong lập trình Java.





Trong ví dụ này, phương thức của chúng ta là non-static và nằm trong một class khác.



class Main {

public static void main ( String [] args ) {

Output obj = new Output (); System . out . println ( "Sắp gọi đến một phương thức" );

// Gọi đến phương thức myMethod() trong class Output obj . myMethod ();

System . out . println ( "Phương thức thực thi thành công" ); } }

class Output {

// public: Phương thức này có thể gọi từ bên ngoài class public void myMethod () { System . out . println ( "Dòng này in từ trong myMethod" ); } }



Khi chạy chương trình, kết quả nhận được là:



Sắp gọi đến một phương thức

Dòng này in từ trong myMethod

Phương thức thực thi thành công



Lưu ý rằng, đầu tiên chúng ta đã tạo đối tượng của class Ouput .





Sau đó phương thức myMethod được gọi bằng cách sử dụng đối tượng obj . Điều này là do myMethod() là một phương thức non-static.

Chương IV. Phần 2.6. Phương thức chấp nhận đối số và có giá trị trả về trong Java.









Video tự học Java 33: Phương thức có tham số trong Java

Một phương thức Java có thể không có hoặc có rất nhiều tham số.

Các tham số khi định nghĩa phương thức sẽ chấp nhận các đối số tương ứng được truyền vào khi gọi phương thức.

Ví dụ: Khi định nghĩa phương thức như thế này public void phuongThucA(int x) {} thì x lúc này gọi là tham số. Còn khi gọi phuongThucA(3); trong main() thì 3 gọi là đối số.

Và, phương thức cũng có thể trả về một giá trị.





Ví dụ:



// Ví dụ phương thức trả về giá trị trong Java class BinhPhuongMotSo { public static void main ( String [] args ) { int ketQua ; ketQua = tinhBinhPhuong (); System . out . println ( "Bình phương của 10 là: " + ketQua); }

public static int tinhBinhPhuong () { // Câu lệnh trả về giá trị return 10 * 10 ; } }



Khi chạy chương trình, kết quả nhận được là:



Bình phương của 10 là: 100



Trong đoạn code trên, phương thức tinhBinhPhuong() không chấp nhận bất kỳ đối số nào và luôn trả về giá trị 10 * 10 .





Ở trên, kiểu trả về của phương thức tinhBinhPhuong() là kiểu int .





Có nghĩa là, phương thức này tính toán xong sẽ trả về một số nguyên (để bạn có thể tiếp tục sử dụng kết quả này làm gì đó)





Như bạn thấy, nó đang bị cố định.





Như thế thì chương trình khá là ngu.





Chẳng nhẽ muốn tính bình phương số khác lại phải code lại chương trình khác?





Không, không cần như thế.





Chúng ta sẽ sửa lại chương trình trên như sau:



// Ví dụ phương thức chấp nhận đối số public class TinhBinhPhuongMotSo {

public static void main ( String [] args ) { int ketQua , n ;

n = 3 ketQua = tinhBinhPhuong (n); System . out . println ( "Bình phương của 3 là: " + ketQua);

n = 4 ketQua = tinhBinhPhuong (n); System . out . println ( "Bình phương của 4 là: " + ketQua); }

static int tinhBinhPhuong ( int i ) { return i * i; } }



Khi chạy chương trình, kết quả nhận được là:



Bình phương của 3 là: 9

Bình phương của 4 là: 16



Bạn thấy không, với chương trình này, chúng ta chỉ cần truyền đối số mà không cần code lại phương thức.







Video tự học Java 34: Phương thức có nhiều tham số trong Java

Bạn cũng có thể truyền nhiều đối số hơn bằng cách khai báo một danh sách tham số khi định nghĩa phương thức:



// Ví dụ phương thức chấp nhận nhiều đối số public class TinhToan {

public static int tinhTong ( int i , int j ) { return i + j; }

public static int tinhTich ( int x , int y ) { return x * y; }

public static void main ( String []