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

Nạp Chồng Phương Thức trong Java 🎯

🎯 Mục tiêu: Học cách sử dụng nạp chồng phương thức để tạo các phương thức có cùng tên nhưng khác nhau về tham số trong Java.

Giới thiệu 📝

Nạp chồng phương thức (Method Overloading) là một tính năng của Java cho phép định nghĩa nhiều phương thức có cùng tên nhưng khác nhau về số lượng hoặc kiểu dữ liệu của tham số. Điều này giúp code của bạn linh hoạt và dễ sử dụng hơn.

💡 Fun Fact: Nạp chồng phương thức là một dạng của tính đa hình (polymorphism) trong Java, cho phép một phương thức có nhiều cách sử dụng khác nhau.

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

Nạp Chồng Theo Số Lượng Tham Số

public class Calculator {
// Phương thức cộng hai số
public int add(int a, int b) {
return a + b;
}

// Nạp chồng với ba tham số
public int add(int a, int b, int c) {
return a + b + c;
}
}

Nạp Chồng Theo Kiểu Dữ Liệu

public class Printer {
// In số nguyên
public void print(int number) {
System.out.println("Số nguyên: " + number);
}

// In số thực
public void print(double number) {
System.out.println("Số thực: " + number);
}

// In chuỗi
public void print(String text) {
System.out.println("Chuỗi: " + text);
}
}

2. Các Loại Nạp Chồng 🔄

Nạp Chồng Constructor

public class Student {
private String name;
private int age;

// Constructor mặc định
public Student() {
this.name = "Chưa đặt tên";
this.age = 0;
}

// Constructor với tên
public Student(String name) {
this.name = name;
this.age = 0;
}

// Constructor đầy đủ
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}

Nạp Chồng Với Tham Số Tùy Chọn

public class Order {
private String productName;
private int quantity;
private String address;

// Đặt hàng với tên sản phẩm
public void placeOrder(String productName) {
this.productName = productName;
this.quantity = 1;
this.address = "Mặc định";
}

// Đặt hàng với số lượng
public void placeOrder(String productName, int quantity) {
this.productName = productName;
this.quantity = quantity;
this.address = "Mặc định";
}

// Đặt hàng đầy đủ thông tin
public void placeOrder(String productName, int quantity, String address) {
this.productName = productName;
this.quantity = quantity;
this.address = address;
}
}

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

Quản Lý Hình Học

public class Geometry {
// Tính diện tích hình tròn
public double calculateArea(double radius) {
return Math.PI * radius * radius;
}

// Tính diện tích hình chữ nhật
public double calculateArea(double length, double width) {
return length * width;
}

// Tính diện tích hình tam giác
public double calculateArea(double base, double height, boolean isTriangle) {
return 0.5 * base * height;
}

// Tính diện tích hình thang
public double calculateArea(double topBase, double bottomBase, double height) {
return 0.5 * (topBase + bottomBase) * height;
}
}

Xử Lý Dữ Liệu

public class DataProcessor {
// Tính tổng mảng số nguyên
public int sum(int[] numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}

// Tính tổng mảng số thực
public double sum(double[] numbers) {
double total = 0;
for (double num : numbers) {
total += num;
}
return total;
}

// Tính tổng các số được truyền vào
public int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}
}

Quản Lý Sản Phẩm

public class ProductManager {
// Thêm sản phẩm với tên
public void addProduct(String name) {
addProduct(name, 0.0, 0);
}

// Thêm sản phẩm với tên và giá
public void addProduct(String name, double price) {
addProduct(name, price, 0);
}

// Thêm sản phẩm đầy đủ thông tin
public void addProduct(String name, double price, int quantity) {
// Xử lý thêm sản phẩm
System.out.printf("Thêm sản phẩm: %s, Giá: %.2f, Số lượng: %d%n",
name, price, quantity);
}

// Thêm sản phẩm với thông tin chi tiết
public void addProduct(String name, double price, int quantity, String category) {
// Xử lý thêm sản phẩm với danh mục
System.out.printf("Thêm sản phẩm: %s, Giá: %.2f, Số lượng: %d, Danh mục: %s%n",
name, price, quantity, category);
}
}

4. Best Practices ✅

  1. Sử Dụng Nạp Chồng Khi Cần

    // Không nên
    public void processInt(int number) { }
    public void processDouble(double number) { }
    public void processString(String text) { }

    // Nên
    public void process(int number) { }
    public void process(double number) { }
    public void process(String text) { }
  2. Giữ Tính Nhất Quán

    // Không nên
    public int add(int a, int b) { return a + b; }
    public double add(double a, double b) { return a - b; } // Không nhất quán

    // Nên
    public int add(int a, int b) { return a + b; }
    public double add(double a, double b) { return a + b; }
  3. Sử Dụng Constructor Chaining

    // Không nên
    public Student(String name) {
    this.name = name;
    this.age = 0;
    }

    // Nên
    public Student(String name) {
    this(name, 0); // Gọi constructor khác
    }

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

  1. Nạp Chồng Chỉ Dựa Vào Kiểu Trả Về

    // Lỗi
    public int getValue() { return 1; }
    public double getValue() { return 1.0; } // Lỗi: không thể nạp chồng

    // Đúng
    public int getIntValue() { return 1; }
    public double getDoubleValue() { return 1.0; }
  2. Tham Số Không Phân Biệt Được

    // Lỗi
    public void process(int a, long b) { }
    public void process(long a, int b) { } // Có thể gây nhầm lẫn

    // Đúng
    public void process(int a, int b) { }
    public void process(double a, double b) { }
  3. Quá Nhiều Phiên Bản Nạp Chồng

    // Không nên
    public void print(int a) { }
    public void print(int a, int b) { }
    public void print(int a, int b, int c) { }
    public void print(int a, int b, int c, int d) { }

    // Nên
    public void print(int... numbers) {
    for (int num : numbers) {
    System.out.println(num);
    }
    }

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

Tiếp Theo 🎯

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

  • Tìm hiểu về ghi đè phương thức (Method Overriding)
  • Học cách sử dụng constructor
  • Thực hành với đệ quy (Recursion)
  • Tìm hiểu về tính đa hình (Polymorphism)