2012-02-01 64 views
7

Tôi là một sinh viên trong lớp Java và đã học được điều gì đó về Java ngày hôm nay làm cho bánh răng của tôi quay lại. Khi tôi hỏi giáo viên như thế nào và tại sao, anh không chắc chắn về hành vi đó. Bất cứ ai có thể giải thích lý do tại sao ví dụ sau đây hoạt động?Phạm vi Java: Trả về một đối tượng được khởi tạo bên trong một phương thức - Có nguy hiểm không?

class Example { 
    public int ex_val; 

    public Example (int a) { 
     this.ex_val = a; 
    } 

    public int getExVal() { 
     return this.ex_val; 
    } 
} 

Nếu tôi là để tạo ra một thể hiện của "Ví dụ" bên trong một phương pháp khác lớp và "trở lại" các đối tượng, nó có thể thành công thực hiện chuyển ra khỏi nó là phạm vi ban đầu và được sử dụng sau đó.

class ParentObject { 
    // Instance Variables  
    public Example a; 

    public ParentObject (int number) { 
     // Initialize instance variable object from out-of-scope instantiation 
     this.a = genExample(number); 

     // Verify scope creep 
     System.out.println(this.a.getExVal()); 
    } 

    public Example genExample (int a) { 
     return new Example(a); 
    } 
} 

Điều này hoạt động, nhưng hành vi này có ổn định không? Tôi có thể tin vào điều này? Bộ thu gom rác có thể nhảy vào giữa câu lệnh trả về của một phương thức và câu lệnh gán của hàm gọi không? Tôi có đang gặp nguy cơ thất bại dựa trên phiên bản JVM của hệ điều hành của tôi không? Điều này có vẻ như chức năng tiện dụng nếu nó có thể được dựa vào.

+0

Không thể nói tôi hiểu những gì bạn đang yêu cầu ở đây. Bạn có ý gì khi "nhảy ra khỏi phạm vi ban đầu của nó"? Bạn có phải là lập trình viên C++ không? –

+2

Bạn đang phạm vi khó hiểu với thời gian sống. Hãy nghĩ về phạm vi liên quan đến các biến, tuổi thọ đối với các đối tượng. –

Trả lời

9

Đây là điều hoàn toàn bình thường, phổ biến và đáng tin cậy trong Java, và điều cần làm là tin tưởng rằng bộ thu gom rác sẽ dọn sạch đối tượng ngay khi không có bất kỳ tham chiếu trực tiếp nào. Đây không phải là phụ thuộc vào hệ điều hành hoặc phụ thuộc vào JVM: bất kỳ JVM nào cũng sẽ ổn với điều này.

3

Điều này hoàn toàn bình thường.

Bộ thu gom rác không thể thu thập vì nó vẫn được gọi bằng trường a của bạn.

Không giống như C++, các đối tượng Java không bao giờ được liên kết với phạm vi đã tạo chúng.

+0

, "Không giống như C++, các đối tượng Java không bao giờ được liên kết với phạm vi đã tạo chúng." -> Không đúng. Nếu một đối tượng được tạo ra trong một thân hàm và tham chiếu đến nó không bị "rò rỉ" dưới dạng đối số trả về hoặc bằng một số phương tiện khác, thì IS của nó được liên kết với phạm vi mà nó được tạo ra nằm ngoài phạm vi, nó đủ điều kiện để thu gom rác thải. Bạn có thể cần phải nói lại dòng cuối cùng đó. – eternaln00b

+0

@SiddharthaShankar: Mặc dù đó là sự thật, đối tượng không được rõ ràng _linked_ đến phạm vi. Thay vào đó, nó chỉ xảy ra để có cùng một đời. – SLaks

Các vấn đề liên quan