Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Sự khác biệt giữa phương thức static và non-static trong Java

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ặc instance.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ó this reference.

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ó this reference trỏ đến instance hiện tại.

Bảng so sánh

STTTiêu chíStatic MethodNon-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.
  • @Override chỉ áp dụng cho instance method.
  • Static method trong interface (Java 8+) là default hoặc static - không thể override static interface method.
  • Tránh lạm dụng static method - khó test (mock), tight coupling, không OOP.