Menu

Cú pháp Java cơ bản: lớp, phương thức, câu lệnh, dấu ngoặc

Hình hài của một chương trình Java: phương thức main, câu lệnh và dấu chấm phẩy, khối lệnh và dấu ngoặc nhọn, cùng các quy tắc trình biên dịch kiểm tra trước khi code chạy.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Một chương trình Java trông như thế nào

Ở trang trước, bạn đã chạy được Java. Giờ hãy xem bản thân đoạn code được tạo nên từ những gì. Java chặt chẽ và tường minh: mọi chương trình đều phải theo một khuôn cố định, và trình biên dịch kiểm tra khuôn đó trước khi bất kỳ dòng nào được thực thi.

Đây là chương trình Java hoàn chỉnh nhỏ nhất. Chạy thử nhé:

Khá nhiều chữ chỉ để in một dòng, và khác với Python hay JavaScript, bạn không bỏ được chữ nào. Phần nào cũng bắt buộc, nên rất đáng để hiểu từng phần làm gì. Chúng ta sẽ tháo nó ra, đi từ ngoài vào trong.

Mọi thứ nằm trong một lớp

Java không có code "rời rạc" nằm ở cấp cao nhất của tệp. Mọi đoạn code đều nằm trong một lớp (class), được khai báo bằng từ khóa class và một cái tên:

public class Main {
    // everything goes in here
}

Dấu { mở và dấu } đóng tương ứng đánh dấu phần thân của lớp. Tên Main do bạn chọn, với một quy tắc quan trọng: trong một tệp .java thông thường, lớp public phải trùng tên chính xác với tên tệp. public class Main phải nằm trong Main.java. Viết sai chữ hoa chữ thường là trình biên dịch từ chối build.

Bạn sẽ học lớp thực sự là gì trong chương Lớp. Hiện tại, cứ coi public class Main { ... } là lớp vỏ bắt buộc bao quanh code của bạn.

Phương thức main là vạch xuất phát

Khi bạn chạy một chương trình Java, môi trường chạy tìm một phương thức cụ thể để bắt đầu thực thi:

public static void main(String[] args) {
    // your code starts here
}

Chữ ký này không thể thay đổi. Mỗi từ có một nhiệm vụ:

  • public: môi trường chạy có thể truy cập nó từ bên ngoài lớp.
  • static: nó chạy mà không cần tạo đối tượng của lớp trước.
  • void: nó không trả về gì khi kết thúc.
  • main: đúng cái tên mà môi trường chạy tìm kiếm.
  • String[] args: một mảng chứa các đối số dòng lệnh truyền vào chương trình.

Chỉ cần sai một từ, như Static thay cho static hay String args thay cho String[] args, code của bạn có thể vẫn biên dịch được, nhưng khi khởi chạy sẽ báo Error: Main method not found in class Main. Thông báo này gần như luôn có nghĩa là dòng này bị gõ sai.

Câu lệnh kết thúc bằng dấu chấm phẩy

Một câu lệnh (statement) là một chỉ thị hoàn chỉnh. Trong Java, mọi câu lệnh kết thúc bằng dấu chấm phẩy ;. Trình biên dịch dựa vào dấu chấm phẩy để biết chỉ thị này dừng ở đâu và chỉ thị tiếp theo bắt đầu ở đâu; việc xuống dòng không có ý nghĩa gì với nó.

Vì ngắt dòng bị bỏ qua, cả ba câu lệnh có thể nằm trên một dòng mà vẫn chạy được, dù chẳng ai viết Java kiểu đó:

int score = 90; score = score + 5; System.out.println(score);

Quên dấu chấm phẩy là trình biên dịch chặn bạn lại trước khi chương trình chạy:

int score = 90
System.out.println(score);
error: ';' expected
        int score = 90
                      ^

Thiếu dấu chấm phẩy là lỗi biên dịch bạn sẽ gặp nhiều nhất khi mới học. Khi trình biên dịch chỉ vào một dòng, hãy kiểm tra cả dòng phía trên: chỗ bị thiếu thật sự thường nằm ở đó.

Khối lệnh và dấu ngoặc nhọn

Dấu ngoặc nhọn { } nhóm các câu lệnh thành một khối lệnh (block). Thân lớp là một khối, thân phương thức là một khối, và thân của if hay vòng lặp cũng là một khối. Các khối có thể lồng nhau:

Hãy để ý điểm khác với câu lệnh: dòng mở một khối kết thúc bằng {, không phải dấu chấm phẩy, và bạn không đặt dấu chấm phẩy sau dấu } đóng của phương thức, lớp, if hay vòng lặp. Nhầm lẫn chỗ này là lỗi kinh điển của người mới:

public static void main(String[] args) {
    System.out.println("hi");
}; // <- this semicolon is unnecessary (and after a class/method, wrong)

Thụt lề trong các ví dụ hoàn toàn là để con người đọc. Java bỏ qua nó, nhưng thụt lề nhất quán giúp bạn và mọi người biết dấu { nào khớp với dấu } nào. Cứ để trình soạn thảo tự thụt lề, các dấu ngoặc sẽ tự thẳng hàng.

Java phân biệt chữ hoa chữ thường

Java coi chữ hoa và chữ thường là hoàn toàn khác nhau. score, Score và SCORE là ba tên riêng biệt. Điều này cũng áp dụng cho từ khóa và các tên có sẵn:

Nếu bạn viết system.out.println (chữ s thường) hoặc khai báo String Name rồi lại dùng name, trình biên dịch sẽ từ chối. Một vài tên mà người mới hay viết sai chữ hoa:

  • System: chữ S hoa. system.out.println(...) sẽ không biên dịch được.
  • String: chữ S hoa. Đây là một lớp, khác với các kiểu nguyên thủy viết thường.
  • void, int, public, static: đều viết thường. Chúng là từ khóa.

Phần lớn lỗi "cannot find symbol" bắt nguồn từ một chỗ sai chữ hoa chữ thường. Thông báo lỗi còn cho biết ký hiệu nào không tìm thấy: hãy so cách viết hoa của nó với những gì bạn đã gõ.

Ghép các phần lại với nhau

Đây là một chương trình lớn hơn một chút, dùng mọi thứ trong trang này: một lớp, phương thức main, vài câu lệnh, một khối lồng nhau và cách viết hoa nhất quán:

Đọc từ trên xuống: lớp bao bọc mọi thứ, main là nơi bắt đầu thực thi, mỗi chỉ thị kết thúc bằng ;, thân của if nằm trong khối riêng, và mọi tên có sẵn đều được viết hoa đúng. Đó chính là bộ khung của hầu hết mọi chương trình Java bạn sẽ viết.

Tiếp theo: chú thích

Giờ bạn đã đọc được cấu trúc của một tệp Java. Thứ tiếp theo cần thêm là ghi chú cho con người, phần văn bản mà trình biên dịch bỏ qua hoàn toàn. Trang tiếp theo nói về chú thích (comment): dạng một dòng //, dạng khối /* */, và khi nào một chú thích thực sự đáng có mặt trong code.

Câu hỏi thường gặp

Cú pháp cơ bản của một chương trình Java là gì?

Mọi chương trình Java đều nằm trong một lớp, và chương trình bắt đầu chạy từ phương thức có chữ ký chính xác public static void main(String[] args). Mỗi câu lệnh kết thúc bằng dấu chấm phẩy, và các khối code được nhóm bằng dấu ngoặc nhọn { }. Chương trình nhỏ nhất là public class Main { public static void main(String[] args) { System.out.println("Hi"); } }.

Vì sao Java cần public static void main(String[] args)?

Đó chính là điểm bắt đầu (entry point) mà môi trường chạy Java tìm kiếm. public cho phép môi trường chạy gọi nó từ bên ngoài, static nghĩa là nó chạy mà không cần tạo đối tượng trước, void nghĩa là nó không trả về gì, còn String[] args nhận các đối số dòng lệnh. Chỉ cần đổi một từ, kể cả chữ hoa chữ thường, chương trình vẫn biên dịch được nhưng không khởi chạy, với thông báo Error: Main method not found.

Mọi câu lệnh Java đều cần dấu chấm phẩy?

Mọi câu lệnh đều kết thúc bằng dấu chấm phẩy: khai báo biến, phép gán, lời gọi phương thức. Nhưng những dòng mở một khối (if, for, while, phần đầu của lớp hay phương thức) kết thúc bằng {, và bạn không đặt dấu chấm phẩy sau dấu } đóng các khối đó. Quên dấu chấm phẩy là lỗi biên dịch phổ biến nhất của người mới học Java.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu