⚙️ Định Nghĩa Phương Thức - Defining Methods
Chào mừng đến với bài học về Defining Methods - cách tạo công thức pha chế trong Café!
🎯 Món Ăn Hôm Nay
Tưởng tượng bạn là barista chuyên nghiệp:
- Công thức pha Latte → Method phaCaPhe()
- Tính tiền hóa đơn → Method tinhTien()
- Tái sử dụng quy trình → Gọi method nhiều lần
Đó chính là Methods - khối lệnh có thể tái sử dụng!
⚙️ Method Là Gì?
Method = Công thức pha chế (khối lệnh thực hiện công việc cụ thể)
public static void chaoKhach() {
System.out.println("☕ Chào mừng đến Java Café!");
System.out.println("Xin mời chọn món!");
}
// Gọi method
chaoKhach(); // In ra lời chào
☕ Ẩn Dụ Café:
- Method = Công thức pha chế chuẩn
- Parameters = Nguyên liệu đầu vào
- Return = Sản phẩm đầu ra
- Gọi method = Thực hiện công thức
📋 Cấu Trúc Method
[access_modifier] [static] returnType methodName(parameters) {
// Thân method
return value; // Nếu có return type
}
Ví dụ:
public static int tinhTong(int a, int b) {
int tong = a + b;
return tong;
}
Các Thành Phần
- Access Modifier:
public,private,protected - static: Gọi trực tiếp qua class (không cần object)
- Return Type: Kiểu dữ liệu trả về (
int,String,void) - Method Name: Tên method (camelCase)
- Parameters: Tham số đầu vào
- Body: Nội dung method
- return: Trả về giá trị (nếu không phải
void)
👨🍳 Câu Chuyện Trong Quán
Tình huống 1: Method Không Tham Số
public class QuanCafe {
public static void hienThiMenu() {
System.out.println("☕ MENU:");
System.out.println("1. Espresso - 45,000đ");
System.out.println("2. Latte - 50,000đ");
System.out.println("3. Cappuccino - 55,000đ");
}
public static void main(String[] args) {
System.out.println("🏪 CHÀO MỪNG ĐẾN QUÁN!\n");
hienThiMenu(); // Gọi method
hienThiMenu(); // Có thể gọi nhiều lần
}
}
Tình huống 2: Method Có Tham Số
public class PhaCaPhe {
public static void phaMon(String tenMon, int soLuong) {
System.out.println("☕ Đang pha:");
System.out.println(" Món: " + tenMon);
System.out.println(" Số lượng: " + soLuong + " ly");
System.out.println(" ✅ Hoàn thành!\n");
}
public static void main(String[] args) {
phaMon("Latte", 2);
phaMon("Espresso", 1);
phaMon("Mocha", 3);
}
}
Output:
☕ Đang pha:
Món: Latte
Số lượng: 2 ly
✅ Hoàn thành!
☕ Đang pha:
Món: Espresso
Số lượng: 1 ly
✅ Hoàn thành!
📝 Công Thức Nấu (Code Examples)
Ví Dụ 1: Method Void (Không Trả Về)
public class MethodVoid {
public static void inHoaDon(String tenKhach, String mon, int gia) {
System.out.println("╔═══════════════════════╗");
System.out.println("║ HÓA ĐƠN CAFÉ ║");
System.out.println("╠═══════════════════════╣");
System.out.printf("║ Khách: %-14s║%n", tenKhach);
System.out.printf("║ Món: %-16s║%n", mon);
System.out.printf("║ Giá: %,15d đ║%n", gia);
System.out.println("╚═══════════════════════╝");
}
public static void main(String[] args) {
inHoaDon("Anh Minh", "Latte", 50000);
System.out.println();
inHoaDon("Chị Lan", "Mocha", 60000);
}
}
Ví Dụ 2: Method Có Return
public class MethodReturn {
public static int tinhTien(int soLuong, int donGia) {
int tongTien = soLuong * donGia;
return tongTien;
}
public static double tinhGiamGia(int tongTien, double phanTram) {
double giamGia = tongTien * phanTram / 100;
return giamGia;
}
public static void main(String[] args) {
int soLy = 3;
int giaMotLy = 50000;
int tongTien = tinhTien(soLy, giaMotLy);
System.out.println("💰 Tổng tiền: " + tongTien + " VND");
double giamGia = tinhGiamGia(tongTien, 10);
System.out.println("🎁 Giảm 10%: -" + (int)giamGia + " VND");
int thanhToan = tongTien - (int)giamGia;
System.out.println("💵 Thanh toán: " + thanhToan + " VND");
}
}
Output:
💰 Tổng tiền: 150000 VND
🎁 Giảm 10%: -15000 VND
💵 Thanh toán: 135000 VND
Ví Dụ 3: Method Trả Về String
public class MethodString {
public static String taoLoiChao(String tenKhach) {
return "☕ Chào mừng " + tenKhach + " đến Java Café!";
}
public static String layMucDoNgot(String loai) {
if (loai.equals("Espresso")) {
return "Không đường";
} else if (loai.equals("Latte")) {
return "Ngọt vừa";
} else {
return "Ngọt";
}
}
public static void main(String[] args) {
String loiChao = taoLoiChao("Anh Minh");
System.out.println(loiChao);
String mucDoNgot = layMucDoNgot("Latte");
System.out.println("Mức độ ngọt: " + mucDoNgot);
}
}
Ví Dụ 4: Method Trả Về Boolean
public class MethodBoolean {
public static boolean kiemTraGioMoCua(int gio) {
return gio >= 7 && gio < 22;
}
public static boolean kiemTraDuTien(int tienKhach, int tienMon) {
return tienKhach >= tienMon;
}
public static boolean laKhachVIP(int soLanMua) {
return soLanMua >= 20;
}
public static void main(String[] args) {
int gioHienTai = 19;
if (kiemTraGioMoCua(gioHienTai)) {
System.out.println("✅ Quán đang mở cửa");
} else {
System.out.println("🔒 Quán đã đóng cửa");
}
int tienKhach = 60000;
int giaLatte = 50000;
if (kiemTraDuTien(tienKhach, giaLatte)) {
System.out.println("💰 Đủ tiền mua Latte");
}
int soLanMua = 25;
if (laKhachVIP(soLanMua)) {
System.out.println("🌟 Khách VIP - Giảm 20%");
}
}
}
Ví Dụ 5: Method Nhiều Tham Số
public class MethodNhieuThamSo {
public static void inThongTinDonHang(
String tenKhach,
String mon,
int soLuong,
int donGia,
boolean giaoChu
) {
System.out.println("📋 ĐƠN HÀNG:");
System.out.println("Khách: " + tenKhach);
System.out.println("Món: " + mon + " x" + soLuong);
System.out.println("Đơn giá: " + donGia + " VND");
System.out.println("Tổng: " + (soLuong * donGia) + " VND");
if (giaoChu) {
System.out.println("🏍️ Giao tận nhà");
} else {
System.out.println("🏪 Tại quán");
}
System.out.println();
}
public static void main(String[] args) {
inThongTinDonHang("Anh Minh", "Latte", 2, 50000, true);
inThongTinDonHang("Chị Lan", "Mocha", 1, 60000, false);
}
}
Ví Dụ 6: Method Gọi Method Khác
public class MethodGoiMethod {
public static int tinhTongTien(int soLuong, int donGia) {
return soLuong * donGia;
}
public static int tinhGiamGia(int tongTien, boolean laVIP) {
if (laVIP) {
return tongTien * 20 / 100; // Giảm 20%
} else {
return tongTien * 10 / 100; // Giảm 10%
}
}
public static int tinhThanhToan(int soLuong, int donGia, boolean laVIP) {
int tongTien = tinhTongTien(soLuong, donGia); // Gọi method 1
int giamGia = tinhGiamGia(tongTien, laVIP); // Gọi method 2
return tongTien - giamGia;
}
public static void main(String[] args) {
int soLy = 3;
int gia = 50000;
boolean vip = true;
int thanhToan = tinhThanhToan(soLy, gia, vip);
System.out.println("💵 Thanh toán: " + thanhToan + " VND");
}
}
🔥 Thực Hành Trong Quán
Bài Tập 1: Method Kiểm Tra Kho
public class KiemTraKho {
public static void kiemTraSoLuong(String sanPham, int soLuong) {
System.out.println("📦 " + sanPham + ": " + soLuong);
if (soLuong == 0) {
System.out.println(" ❌ HẾT HÀNG!");
} else if (soLuong < 10) {
System.out.println(" ⚠️ Sắp hết!");
} else {
System.out.println(" ✅ Đủ hàng");
}
System.out.println();
}
public static void main(String[] args) {
kiemTraSoLuong("Cà phê", 50);
kiemTraSoLuong("Sữa", 8);
kiemTraSoLuong("Đường", 0);
}
}
Bài Tập 2: Method Tính Trung Bình
public class TinhTrungBinh {
public static double tinhTrungBinhDoanhThu(int[] doanhThu) {
int tong = 0;
for (int dt : doanhThu) {
tong += dt;
}
return (double) tong / doanhThu.length;
}
public static void main(String[] args) {
int[] doanhThuTuan = {150000, 180000, 200000, 170000, 190000};
double trungBinh = tinhTrungBinhDoanhThu(doanhThuTuan);
System.out.printf("📊 Doanh thu trung bình: %,.0f VND/ngày%n", trungBinh);
}
}
Bài Tập 3: Method Format Số Tiền
public class FormatTien {
public static String formatTien(int tien) {
return String.format("%,d VND", tien);
}
public static void inBangGia(String[] mon, int[] gia) {
System.out.println("💰 BẢNG GIÁ:\n");
for (int i = 0; i < mon.length; i++) {
System.out.printf("%-12s: %s%n", mon[i], formatTien(gia[i]));
}
}
public static void main(String[] args) {
String[] menu = {"Espresso", "Latte", "Cappuccino"};
int[] bangGia = {45000, 50000, 55000};
inBangGia(menu, bangGia);
}
}
⚠️ Lỗi Thường Gặp
Lỗi 1: Thiếu Return
// ❌ SAI: Method int phải có return
public static int tinhTong(int a, int b) {
int tong = a + b;
// Thiếu return!
}
// ✅ ĐÚNG
public static int tinhTong(int a, int b) {
int tong = a + b;
return tong; // ✅ Có return
}
Lỗi 2: Return Sai Kiểu
// ❌ SAI: Return String nhưng khai báo int
public static int layTen() {
return "Latte"; // ❌ Lỗi kiểu!
}
// ✅ ĐÚNG
public static String layTen() {
return "Latte"; // ✅ OK
}
Lỗi 3: Void Có Return Giá Trị
// ❌ SAI: void không return giá trị
public static void in() {
return "OK"; // ❌ Lỗi!
}
// ✅ ĐÚNG
public static void in() {
System.out.println("OK");
// Hoặc: return; (không giá trị)
}
Lỗi 4: Gọi Method Sai Tham Số
public static void phaMon(String ten, int soLuong) {
System.out.println(ten + " x" + soLuong);
}
// ❌ SAI: Thiếu tham số
phaMon("Latte"); // ❌ Lỗi!
// ❌ SAI: Sai thứ tự
phaMon(2, "Latte"); // ❌ Lỗi!
// ✅ ĐÚNG
phaMon("Latte", 2); // ✅ OK
💡 Bí Quyết Của Barista
- Tên method rõ ràng: Dùng động từ (tinhTien, kiemTraGio)
- Một method một nhiệm vụ: Đừng làm quá nhiều việc
- Return về sớm: Tránh nhiều nhánh if-else
- Tham số hợp lý: Không quá nhiều tham số (tối đa 4-5)
- void khi không cần return: In ra, hiển thị dùng void
- Tái sử dụng: Viết method cho code lặp lại
🎓 Bạn Đã Học Được
- ✅ Method = Khối lệnh tái sử dụng
- ✅ Cấu trúc:
returnType name(params) {...} - ✅ void = Không trả về giá trị
- ✅ return = Trả về giá trị
- ✅ Tham số = Input cho method
- ✅ Gọi method:
methodName(args) - ✅ Method có thể gọi method khác
☕ Món Tiếp Theo
Đã biết định nghĩa method! Giờ học về method overloading:
👉 Method Overloading - Nạp Chồng Phương Thức
💡 Lời Khuyên Cuối: Method như công thức pha chế - viết rõ ràng, dễ hiểu, dễ tái sử dụng!