Tổng quan
Nội dung chính
- Biến và phương thức tĩnh (Static)
- Kế thừa trong Java
- Đa hình (Polymorphism)
- Keyword final
- Lớp trừu tượng (Abstract class)
- Giao diện (Interface)
Biến và phương thức tĩnh (Static)
2.1 Biến tĩnh (Static Variables)
Trong Java, các biến thành viên được phân loại dựa trên việc có sử dụng từ khóa
static hay không:
- Biến lớp (Class variables): Có từ khóa
static, chia sẻ giữa tất cả các thể hiện của lớp
- Biến thể hiện (Instance variables): Không có từ khóa
static, riêng biệt cho mỗi thể hiện
Ví dụ minh họa:
public class UserAccount {
public static int totalUsers = 0; // Biến tĩnh
public String username; // Biến thể hiện
public UserAccount(String name) {
this.username = name;
UserAccount.totalUsers++; // Tăng số lượng người dùng
}
}
2.2 Phương thức tĩnh (Static Methods)
Phương thức tĩnh thuộc về lớp chứ không phải thể hiện cụ thể:
public class MathUtils {
public static double calculateCircleArea(double radius) {
return Math.PI * radius * radius;
}
public void displayMessage() { // Phương thức thể hiện
System.out.println("Đây là phương thức thể hiện");
}
}
2.3 Lớp tiện ích (Utility Classes)
Lớp chỉ chứa các phương thức tĩnh thường được gọi là lớp tiện ích:
public class ValidationUtils {
private ValidationUtils() { // Ngăn chặn khởi tạo thể hiện
}
public static boolean isValidEmail(String email) {
return email != null && email.contains("@");
}
public static String generateRandomId() {
Random random = new Random();
return String.valueOf(random.nextInt(100000));
}
}
2.4 Chú ý khi sử dụng Static
- Phương thức tĩnh không thể truy cập trực tiếp các biến/thể hiện phương thức không tĩnh
- Không thể sử dụng từ khóa
this trong phương thức tĩnh
- Phương thức tĩnh có thể truy cập các thành viên tĩnh khác trong cùng lớp
2.5 Khối mã tĩnh (Static Blocks)
Khối mã tĩnh được thực thi khi lớp được tải vào bộ nhớ:
public class DatabaseConfig {
static String connectionString;
static {
connectionString = "jdbc:mysql://localhost:3306/mydb";
System.out.println("Cấu hình cơ sở dữ liệu đã được khởi tạo");
}
}
Kế thừa (Inheritance)
3.1 Giới thiệu kế thừa
Kế thừa cho phép một lớp con nhận các thuộc tính và phương thức từ lớp cha:
public class Vehicle {
protected String brand;
protected int year;
public void startEngine() {
System.out.println("Động cơ đang khởi động...");
}
}
public class Car extends Vehicle {
private int doors;
public void openDoors() {
System.out.println("Mở " + doors + " cửa xe");
}
}
3.2 Quyền truy cập (Access Modifiers)
private: Chỉ có thể truy cập trong cùng lớp
default: Truy cập trong cùng gói
protected: Truy cập trong cùng gói hoặc lớp con
public: Truy cập ở mọi nơi
3.3 Ghi đè phương thức (Method Overriding)
Lớp con có thể ghi đè phương thức của lớp cha:
public class Animal {
public void makeSound() {
System.out.println("Động vật phát ra âm thanh");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Chó sủa gâu gâu");
}
}
3.4 Nguyên tắc đơn kế thừa
Java chỉ hỗ trợ đơn kế thừa (một lớp chỉ có thể kế thừa từ một lớp cha), nhưng có thể kế thừa nhiều cấp.
Đa hình (Polymorphism)
4.1 Khái niệm đa hình
Đa hình cho phép một tham chiếu có thể trỏ đến các đối tượng khác nhau của các lớp con:
public class Shape {
public void draw() {
System.out.println("Vẽ hình dạng");
}
}
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Vẽ hình tròn");
}
}
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Vẽ hình chữ nhật");
}
}
// Sử dụng đa hình
Shape shape1 = new Circle();
Shape shape2 = new Rectangle();
shape1.draw(); // In ra: Vẽ hình tròn
shape2.draw(); // In ra: Vẽ hình chữ nhật
4.2 Ép kiểu (Type Casting)
Trong môi trường đa hình, có thể cần ép kiểu để truy cập các phương thức cụ thể của lớp con:
if (shape instanceof Circle) {
Circle circle = (Circle) shape;
circle.calculateArea();
}
Keyword Final
5.1 Các ứng dụng của Final
final class: Lớp không thể bị kế thừa
final method: Phương thức không thể bị ghi đè
final variable: Biến không thể thay đổi giá trị sau khi khởi tạo
5.2 Hằng số (Constants)
Kết hợp
static và
final để tạo hằng số:
public class Constants {
public static final String APP_NAME = "Ứng dụng mẫu";
public static final int MAX_CONNECTIONS = 100;
}
Lớp trừu tượng (Abstract Class)
6.1 Khái niệm lớp trừu tượng
Lớp trừu tượng có thể chứa cả phương thức trừu tượng và phương thức cụ thể:
public abstract class Employee {
protected String name;
protected double salary;
public abstract void calculateSalary(); // Phương thức trừu tượng
public void displayInfo() { // Phương thức cụ thể
System.out.println("Tên nhân viên: " + name);
}
}
public class FullTimeEmployee extends Employee {
@Override
public void calculateSalary() {
// Tính lương nhân viên toàn thời gian
this.salary = 5000000;
}
}
6.2 Mẫu phương pháp (Template Method Pattern)
Sử dụng lớp trừu tượng để định nghĩa khung chương trình:
public abstract class ReportGenerator {
public final void generateReport() {
prepareData();
createHeader();
writeContent();
createFooter();
}
protected abstract void writeContent();
private void prepareData() {
System.out.println("Chuẩn bị dữ liệu báo cáo");
}
private void createHeader() {
System.out.println("Tạo tiêu đề báo cáo");
}
private void createFooter() {
System.out.println("Tạo chân trang báo cáo");
}
}
Giao diện (Interface)
7.1 Khai báo giao diện
Giao diện định nghĩa tập hợp các phương thức mà lớp triển khai phải cung cấp:
public interface PaymentProcessor {
void processPayment(double amount);
boolean validateCard(String cardNumber);
}
public interface RefundProcessor {
void processRefund(double amount);
}
7.2 Triển khai nhiều giao diện
Một lớp có thể triển khai nhiều giao diện:
public class PaymentService implements PaymentProcessor, RefundProcessor {
@Override
public void processPayment(double amount) {
System.out.println("Xử lý thanh toán: " + amount);
}
@Override
public boolean validateCard(String cardNumber) {
return cardNumber != null && cardNumber.length() == 16;
}
@Override
public void processRefund(double amount) {
System.out.println("Xử lý hoàn tiền: " + amount);
}
}
7.3 Tính năng mới từ JDK 8+
- Phương thức mặc định (Default methods): Có thể có thân phương thức
- Phương thức tĩnh (Static methods): Được gọi qua tên giao diện
- Phương thức private: Hỗ trợ từ JDK 9+
public interface Calculator {
void performCalculation();
default void displayResult() {
System.out.println("Hiển thị kết quả");
}
static void initializeCalculator() {
System.out.println("Khởi tạo máy tính");
}
}