Chuyển tới nội dung chính

Định Nghĩa Phương Thức trong Java 🎯

🎯 Mục tiêu: Học cách định nghĩa và sử dụng phương thức trong Java một cách hiệu quả.

Giới thiệu 📝

Phương thức là một khối code có thể tái sử dụng, thực hiện một tác vụ cụ thể và có thể được gọi từ các phần khác của chương trình. Phương thức giúp code của bạn có tổ chức hơn, dễ bảo trì và tái sử dụng.

💡 Fun Fact: Phương thức trong Java tương tự như hàm trong các ngôn ngữ lập trình khác, nhưng chúng luôn nằm trong một lớp.

1. Cú Pháp Cơ Bản ⚡

Phương Thức Đơn Giản

public class Calculator {
// Phương thức không có tham số và không trả về giá trị
public void sayHello() {
System.out.println("Xin chào!");
}

// Phương thức có tham số và trả về giá trị
public int add(int a, int b) {
return a + b;
}
}

Các Thành Phần Của Phương Thức

  1. Modifier: public, private, protected, static, final
  2. Kiểu trả về: void, int, String, boolean, etc.
  3. Tên phương thức: sayHello, add, etc.
  4. Tham số: (int a, int b)
  5. Thân phương thức: Code trong dấu ngoặc nhọn {}

2. Các Loại Phương Thức 🔄

Phương Thức Instance

public class Student {
private String name;

// Phương thức instance
public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

Phương Thức Static

public class MathUtils {
// Phương thức static
public static double calculateAverage(double[] numbers) {
double sum = 0;
for (double num : numbers) {
sum += num;
}
return sum / numbers.length;
}
}

Phương Thức Final

public class Parent {
// Phương thức final không thể bị ghi đè
public final void display() {
System.out.println("Parent class");
}
}

3. Ví Dụ Thực Tế 🚀

Quản Lý Sản Phẩm

public class Product {
private String name;
private double price;
private int quantity;

// Constructor
public Product(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}

// Phương thức tính tổng giá trị
public double calculateTotalValue() {
return price * quantity;
}

// Phương thức kiểm tra còn hàng
public boolean isInStock() {
return quantity > 0;
}

// Phương thức cập nhật số lượng
public void updateQuantity(int newQuantity) {
if (newQuantity >= 0) {
this.quantity = newQuantity;
}
}
}

Xử Lý Chuỗi

public class StringProcessor {
// Phương thức đảo ngược chuỗi
public static String reverseString(String input) {
StringBuilder reversed = new StringBuilder();
for (int i = input.length() - 1; i >= 0; i--) {
reversed.append(input.charAt(i));
}
return reversed.toString();
}

// Phương thức đếm từ
public static int countWords(String text) {
String[] words = text.trim().split("\\s+");
return words.length;
}

// Phương thức kiểm tra palindrome
public static boolean isPalindrome(String text) {
String cleanText = text.toLowerCase().replaceAll("[^a-z0-9]", "");
return cleanText.equals(reverseString(cleanText));
}
}

Quản Lý Tài Khoản Ngân Hàng

public class BankAccount {
private String accountNumber;
private double balance;
private String ownerName;

// Constructor
public BankAccount(String accountNumber, String ownerName, double initialBalance) {
this.accountNumber = accountNumber;
this.ownerName = ownerName;
this.balance = initialBalance;
}

// Phương thức gửi tiền
public boolean deposit(double amount) {
if (amount > 0) {
balance += amount;
return true;
}
return false;
}

// Phương thức rút tiền
public boolean withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
return true;
}
return false;
}

// Phương thức chuyển khoản
public boolean transfer(BankAccount recipient, double amount) {
if (withdraw(amount)) {
return recipient.deposit(amount);
}
return false;
}

// Phương thức lấy thông tin tài khoản
public String getAccountInfo() {
return String.format("Tài khoản: %s\nChủ tài khoản: %s\nSố dư: %.2f",
accountNumber, ownerName, balance);
}
}

4. Best Practices ✅

  1. Đặt Tên Phương Thức Rõ Ràng

    // Không nên
    public void doStuff() {
    // Code
    }

    // Nên
    public void calculateTotalPrice() {
    // Code
    }
  2. Một Phương Thức, Một Nhiệm Vụ

    // Không nên
    public void processOrder() {
    validateOrder();
    calculatePrice();
    updateInventory();
    sendEmail();
    }

    // Nên
    public void processOrder() {
    if (validateOrder()) {
    double price = calculatePrice();
    updateInventory();
    sendConfirmationEmail();
    }
    }
  3. Sử Dụng Tham Số Thay Vì Biến Toàn Cục

    // Không nên
    private double total;
    public void addToTotal(double amount) {
    total += amount;
    }

    // Nên
    public double calculateTotal(double[] amounts) {
    double total = 0;
    for (double amount : amounts) {
    total += amount;
    }
    return total;
    }

5. Lỗi Thường Gặp ⚠️

  1. Quên Return Trong Phương Thức Có Kiểu Trả Về

    // Lỗi
    public int add(int a, int b) {
    // Quên return
    }

    // Đúng
    public int add(int a, int b) {
    return a + b;
    }
  2. Tham Số Không Khớp Kiểu

    // Lỗi
    public void processNumber(int number) {
    // Code
    }
    processNumber("123"); // Lỗi: String không thể chuyển thành int

    // Đúng
    processNumber(Integer.parseInt("123"));
  3. Phương Thức Static Gọi Phương Thức Instance

    // Lỗi
    public static void main(String[] args) {
    instanceMethod(); // Lỗi: không thể gọi trực tiếp
    }

    // Đúng
    public static void main(String[] args) {
    MyClass obj = new MyClass();
    obj.instanceMethod();
    }

💡 Lời khuyên: Hãy thực hành viết các phương thức với các chức năng khác nhau để hiểu rõ hơn về cách sử dụng chúng trong các tình huống thực tế.

Tiếp Theo 🎯

Trong các bài học tiếp theo, chúng ta sẽ:

  • Tìm hiểu về phương thức nạp chồng (Method Overloading)
  • Học cách ghi đè phương thức (Method Overriding)
  • Thực hành với constructor
  • Tìm hiểu về đệ quy (Recursion)