2015-05-27 46 views
16

Tôi muốn biết nếu bạn có một lớp chỉ có các phương thức tĩnh trong nó, thực hiện một cá thể thực tế của lớp được tạo ra ở đâu đó khi bạn gọi phương pháp?Là một thể hiện của một lớp được tạo tự động khi bạn gọi phương thức tĩnh

Điều này hơi khó hiểu trong việc quản lý bộ nhớ vì bạn không bao giờ thực sự gọi hàm tạo hoặc tạo một thể hiện của phương thức một cách rõ ràng.

Nếu một cá thể được tạo ra, tôi muốn hiểu rõ hơn về nơi mà cá thể này tồn tại và trong bao lâu.

+6

Bạn đang nhầm lẫn khi tải lớp (tạo các đối tượng 'Lớp' và siêu dữ liệu cụ thể của VM) với sự kiện đối tượng. (Lưu ý rằng các lớp trừu tượng có thể có các phương thức tĩnh - không thể có sự khởi tạo tự động ẩn nào.) –

Trả lời

13

số Gọi một phương pháp static không yêu cầu (hoặc tạo) một thể hiện của một class. Xem thêm JLS-8.4.3.2 static methods cho biết (một phần)

Phương thức được khai báo static được gọi là phương pháp lớp.

...

Một phương pháp lớp học luôn được gọi mà không cần tham chiếu đến một đối tượng cụ thể.

+2

Cảm ơn bạn điều này sẽ hữu ích.Một câu hỏi song song, cho phép bạn tạo một lớp ẩn danh bên trong một phương thức tĩnh, điều gì sẽ xảy ra với tham chiếu cha được gán cho lớp ẩn danh (như trong lớp ẩn danh java và bên trong theo mặc định có tham chiếu mạnh mẽ về đối tượng kèm theo)? – AlexVPerl

+2

Tôi giả sử bạn có nghĩa là [JLS-15.9.5] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5) Lớp ẩn danh. JLS nói (một phần) * một lớp vô danh luôn luôn là một lớp bên trong (§8.1.3); nó không bao giờ tĩnh (§8.1.1, §8.5.1). * Bất kể, khi kết thúc lời gọi phương thức nó nằm ngoài phạm vi (trừ khi nó được gán cho một 'static', tham chiếu khác). –

+3

@AlexVPerl không có đối tượng kèm theo và các lớp ẩn danh trong các phương thức tĩnh không có tham chiếu gốc. –

4

static phương pháp thuộc về lớp học, không thuộc đối tượng tham chiếu. Bạn có thể gọi phương thức static và quên lãng phí bộ nhớ khi tạo tham chiếu đối tượng của lớp đang được sử dụng, điều đó không xảy ra. Khi bạn gọi phương thức static trên tham chiếu đối tượng, bạn sẽ nhận được cảnh báo trình biên dịch về chủ đề. Bạn thậm chí có thể gọi các phương thức static trên một biến của lớp mong muốn và biến này có thể là null, phương thức static sẽ được gọi mà không có vấn đề gì.

public class Foo { 
    public static void sayHello(String name) { 
     System.out.println("Hello " + name); 
    } 
} 

//works, no instance of Foo was created 
Foo.sayHello("AlexVPerl"); 
Foo foo = new Foo(); 
//works, compiler raises a warning here 
foo.sayHello("AlexVPerl"); 
foo = null; 
//works, compiler raises a warning here 
//and as you can see, it doesn't matter if the instance is null 
foo.sayHello("AlexVPerl"); 
6

Giả sử bạn có

static class Foo 
{ 
    static Bar bar = new Bar(); 

    static int func(){ ... } 
} 

rõ ràng, một đối tượng Foo sẽ không được tạo ra để gọi func().

Tuy nhiên, lớp học Foo cần được tải trong bộ nhớ; và đối với ứng dụng, có một đối tượng tương ứng với lớp, có thể được gọi là Foo.class hoặc Class.forName("Foo").

Lớp đã tải chưa được khởi tạo. Khi bạn gọi một phương thức tĩnh lần đầu tiên, lớp được khởi tạo; một số "khoảng trống" được phân bổ cho các biến tĩnh và mã khởi tạo tĩnh (như new Bar()) được thực thi.

"Không gian" này không hiển thị đối với ứng dụng dưới dạng đối tượng; nhưng cấu trúc dữ liệu bộ nhớ cũng liên quan đến các bộ sưu tập rác (và các đối tượng khác mà nó đề cập đến, chẳng hạn như bar)

Lớp này và "không gian", chỉ đủ điều kiện cho GC khi trình nạp lớp đã nạp đủ điều kiện cho GC. Đối với các ứng dụng dòng lệnh thông thường, điều đó không bao giờ xảy ra. Nhưng đối với rất nhiều ứng dụng khác, lớp GC là quan trọng và việc tải lớp cần được thực hiện một cách cẩn thận.

+2

Trừ khi nó được thay đổi trong Java 8, "lớp tĩnh" không có ý nghĩa trong Java trừ khi đó là một lớp lồng nhau. –

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