Phương thức (method) trong Java phân làm 2 loại: static method (class method) và non-static / instance method.
Static Method
- Khai báo với
static. - Thuộc về class.
- Gọi qua
ClassName.method()(khuyến khích) hoặcinstance.method(). - Chỉ có thể truy cập trực tiếp các static member (field/method) khác.
- Binding: Compile-time (early binding / static binding).
- Không thể override (chỉ method hiding).
- Không có
thisreference.
Non-Static Method (Instance Method)
- Không có
static. - Thuộc về instance.
- Gọi qua
instance.method(). - Truy cập được cả static và non-static member.
- Binding: Runtime (dynamic binding / late binding) - hỗ trợ polymorphism.
- Có thể override.
- Có
thisreference trỏ đến instance hiện tại.
Bảng so sánh
| STT | Tiêu chí | Static Method | Non-Static Method |
|---|---|---|---|
| 1 | Truy cập member | Chỉ static member | Cả static và non-static |
| 2 | Binding | Compile-time (early) | Runtime (dynamic) - polymorphism |
| 3 | Override | Không thể (method hiding) | Có thể (polymorphism) |
| 4 | Bộ nhớ | Một bản sao cho class (method area) | Code chia sẻ, nhưng context (this, local vars) mỗi invocation |
| 5 | Từ khóa | static |
Không cần |
| 6 | this / super |
Không có | Có |
| 7 | Gọi từ static context | OK | Cần instance |
Ví dụ minh họa
public class JavaTester {
public static void main(String args[]) {
// Gọi static method qua class
Tiger.roar();
// Gọi instance method cần object
Tiger tiger = new Tiger();
tiger.eat();
}
}
class Tiger {
// Instance method
public void eat() {
System.out.println("Tiger eats");
}
// Static method
public static void roar() {
System.out.println("Tiger roars");
}
}
Kết quả
Tiger roars Tiger eats
Method Hiding vs Overriding
class Parent {
static void staticMethod() { System.out.println("Parent static"); }
void instanceMethod() { System.out.println("Parent instance"); }
}
class Child extends Parent {
// Method HIDING (không phải overriding)
static void staticMethod() { System.out.println("Child static"); }
// Method OVERRIDING
@Override
void instanceMethod() { System.out.println("Child instance"); }
}
public class Demo {
public static void main(String[] args) {
Parent p = new Child();
p.staticMethod(); // "Parent static" - static binding theo kiểu khai báo (Parent)
p.instanceMethod(); // "Child instance" - dynamic binding theo object thực (Child)
Child.staticMethod(); // "Child static"
Parent.staticMethod(); // "Parent static"
}
}
Khi nào dùng static method?
- Utility/helper functions không phụ thuộc state:
Math.max(),Collections.sort(),String.valueOf(). - Factory methods:
LocalDate.now(),Optional.of(). - Singleton getInstance().
- Entry point:
main(). - Callback/Functional interface implementation (lambda).
Khi nào dùng instance method?
- Cần truy cập instance state (field non-static).
- Cần polymorphism (override).
- Behavior thuộc về object cụ thể.
- Builder pattern, fluent API.
Lưu ý
- Static method không thể override - subclass định nghĩa static method cùng signature gọi là method hiding.
@Overridechỉ áp dụng cho instance method.- Static method trong interface (Java 8+) là
defaulthoặcstatic- không thể override static interface method. - Tránh lạm dụng static method - khó test (mock), tight coupling, không OOP.