Java cơ bản – phần 1

Tram Ho

A. Introduction

1. Java introduction

a. What is Java?

Java là một ngôn ngữ lập trình cấp cao (high level) và là một nền tảng (platform) để chạy các chương trình viết bằng Java.

Java có thể tạo nhiều loại ứng dụng khác nhau:

  • Ứng dụng độc lập (standalon application): phần mềm hay dùng
  • Ứng dụng web (web application): chạy phía server, tạo những trang web động
  • Ứng dụng doanh nghiệp (enterprise application): Dành cho doanh nghiệp, ngân hàng,… cần bảo mật, an toàn và chịu tải cao
  • Ứng dụng di động (mobile application)

Hiện tại có khoảng 3 tỉ thiết bị chạy Java, đồng nghĩa với việc Java rất phổ biến hiện nay.

b. History

James Gosling và các cộng sự đã tạo ra ngôn ngữ Java, ban đầu có tên Greentalk, rồi Oak (cây sồi) và chỉ dùng trong các thiết bị điện tử, nhúng. Sau đến 1995 đổi tên thành Java (đảo ở Indonesia).

Java trải qua nhiều phiên bản khác nhau, trong đó phiên bản mới nhất là SE 14.

Java hiện sở hữu bởi Sun Microsystems (thuộc Oracle).

c. Editions

Có 4 phiên bản Java chính, dành cho các mục đích khác nhau:

  • Java Card: dành cho thẻ thông minh (smartcard) như ATM, SIM,…
  • Java ME (Micro edition): phiên bản nhỏ gọn cho mobile và thiết bị nhúng
  • Java SE (Standard edition): phiên bản chuẩn, nền tảng cốt lõi của Java
  • Java EE (Enterprise edition): phiên bản doanh nghiệp, hệ thống lớn

d. Features

Java có nhiều đặc điểm, tính năng vượt trội so với các ngôn ngữ khác, bên dưới trình bày một số đặc điểm quan trọng nhất của Java.

Platform independent

Độc lập nền tảng là đặc điểm quan trọng nhất của Java. Java biên dịch mã nguồn thành bytecode độc lập nền tảng, chạy được trên bất cứ phần cứng, HĐH nào mà Java hỗ trợ (java platform).

Write once, run anywhere – tiêu chí của Java

Simple

Java là ngôn ngữ đơn giản, cú pháp dễ học và gần với C++, và bỏ đi các tính năng không cần thiết, rườm rà như con trỏ (pointer), nạp chồng toán tử (operator overloading),…

Bên cạnh đó, Java có GC giúp tự động dọn dẹp bộ nhớ mà không cần quản lý thủ công.

Object oriented

Java là ngôn ngữ thuần hướng đối tượng (OOP).

Multi threaded

Chương trình java có thể có nhiều luồng, nên tốc độ và hiệu suất sẽ tốt hơn.

Secure

Java là ngôn ngữ an toàn, hạn chế tối đa các vấn đề bảo mật tiềm ẩn. Java không dùng con trỏ không an toàn, ép kiểu chặt chẽ, xác minh mã nghiêm ngặt.

Bên cạnh đó, chương trình chạy trong máy ảo JVM nên dễ dàng kiểm soát lỗi.

Robust

Java mạnh mẽ ở chỗ quản lý bộ nhớ tự động, cơ chế xử lý ngoại lệ và kiểm tra lỗi nghiêm ngặt.

Portable

Bytecode đã biên dịch của java có thể mang đi nhiều nền tảng khác nhau mà vẫn chạy tốt, do đó java có tính khả chuyển (portable).

2. Java concepts

a. Components

Java platform

Platform (nền tảng) là một loại phần cứng hay phần mềm có thể thực hiện chức năng chạy chương trình.

Như vậy, java platform là nền tảng cho phép chạy các chương trình java trên nó. Java platform bao gồm các thư viện, trình biên dịch và nhiều công cụ hỗ trợ khác trong việc chạy chương trình.

Java Virtual Machine (JVM)

Java Virtual Machine (JVM) là chương trình chuẩn bị môi trường thực thi cho ứng dụng Java. Có thể xem nó như một máy ảo (trừu tượng) để chạy chương trình bên trong nó.

JVM có 4 chức năng:

  • Tải bytecode từ file .class lên bộ nhớ (class loader)
  • Xác minh bytecode hợp lệ (verifier)
  • Thông dịch bytecode thành mã máy (intepreter) và thực thi
  • Cung cấp môi trường thực thi

Java Runtime Environment (JRE)

Gồm JVM, các thư viện chạy và các chương trình hỗ trợ chạy ứng dụng viết bằng Java. Có thể so sánh nó với .NET framework cài trên máy tính.

JRE dành cho người dùng, được yêu cầu nếu muốn chạy ứng dụng viết bằng java. Nếu không có JRE thì không chạy được.

Java Development Kit (JDK)

Gồm JRE và các công cụ lập trình java (trình biên dịch, thông dịch, lưu trữ, docs,…). Đây là bộ công cụ dành cho lập trình viên, để viết ra các chương trình java.

Garbage collection (GC)

Một thành phần của JVM, dùng thu gom các vùng nhớ không còn dùng và trả lại cho HĐH, giúp tiết kiệm bộ nhớ.

b. IDE

Nên chọn Eclipse khi mới học Java vì nó đơn giản, nhẹ và tiện lợi. Các IDE khác như NetBean hay IntelliJ IDEA nặng hơn và khó cấu hình, chỉ thích hợp với các project phức tạp.

Link https://www.eclipse.org/downloads.

c. Build commands

Tuy các IDE hỗ trợ build và chạy chương trình, hoặc có các build tools như Maven hay Grade, bạn cũng nên biết cách biên dịch thủ công bằng command line.

Biên dịch file Test.java thành Test.class chứa bytecode.

Thực thi bytecode trong file Test.class và chạy chương trình. Lưu ý không cần thêm đuôi .class vào tên file.

Chương trình javac.exe có trong JDK (lập trình viên), và java.exe có trong JRE và JDK (vì JDK có chứa JRE).

d. Naming conventions

Để code java được rõ ràng, dễ đọc và thống nhất hơn, nên tuân thủ một số quy ước đặt tên (naming convention) được quy định trong java. Điều này không bắt buộc, nhưng được khuyến khích để viết code clean hơn.

Các naming conventions cơ bản:

  • Lower case: toàn bộ chữ thường java.util
  • Snake case: chữ thường toàn bộ, giữa các từ có dấu underscore your_name
  • Pascal case: viết hoa chữ cái đầu mỗi từ, còn lại viết thường PascalCase
  • Upper case: viết hoa toàn bộ, giữa các từ có underscore SQRT_2
  • Camel case (lạc đà): chữ cái đầu tiên viết thường, từ thứ 2 trở đi chữ đầu từ viết hoa, còn lại viết thường yourName, myRedCar

Các đối tượng khác nhau có quy ước đặt tên riêng:

  • Tên package: Lower case hoặc snake case java.util
  • Tên class: Pascal case, là danh từ MyClass
  • Tên interface: Pascal case, là tính từ Flyable
  • Tên object: Camel case obj, otherObject
  • Tên biến: Camel case hoặc snake case myName, your_name
  • Tên hằng: Upper case PI_NUMBER
  • Tên method: Camel case, bắt đầu là động từ getName, toString

B. Java basic

1. Java basic

a. Simple program

Cấu trúc một chương trình Java cơ bản.

Source code lưu trữ trong file Test.java, Test là tên chương trình và giống với tên của public class (có phân biệt hoa thường). Chú ý tên public class phải giống tên file cộng thêm đuôi .java.

Với mỗi chương trình java, cần có một public class có tên trùng với tên file như trên, các class khác, trong các file khác nếu có thì chỉ được khai báo là class thôi.

Bên trong public class thì có một method public static void main(). Method này nhận mảng các String làm tham số dòng lệnh args (command line parameters).

b. Comment

Có 2 loại comment trong java:

  • Single line comment: Từ hai dấu // trở đi tới cuối dòng là comment
  • Block comment: bao một đoạn code trong cặp /* */

Comment bị bỏ qua khi biên dịch.

c. Import

Dùng từ khóa import để import một hoặc nhiều class vào chương trình:

Nếu không import như trên thì trong chương trình khi muốn sử dụng cần chỉ định rõ package.class, ví dụ như java.util.Scanner sc = new java.util.Scanner() thay vì import sẽ dùng Scanner sc = new Scanner().

d. Variables & constants

Variables

Biến trong JS có ba loại, mỗi loại có một vị trí riêng:

  • Biến thực thể (instance variable): nằm trong class, không thuộc method nào. Biến này thuộc về các thực thể (object) được tạo ra từ class.
  • Biến tĩnh (static variable): nằm trong class, không thuộc method nào, nhưng có từ khóa static chỉ định biến thuộc về class, không phải object.
  • Biến cục bộ (local variable): được khai báo trong method.

Khai báo biến trong java tương tự C++. Có thể khai báo không khởi tạo giá trị ban đầu, có thể khai báo nhiều biến cùng lúc.

Constants

Khai báo hằng trước đây trong java dùng const, nhưng được thay thế bằng từ khóa final.

Biến có thể gán giá trị mới, trong khi hằng thì không, và hằng yêu cầu phải có giá trị khởi tạo khi khai báo.

Vị trí khai báo

Như đã nói ở trên, từng vị trí khai báo khác nhau thì biến, hằng sẽ có ý nghĩa khác nhau. Bên dưới là code tóm tắt.

e. Input & output

Output

Dùng các lệnh nhóm System.out.print() để xuất output ra màn hình console (của cmd hoặc eclipse).

Các lệnh trên chỉ nhận một tham số đầu tiên là string, đối với printf() thì tham số sau là những giá trị truyền vào. Do đó, viết như sau là sai.

Mà phải dùng phép nối chuỗi +, java sẽ tự động convert sang string và đúng.

Ngoài output stream là System.out còn có System.err tương tự, nhưng chỉ dùng xuất các lỗi ra màn hình. Console trong eclipse sẽ hiển thị các văn bản xuất ra từ System.err với màu đỏ.

Input

Để nhập dữ liệu, sử dụng lớp java.util.Scanner để nhập. Có hai lưu ý khi sử dụng lớp này để tránh lỗi không mong muốn:

  • Nên dùng một object Scanner duy nhất cho toàn bộ chương trình. Hai scanner cùng truy cập tới System.in stream thì sẽ gây xung đột (ngay cả khi một scanner đã đóng).
  • Khi dùng scanner xong cần gọi method close() để đóng input stream lại.

Để đọc dữ liệu bằng scanner, dùng các method dạng next_() khác nhau, tùy loại dữ liệu.

Chú ý quan trọng, sau khi dùng các hàm như nextInt(), nextFloat() thì nên dùng thêm một lệnh nextLine() ngay phía sau để xóa kí tự n thừa trong bộ đệm. Các hàm trên kia chỉ lấy số, nên bỏ lại kí tự n, sẽ làm lệnh nextLine() nhập chuỗi bị trôi đi (kết quả chuỗi rỗng, nó chạy luôn mà không đợi nhập).

Với code trên, nếu bỏ đi hai dòng input.nextLine() thì lệnh nhập chuỗi sẽ bị trôi đi, không đợi người dùng nhập.

2. Data types

a. Primitive types

Những kiểu dữ liệu nguyên thủy (primitive) trong java như sau.

TypeSize
boolean1 bit
char2 bytes
byte1 byte
short2 bytes
int4 bytes
long8 bytes
float4 bytes
double8 bytes

Các kiểu nguyên thủy là chữ thường toàn bộ.

Một số chú ý về kiểu dữ liệu:

  • Số trong java luôn là signed (có dấu)
  • Các value số thực có thể viết dạng khoa học
  • Đối với số thực float, cần chỉ rõ hậu tố f ví dụ như float a = 3.14f. Mặc định java hiểu một giá trị thực là double, nên sẽ có báo lỗi khi ép kiểu, do đó cần chỉ định rõ bằng hậu tố sau giá trị như trên.
  • Char trong java có hỗ trợ escape sequense (ví dụ n, t,…)
  • Kí tự nằm trong dấu nháy đơn '', còn string trong nháy kép ""

Đặc biệt, kiểu String vừa là primitive vừa là object type.

b. Operators

The same C++ operators

Toán tử trong java tương tự như C++, và được tóm gọn như bên dưới.

Khác biệt giữa >>>>> là cách điền số vào chỗ trống thừa bên trái. >> điền bit đúng với dấu hiện tại, còn >>> luôn luôn điền 0 vào.

c. Math class

Java có nhiều hàm toán học thông dụng trong lớp java.lang.Math dạng các static method. Bên cạnh đó lớp này cũng chứa các hằng số static như pi, e,…

d. Type casting

Dùng chuyển đổi từ kiểu dữ liệu này sang kiểu khác. Bên dưới là so sánh đơn giản độ lớn của các kiểu số (cả nguyên và thực).

byte < short < int < long < float < double

Theo sự so sánh trên, chúng ta có hai loại ép kiểu (type casting):

  • Từ kiểu nhỏ sang lớn (widening casting – ép kiểu mở rộng): hay còn gọi là ép kiểu ngầm định (implicit casting), java tự động ép kiểu cho phù hợp
  • Từ kiểu lớn xuống nhỏ (narrowing casting – ép kiểu thu nhỏ): hay còn gọi là ép kiểu tường minh (explicit casting). Vì nó không an toàn nên java không tự động mà bạn phải ép kiểu thủ công.

Narrowing casting không an toàn vì từ kiểu lớn ép xuống kiểu nhỏ có thể gây mất dữ liệu và dẫn tới dữ liệu không chính xác.

Code sau minh họa hai dạng ép kiểu trên.

Cú pháp ép kiểu này cũng được dùng cho các class và object, gọi là up casting và down casting, sẽ được bàn sau.

3. Basic commands

a. Conditional statement

If else statement

Lệnh điều kiện trong Java tương tự C++, nó sẽ check điều kiện, đúng thực hiện lệnh, còn không thì thực hiện trong else (nếu có) và đi tiếp.

Điều kiện có thể là bất kì thứ gì trả về boolean, như biến boolea, phép so sánh, biểu thức logic,…

Nếu có từ 2 lệnh trở nên cần thực hiện bao nó trong cặp {}.

Các khối if else có thể lồng nhau (nested) (nên đặt {} cho rõ ràng) hoặc liên tiếp nhau.

Ternary operator

Một cách khác để thực hiện check điều kiện và trả về giá trị là dùng ternary operator. Các ternary operator có thể liên tiếp nhau như trên.

Chú ý, ternary operator không hỗ trợ chọn lệnh thực hiện, mà chỉ chọn một trong hai kết quả để trả về, như ví dụ sau.

Switch case

Java cũng hỗ trợ switch case statement để chia nhiều nhánh hơn, xử lý nhiều trường hợp hơn thay vì dùng nhiều if else nối tiếp. Tuy nhiên switch case chỉ so sánh bằng, không dùng các phép so sánh khác được.

Khối lệnh gồm biểu thức dùng so sánh với các case, nếu khớp với case nào thì lệnh trong nhóm case đó sẽ được thực thi.

Sau mỗi case nên có lệnh break để ngắt, nếu không nó sẽ chạy sang nhóm case tiếp theo mà không cần điều kiện.

Default là khối lệnh sẽ chạy khi không có bất kì case nào ở trên khớp. Khối default có thể bỏ qua.

b. Looping

Vòng lặp của java y hệt C++, nên mình sẽ không nói nhiều ở đây.

While loop

Kiểm tra điều kiện, nếu đúng thì thực hiện lệnh và quay lại kiểm tra tiếp. Cứ như vậy cho tới khi điều kiện sai thì thoát.

Do while loop

Thực hiện lệnh rồi kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện lại lần nữa và kiểm tra tiếp. Cứ thế cho tới khi điều kiện sai thì dừng.

Do while hơi ngược với while chút xíu, là do while thực hiện lệnh ít nhất một lần, còn while có thể không thực hiện lần nào. Đó là do thứ tự giữa kiểm tra điều kiện và thực thi lệnh của hai vòng lặp này khác nhau.

Luôn kiểm tra vực sâu trước khi chạy! – Coder

Trọng lực sẽ không tồn tại nếu bạn không nhìn xuống – Cartooner

For loop

Lệnh for gồm 3 phần trong ngoặc tròn:

  • Phần đầu là khởi tạo giá trị biến, chỉ được gọi 1 lần đầu tiên
  • Phần 2 là điều kiện tiếp tục, điều kiện này được kiểm tra mỗi lần lặp, xem có tiếp tục lặp hay dừng.
  • Phần 3 là tăng giảm biến đếm, để tránh lặp vô tận. Phần này được thực hiện cuối cùng mỗi lần lặp, sau cả khi thực hiện lệnh.

Foreach

Thường gọi là lặp for each nhưng vẫn dùng từ khóa for nhưng theo cú pháp khác.

Lặp qua từng element của một iterable object (mảng, chuỗi, collection,…). Với mỗi lần lặp thì element lần lượt là từng element.

Break, continue

Hai từ khóa breakcontinue thường dùng trong vòng lặp:

  • break để dừng luôn vòng lặp đang dang dở
  • continue dừng lần lặp hiện tại và nhảy tiếp qua lần lặp tiếp theo

c. Label, goto

Không dùng nữa vì gây rối logic code.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo