Static Method
Thuộc về class, load cùng class, gọi qua ClassName.method() không cần object.
Hạn chế
- Không truy cập được non-static member (instance variable, instance method) trực tiếp. Phải qua object reference.
- Không dùng
thisvàsuper(vì không có instance). - Chỉ truy cập được static data (static variable, static method).
- Không thể override (chỉ có method hiding - định nghĩa lại static method cùng signature ở subclass).
Static Block
Khối code chạy 1 lần khi class load, trước main. Dùng để init static field phức tạp.
Hạn chế
- Không return giá trị được.
- Không gọi trực tiếp được (JVM tự chạy khi load class).
- Ném checked exception không được → phải
try-catchbên trong block. - Không dùng
this,super. - Thứ tự chạy cố định: Theo thứ tự khai báo trong source code, không kiểm soát động được.
Ví dụ minh họa
public class StaticRestrictions {
static int count = 0;
int instanceVar = 10;
static {
System.out.println("Static block 1");
count = 100; // OK
// instanceVar = 20; // LỖI: không truy cập non-static
}
static {
System.out.println("Static block 2 - count = " + count);
}
public static void staticMethod() {
System.out.println("Static method");
// this.instanceVar = 30; // LỖI: không dùng this
// instanceMethod(); // LỖI: không gọi non-static method
}
public void instanceMethod() {
staticMethod(); // OK: instance gọi static được
System.out.println("Instance method");
}
public static void main(String[] args) {
StaticRestrictions.staticMethod();
new StaticRestrictions().instanceMethod();
}
}
Output:
Static block 1 Static block 2 - count = 100 Static method Static method Instance method