Xóa một đối tượng trong java?


99

Tôi muốn xóa một đối tượng mà tôi đã tạo, (hình bầu dục theo sau bạn), nhưng tôi sẽ làm điều này như thế nào?

delete follower1;

không hoạt động.

BIÊN TẬP:

Được rồi, tôi sẽ cung cấp thêm một số ngữ cảnh. Tôi đang tạo một trò chơi nhỏ với hình bầu dục bạn có thể điều khiển và hình bầu dục theo sau bạn. Bây giờ tôi có các tệp có tên: DrawPanel.class, lớp này vẽ mọi thứ trên màn hình và xử lý các va chạm, âm thanh, v.v. Tôi có một lớp Địch thủ, là hình bầu dục theo sau trình phát. Tôi có một entity.class, là trình phát bạn có thể kiểm soát. Và nếu người chơi giao nhau với người theo dõi, tôi muốn đối tượng người chơi của mình bị xóa. Cách tôi đang làm:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}

1
bạn có thể cung cấp thêm một chút ngữ cảnh không?
Joseph Weissman

2
Không có việc xóa các đối tượng trong Java. Nhưng bạn thường không cần phải làm như vậy: điều bạn cần là đảm bảo rằng không có gì hiển thị trên màn hình nữa (nếu đây là những gì "theo dõi bạn" đang làm).
Paŭlo Ebermann

Có lẽ bạn muốn thử buộc người thu gom rác loại bỏ một đối tượng? có một câu hỏi về nó ở đây rồi. Hoặc có lẽ bạn đang thử một cái gì đó khác? bạn có thể thử đọc một chút về bộ thu gom rác tại đây hoặc tại đây Nếu nó vẫn không giúp được gì, bạn sẽ cần phải tìm hiểu cụ thể hơn.
Fawix


Nếu bạn thực sự thực sự muốn xử lý việc cấp phát đối tượng theo cách thủ công, hãy sử dụng JNI: tạo một lib C / C ++ được sử dụng từ mã Java nhưng tự nó thực hiện mọi thứ (tạo, xóa, v.v.) - nhưng bên trong lib của bạn, bạn có C / Mã C ++, không có Java. Tôi chưa thấy bất kỳ cách nào để xóa một đối tượng Java theo cách thủ công. Nếu hồ sơ của bạn cho bạn biết rằng có vấn đề, những vấn đề này thường dựa trên các tham chiếu "bị quên" đến các đối tượng. Trong trường hợp của bạn dường như không có vấn đề ở bất kỳ đâu.
Johannes

Câu trả lời:


171

Bạn nên loại bỏ các tham chiếu đến nó bằng cách gán null hoặc rời khỏi khối nơi nó được khai báo. Sau đó, nó sẽ tự động bị xóa bởi bộ thu gom rác (không phải ngay lập tức, nhưng cuối cùng).

Ví dụ 1:

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

Ví dụ 2:

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

Không phải thứ mà bạn hiện đang tìm kiếm, mà là FYI: bạn có thể gọi bộ thu gom rác bằng lệnh gọi System.gc ()


23
Việc phải gọi theo cách thủ công System.gc()thường không phải là một ý kiến ​​hay , vì nó thực sự có thể bị JVM bỏ qua.
cdeange

3
Không phải là một ý kiến ​​hay, nhưng bạn cũng có thể gọi tương tự như System .. Runtime.getRuntime (). Gc (). Thông tin thêm: các quy trình thu gom rác mà Java cung cấp là thành viên của lớp Runtime. Lớp Runtime là một lớp đặc biệt có một đối tượng duy nhất (một Singleton) cho mỗi chương trình chính. Đối tượng Runtime cung cấp cơ chế giao tiếp trực tiếp với máy ảo. Để lấy phiên bản Runtime, bạn có thể sử dụng phương thức Runtime.getRuntime (), trả về Singleton.
Timo

1
nullViệc gán có phải là một dấu hiệu xác định cho GC rằng đối tượng này sẽ được dọn dẹp trong lần gọi GC tiếp theo nullkhông? stackoverflow.com/questions/449409/…
George Daramouskas

Vì vậy, tôi nên làm cho tất cả các chế độ xem văn bản và nút hình ảnh của mình là rỗng trong onPause?
Ruchir Baronia

Không có gì đảm bảo rằng trình thu gom rác sẽ chạy hoặc nếu có, nó sẽ thu thập (không phải 'xóa') bất kỳ đối tượng cụ thể nào.
Marquis of Lorne,

64

C ++ của bạn đang hiển thị.

Không có deletetrong java và tất cả các đối tượng được tạo trên heap. JVM có một bộ thu gom rác dựa trên số lượng tham chiếu.

Khi không còn tham chiếu đến một đối tượng, nó sẽ có sẵn để thu thập bởi bộ thu gom rác.

myObject = nullcó thể không làm điều đó; ví dụ:

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

Tất cả những gì điều này làm là đặt tham chiếu myObjectthành null, nó không ảnh hưởng đến đối tượng myObjectđã được trỏ tới ngoại trừ chỉ đơn giản là giảm số lượng tham chiếu đi 1. Vì myOtherObjectvẫn tham chiếu đến đối tượng đó nên nó chưa có sẵn để thu thập.


Vì vậy, tôi nên làm cho tất cả các chế độ xem văn bản và nút hình ảnh của mình là rỗng trong onPause?
Ruchir Baronia

8
"JVM có một bộ thu gom rác dựa trên số lượng tham chiếu." -> đó là một lời giải thích rất đơn giản. Nó kiểm tra xem các đối tượng có thể truy cập được từ một "gốc" cụ thể hay không
Johannes

2
JVM có một bộ thu gom rác đặc biệt không dựa vào số lượng tham chiếu. Nó dựa vào khả năng tiếp cận. Nếu nó dựa trên số lượng tham chiếu, nó không bao giờ có thể thu thập các chu kỳ, và nó có.
Marquis of Lorne,

14

Nếu bạn muốn giúp một đối tượng biến mất, hãy đặt tham chiếu của nó thành null.

String x = "sadfasdfasd";
// do stuff
x = null;

Đặt tham chiếu thành null sẽ làm cho đối tượng có nhiều khả năng bị thu thập rác, miễn là không có tham chiếu nào khác đến đối tượng.


Bất cứ khi nào tôi làm điều đó, khi đối tượng của tôi giao nhau, toàn bộ trò chơi của tôi sẽ bị đóng băng và nó sẽ không xóa đối tượng.
Stan

Bởi vì có thể bạn đang ném ra một ngoại lệ con trỏ null không cần thiết. Nhiều ngữ cảnh hơn chắc chắn sẽ giúp chúng tôi hướng dẫn bạn thực hiện điều này.
Joseph Weissman

Vì vậy, tôi nên làm cho tất cả các chế độ xem văn bản và nút hình ảnh của mình là rỗng trong onPause?
Ruchir Baronia

Nếu bạn thực sự cần chúng biến mất, thì điều đó cuối cùng sẽ làm được.
John Percival Hackworth

3

Bạn không cần phải xóa các đối tượng trong java. Khi không có tham chiếu đến một đối tượng, nó sẽ được bộ thu gom rác tự động thu thập.


Vì vậy, tôi nên làm cho tất cả các chế độ xem văn bản và nút hình ảnh của mình là rỗng trong onPause?
Ruchir Baronia

0

Bạn có thể xóa tham chiếu bằng cách sử dụng null.

Giả sử bạn có lớp A:

A a = new A();
a=null;

câu lệnh cuối cùng sẽ xóa tham chiếu của đối tượng avà đối tượng đó sẽ được JVM "thu gom rác". Đó là một trong những cách dễ nhất để làm điều này.


Vì vậy, tôi nên làm cho tất cả các chế độ xem văn bản và nút hình ảnh của mình là rỗng trong onPause?
Ruchir Baronia


-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}

Lý do câu trả lời này không chính xác là vì nó chỉ loại bỏ một tham chiếu đến Đối tượng chứ không phải chính đối tượng thực.
Ben Morris

Lý do tại sao câu trả lời này không chính xác vì nó chỉ ra cách bạn có thể xóa một đối tượng khỏi danh sách - đây không phải là câu hỏi.
phil,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.