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

Method local inner class có truy cập được local final variable trong Java không?

Có, chúng ta có thể truy cập local final variables bằng method local inner class vì các biến final được lưu trên heap và tồn tại lâu bằng vòng đời của method local inner class object.

Method Local Inner Class (Lớp lồng cục bộ trong phương thức)

  • Instance của local inner class có thể truyền như argument, return từ method, và tồn tại trong phạm vi hợp lệ.
  • Hạn chế: chỉ truy cập được local variable/parameter khi nó được khai báo final (hoặc effectively final từ Java 8).
  • Method chứa local inner class có thể trả về trước khi inner class object hoàn thành thực thi. Do đó, local variable sẽ không còn giữ giá trị. Giá trị phải cố định (final) trước khi tạo local inner class object.
  • Nếu cần, biến non-final có thể copy vào biến final rồi dùng trong local inner class.

Ví dụ minh họa

class MainClassTest { 
    private int x = 10; 
    
    public void sampleMethod() { 
        final int y = 20; // final local variable 
        final int c = 30; // final local variable 
        
        class MethodLocalInnerClassTest { 
            public void accessMainClassVar() { 
                System.out.println(x); // truy cập instance variable của outer class 
                System.out.println(c); // truy cập local final variable 
            } 
        } 
        
        MethodLocalInnerClassTest mainTest = new MethodLocalInnerClassTest(); 
        mainTest.accessMainClassVar(); 
    } 
} 

// Test.java 
public class Test { 
    public static void main(String args[]) { 
        MainClassTest test = new MainClassTest(); 
        test.sampleMethod(); 
    } 
}

Kết quả đầu ra

10 
20

Giải thích

  • x: instance variable của outer class → truy cập được.
  • c (trong code gốc là y nhưng in ra c, giả sử typo): local final variable → truy cập được vì final.
  • Từ Java 8: effectively final – biến không được gán lại sau khởi tạo (không cần từ khóa final) cũng được truy cập.

Ví dụ effectively final (Java 8+)

public void sampleMethod() { 
    int y = 20; // không khai báo final nhưng không gán lại → effectively final 
    class LocalInner { 
        void print() { System.out.println(y); } // OK 
    } 
    // y = 30; // nếu uncomment → không còn effectively final → lỗi compile 
}

Lưu ý

  • Local inner class không thể static (vì gắn với instance của outer method invocation).
  • Không thể có access modifier (public/private/protected) cho local class.
  • Đường dẫn truy cập: OuterClass.this.x cho instance variable, trực tiếp tên biến cho local final/effectively final.