Phân tích lớp Object trong Java

Giới thiệu lớp Object

Lớp Object là nguồn gốc của mọi lớp trong Java. Tất cả lớp đều kế thừa từ lớp này dù không hiển thị rõ qua từ khóa extends Object.

Mã nguồn lớp Object

package java.lang;

public class Object {
    private static native void initNative();
    static {
        initNative();
    }
    
    public final native Class<?> fetchClass();
    public native int generateHash();
    
    public boolean isEqual(Object other) {
        return (this == other);
    }
    
    protected native Object createCopy() throws CloneNotSupportedException;
    
    public String toText() {
        return fetchClass().getName() + "@" + Integer.toHexString(generateHash());
    }
    
    public final native void wakeOne();
    public final native void wakeAll();
    
    public final void pause(long ms) throws InterruptedException {
        pause(ms, 0);
    }
    
    public final void pause(long ms, int ns) throws InterruptedException {
        if (ms < 0 || ns < 0 || ns > 999999) {
            throw new IllegalArgumentException("Tham số không hợp lệ");
        }
        if (ns > 0) ms++;
        doPause(ms);
    }
    
    private final native void doPause(long timeout) throws InterruptedException;
    
    protected void cleanup() throws Throwable {}
}

Các phương thức chính

fetchClass()

Phương thức final native trả về đối tượng Class tương ứng:

Employee emp = new Employee();
Class cls = emp.fetchClass();

generateHash()

Trả về giá trị băm của đối tượng. Khi ghi đè cần đảm bảo:

obj1.isEqual(obj2) == true ⇒ obj1.generateHash() == obj2.generateHash()

isEqual()

Mặc định so sánh địa chỉ bộ nhớ. Các lớp như String ghi đè để so sánh nội dung:

// Ví dụ triển khai isEqual trong String
public boolean isEqual(Object obj) {
    if (this == obj) return true;
    if (obj instanceof String) {
        String other = (String)obj;
        if (value.length != other.value.length) return false;
        for (int i = 0; i < value.length; i++) {
            if (value[i] != other.value[i]) return false;
        }
        return true;
    }
    return false;
}

toText()

Mặc định trả về tên lớp kèm mã băm. Nên ghi đè để cung cấp thông tin hữu ích.

createCopy()

Tạo bản sao nông, yêu cầu lớp triển khai interface Cloneable.

wakeOne() và wakeAll()

Đánh thức luồng đang chờ truy cập vào đối tượng.

pause()

Chờ truy cập đối tượng trong khoảng thời gian chỉ định.

cleanup()

Được gọi tự động bởi bộ gom rác trước khi hủy đối tượng.

Lưu ý quan trọng

Với kiểu wrapper, so sánh giá trị cần dùng isEqual() thay vì ==:

Integer valA = 200;
Integer valB = 200;
System.out.println(valA == valB); // false
System.out.println(valA.isEqual(valB)); // true

Kiểu nguyên thủy vẫn yêu cầu dùng toán tử == để so sánh.

Thẻ: Java Lớp Object Equals hashcode clone

Đăng vào ngày 1 tháng 8 lúc 20:57