Từ khóa và định nghĩa phạm vi
Khi xây dựng ứng dụng Java, việc hiểu rõ bảng từ khóa quy định hành vi lớp và đối tượng là bắt buộc. Các modifier kiểm soát truy cập bao gồm private, protected, public và default. Các từ khóa định hình cấu trúc chương trình gồm class, interface, extends, implements. Những công cụ điều khiển vòng đời và trạng thái dữ liệu bao gồm static, final, abstract, native, cùng toán tử new để cấp phát bộ nhớ.
Kiểu dữ liệu nguyên thủy (Primitive Types)
Ngôn ngữ này hỗ trợ tám kiểu dữ liệu cốt lõi phục vụ xử lý số học, ký tự và logic. Nhóm số nguyên gồm byte (8-bit), short (16-bit), int (32-bit), long (64-bit). Nhóm số thực gồm float (32-bit) và double (64-bit). Ngoài ra còn có char (16-bit Unicode) biểu diễn ký tự, và boolean lưu trữ trạng thái đúng/sai. Lưu ý String không thuộc nhóm primitive mà là object tham chiếu.
public class CoreConceptsDemo {
public static void main(String[] args) {
int priority = 5;
float voltage = 3.3f;
char unit = 'Ω';
String protocol = "TCP/IP";
System.out.println(protocol);
}
}
Chuyển đổi kiểu dữ liệu (Type Casting)
Ep kiểu tường minh (explicit casting) đặt tên kiểu dữ liệu mục tiêu trước biến nguồn, thường dùng khi giảm kích thước lưu trữ nhưng tiềm ẩn rủi ro mất精度. Ep kiểu ngầm định (implicit casting) tự động xảy ra khi gán giá trị từ kiểu nhỏ sang kiểu lớn hơn mà không làm mất thông tin.
public class CoreConceptsDemo {
public static void main(String[] args) {
char hexValue = 'F';
System.out.println((int) hexValue);
char base = '@';
int expanded = base + 20;
System.out.println(expanded);
}
}
Phạm vi biến (Variable Scope)
Biến cục bộ (Local Variable) khai báo bên trong thân phương thức hoặc khối lệnh, tồn tại trên ngăn xếp khi khối đó thực thi và bị thu hồi ngay sau đó. Bắt buộc phải khởi tạo giá trị trước khi đọc. Biến thể hiện (Instance Variable) khai báo ở cấp lớp nhưng nằm ngoài mọi hàm, thuộc về từng thể thao đối tượng, chịu ảnh hưởng của modifier và nhận giá trị mặc định do runtime cung cấp nếu chưa gán.
Toán tử cơ bản
- Dịch bit phải (
>>): dời các bit xuống theo số vị trí chỉ định. - Logic rút gọn (
&&): dừng đánh giá ngay khi toán hạng trái trả vềfalse. - Toán tử ba ngôi (
? :): cú pháp compact cho câu lệnh điều kiện if-else. - So sánh kiểu (
instanceof): kiểm tra xem tham chiếu có thuộc lớp hoặc interface cụ thể nào hay không, trả về giá trị boolean.
public class CoreConceptsDemo {
public static void main(String[] args) {
int mask = 32;
System.out.println(mask >> 3);
int threshold = 25;
boolean isValid = (threshold > 18) ? true : false;
System.out.println(isValid);
Object ref = "target";
boolean typeCheck = ref instanceof String;
System.out.println(typeCheck);
}
}
Xử lý số học và ký tự
Class Math đóng gói các hàm utility tính toán chuẩn hóa như tìm max/min, logarit, lũy thừa cơ số e, trị tuyệt đối, và hàm lượng giác radian. Class Character cung cấp bộ kiểm tra trạng thái ký tự như chữ thường, chữ hoa, chữ số, khoảng trắng hoặc ký tự điều khiển.
public class CoreConceptsDemo {
public static void main(String[] args) {
double a = 7.2, b = 4.8;
System.out.println(Math.round(a + b));
System.out.println(Math.log10(1000));
System.out.println(Math.exp(2));
System.out.println(Math.abs(-15));
char alpha = 'm';
char num = '7';
System.out.println(Character.isLetter(alpha));
System.out.println(Character.isDigit(num));
}
}
Lớp String và so sánh nội dung
Chuỗi trong Java là đối tượng bất biến (immutable). Hai cách khởi tạo phổ biến là gán trực tiếp từ constant pool và dùng constructor. Phép so sánh == kiểm tra địa chỉ tham chiếu đối tượng, trong khi .equals() so sánh dãy ký tự thực tế. Do đó, hai instance khác nhau nhưng chứa cùng văn bản sẽ trả về true khi dùng equals.
public class CoreConceptsDemo {
public static void main(String[] args) {
String routeA = "/api/v2/users";
String routeB = "/api/v2/users";
String routeC = new String("/api/v2/users");
System.out.println(routeA.length());
System.out.println(routeA.substring(5, 11));
System.out.println(routeA == routeB);
System.out.println(routeB == routeC);
System.out.println(routeA.equals(routeC));
}
}
Chuỗi khả biến StringBuffer
Khác với String, StringBuffer cho phép chỉnh sửa nội dung tại chỗ, tối ưu hiệu năng khi thực hiện nhiều thao tác nối/xóa. Các hàm chủ lực bao gồm append, delete, reverse, và indexOf để tra cứu vị trí con chuỗi.
public class CoreConceptsDemo {
public static void main(String[] args) {
StringBuffer payload = new StringBuffer("Init Module");
payload.append("-Loaded");
payload.reverse();
System.out.println(payload);
payload.reverse();
int locate = payload.indexOf("Module");
System.out.println("Độ lệch ký tự: " + locate);
}
}
Mảng một chiều và sắp xếp
Mảng trong Java là đối tượng lưu trữ tập hợp phần tử cùng kiểu. Có thể khai báo với kích thước cố định rồi gán vòng lặp, hoặc khởi tạo trực tiếp danh sách giá trị. Thuật toán sắp xếp nhanh nội tại được cung cấp bởi Arrays.sort() thay vì tự viết thuật toán Bubble/Quick sort thủ công.
import java.util.Arrays;
public class CoreConceptsDemo {
public static void main(String[] args) {
int[] buffer = new int[6];
for (int i = 0; i < buffer.length; i++) {
buffer[i] = (i + 1) * 5;
}
int[] weights = {45, 12, 88, 33, 67};
Arrays.sort(weights);
System.out.println(Arrays.toString(weights));
}
}
Kế thừa (Inheritance)
Sử dụng từ khóa extends để thiết lập mối quan hệ cha-con. Hệ thống chỉ hỗ trợ thừa kế đơn (một lớp con chỉ được mở rộng từ một lớp cha). Lớp dẫn xuất kế thừa toàn bộ member không phải private của lớp cơ sở. Việc định nghĩa getter/setter hoặc setter chung trong lớp cha giúp giảm code trùng lặp.
class Vehicle {
int wheels;
String model;
void configure(int w, String m) {
this.wheels = w;
this.model = m;
}
}
class Truck extends Vehicle {}
class Sedan extends Vehicle {}
public class CoreConceptsDemo {
public static void main(String[] args) {
Vehicle car = new Vehicle();
car.configure(4, "Electric");
Truck rig = new Truck();
rig.configure(8, "Heavy Duty");
}
}
Ghi đè phương thức (Method Overriding)
Khi lớp con định nghĩa lại phương thức đã có ở lớp cha với cùng tên và signature tham số, hành vi mặc định bị thay thế Runtime polymorphism. Quy tắc nghiêm ngặt: quyền truy cập không được thu hẹp hơn lớp cha. Khối lệnh super.method() cho phép gọi phiên bản gốc của lớp cơ sở từ bên trong lớp con.
class Device {
public void boot() {
System.out.println("System initializing.");
}
}
class Router extends Device {
@Override
public void boot() {
System.out.println("Loading network stack.");
super.boot();
}
}
class Switch extends Device {
@Override
public void boot() {
System.out.println("Port scanning started.");
}
}
public class CoreConceptsDemo {
public static void main(String[] args) {
Device base = new Device();
Router rtr = new Router();
base.boot();
rtr.boot();
}
}
Nạp chồng phương thức (Method Overloading)
Nạp chồng cho phép nhiều phương thức chia sẻ cùng tên nhưng khác biệt về signature (danh sách tham số về số lượng hoặc kiểu dữ liệu). Hệ thống compiler sẽ quyết định phương thức nào sẽ được gọi dựa trên arguments truyền vào tại thời điểm compile. Trả về kiểu dữ liệu khác nhau hoặc access modifier khác nhau không đủ điều kiện để phân biệt overload. Phương thức có thể được định nghĩa trong cùng class hoặc kế thừa từ class mẹ.
class Processor {
int execute(int x, int y) { return x + y; }
double execute(double x, double y) { return x + y; }
long execute(long x, long y, long z) { return x + y + z; }
}
public class CoreConceptsDemo {
public static void main(String[] args) {
Processor p = new Processor();
System.out.println(p.execute(10, 20));
System.out.println(p.execute(3.14, 2.71));
System.out.println(p.execute(100L, 200L, 50L));
}
}
Lớp trừu tượng (Abstract Class)
Được khai báo với modifier abstract, lớp này không thể instantiate trực tiếp bằng toán tử new. Chức năng chính là đóng vai trò template định nghĩa các contract phương thức abstract mà lớp dẫn xuất bắt buộc phải triển khai implementation cụ thể. Thông thường, lớp gốc trong hệ thống phân cấp thừa kế sẽ mang modifier này để chuẩn hóa giao diện trước khi các lớp nhánh mở rộng logic.