2013-07-17 43 views
9

Ai đó có thể giải thích sự khác biệt giữa tải lớp học và tạo lớp học là gì. Khi chúng ta nạp một lớp với biến tĩnh, nó cũng có được khởi tạo cùng lúc với lớp được nạp không? Sau khi tất cả các mã tĩnh là một phần của lớp chứ không phải là các cá thể riêng lẻ. Sẽ rất hữu ích nếu ai đó cung cấp một ví dụ để giúp tôi hiểu điều này tốt hơn.Sự khác biệt giữa việc tải một lớp học và khởi tạo nó

+0

Có thể là một trang web StackExchange thay thế có [câu trả lời này] (http://programmers.stackexchange.com/questions/53181/what-is-the-difference-between-instantiating- và tải-một-class-in-java). Nó quá rộng. – NINCOMPOOP

+5

@TheNewIdiot Tôi không nghĩ rằng câu hỏi là mở rộng vì nó có phạm vi rất cụ thể và cũng là một câu trả lời cụ thể. –

+0

SO cũng xác định ** ** rộng như là * câu trả lời tốt sẽ là quá dài cho định dạng này. * !!! – NINCOMPOOP

Trả lời

9

Dưới đây là một số giải thích thoải mái (với một ví dụ và quan sát)

When a class is loaded and initialized in JVM - Java

Khi lớp được nạp trong Java

Lớp tải được thực hiện bằng classloaders trong Java mà có thể được thực hiện để háo hức nạp một lớp ngay sau khi lớp khác tham chiếu nó hoặc tải lớp lười cho đến khi cần khởi tạo lớp. Nếu Class được nạp trước khi nó thực sự được sử dụng, nó có thể ngồi bên trong trước khi được khởi tạo. Tôi tin rằng điều này có thể thay đổi từ JVM sang JVM. Trong khi được đảm bảo bởi JLS rằng một lớp sẽ được nạp khi có nhu cầu khởi tạo tĩnh.

Khi một lớp được khởi tạo trong Java

Khi một lớp được khởi tạo trong Java Sau khi tải lớp, khởi tạo của lớp diễn ra có nghĩa là khởi tạo tất cả các thành viên tĩnh của lớp. Một lớp được khởi tạo trong Java khi:

1) một Instance của lớp được tạo ra bằng cách sử dụng mới) từ khóa (hoặc sử dụng phản chiếu sử dụng Class.forName(), mà có thể ném ClassNotFoundException trong Java.

2) một phương thức tĩnh của lớp được gọi.

3) trường tĩnh của Class được chỉ định.

4) một trường tĩnh của lớp được sử dụng không phải là biến số không đổi .

5) nếu Lớp là lớp cấp cao nhất và câu khẳng định được lồng vào nhau trong lớp được thi hành.

Hy vọng điều đó sẽ hữu ích.

+0

tôi hơi bối rối và muốn làm rõ điều gì đó với bạn. bằng cách tải chậm, chúng tôi có nghĩa là ngay cả khi classloader thấy một khai báo lớp bên trong lớp hiện tại, nó không tải lớp khác vì nó chưa được khởi tạo và trong khi tải lớp tải lên mỗi lớp mà nó thấy không có vấn đề gì được khởi tạo hay không và cũng có thể giải thích làm thế nào để cả hai trình nạp lớp lười biếng và háo hức xử lý các cuộc gọi đệ quy (tải các lớp khác mà chúng gặp phải). – light

3

Lớp tải
Bất cứ khi nào JVM xác định nó cần một lớp (sử dụng các biến tĩnh của mình, để tạo ra một đối tượng mới, sử dụng phương pháp tĩnh của nó vv) nó sẽ tải các lớp và tĩnh khối khởi động sẽ chạy, biến tĩnh được khởi tạo, v.v.Đây là (ít nhất là trong điều kiện bình thường) thực hiện một lần duy nhất

SomeClass.someStaticMethod(); //SomeClass is loaded (if its not already) 
SomeClass.someStaticVariable; //SomeClass is loaded (if its not already) 
SomeClass var=new SomeClass(); //SomeClass is BOTH loaded (if its not already) AND instantiated 

Kết quả là chạy sau (như một ví dụ):

static Vector3d var=new Vector3d(); //static variables are initialised 

static{ 
    //static initialisation block are run 
} 

Instantiating một lớp
Mặt khác tay bạn instantiate a class khi bạn tạo một thể hiện của lớp học với từ khóa new; instantiating một lớp học đang tạo ra một đối tượng của lớp.

SomeClass var=new SomeClass(); //SomeClass is instantiating (and loaded if its not already) 

Kết quả là các nhà xây dựng chạy:

public SomeClass(){ 
} 

{ 
    //initialisation block(s) also run (but these are very uncommonly used) 
} 
6
Integer.toString(123); 

Đối với phương pháp tĩnh gọi trên để làm việc, lớp Integer phải được nạp.

Integer i = new Integer(123); 

Và trong đoạn mã trên, tôi đã tạo một đối tượng (đối tượng) của lớp Integer (cũng phải được tải để làm việc này).

Một số lớp không có nghĩa là được khởi tạo (ví dụ như lớp Toán, chỉ có các phương thức tĩnh).

+0

+1 Đây là câu trả lời ngắn nhất nhưng tốt nhất, sử dụng đúng ví dụ, đây là nơi trải nghiệm đi vào hình ảnh! – NINCOMPOOP

2

Một lớp được tải khi nó được tham chiếu (ví dụ: Class.forName()).

Bạn instanciate một đối tượng bằng cách tạo một ví dụ, ví dụ:

Object o = new Object(); 

Bạn cũng có thể instanciate một đối tượng bằng cách sử dụng phản ánh.

static thành viên của lớp được instanciated khi lớp được tải, ví dụ:

public class Sample { 
    private static int variable = 10; 
} 

Khi tôi bây giờ nạp lớp (ví dụ bằng cách Class.forName("Sample");) Sau đó biến variable được khởi tạo với giá trị 10.

Nếu bạn đang tạo một trường hợp mới của một lớp và nó không được nạp trước khi lớp học sẽ bị loay trước (atomatically). Vì vậy, cấu trúc Class.forName() chỉ cần thiết trong các trường hợp đặc biệt (nếu lớp không được biết đến theo thời gian biên dịch, ví dụ:).

+0

+1 để giải thích toàn diện mà không cần đăng liên kết. – NINCOMPOOP

+1

@TheNewIdiot Bài đăng có liên kết đến điều xấu không? Chắc chắn một câu trả lời sẽ có thể "sống mà không có" liên kết, nhưng một tham chiếu thêm độ tin cậy cho một câu trả lời –

+0

@RichardTingle Xin lỗi, nhưng tôi muốn nói ** chỉ liên kết câu trả lời ** mà không cần giải thích. – NINCOMPOOP

3

Trình tải lớp thực sự tải mã byte vào JVM, chạy trình khởi tạo tĩnh.Khi bạn muốn sử dụng các trường tĩnh trong lớp mà không tạo cá thể của nó, lớp phải được nạp bởi trình nạp lớp đầu tiên.Default classloader trong java là java.lang.ClassLoader. tải chỉ được thực hiện một lần.
Trong khi lớp học instantiation là tạo ra dụ của lớp vào bộ nhớ.Chúng tôi có thể nhanh chóng lớp bằng cách sử dụng new .Class instantiation có thể được thực hiện nhiều lần. ví dụ: Animal a=new Animal();

More on class loading

+0

Bạn đang nói Trình nạp lớp chạy trình khởi tạo tĩnh và tải được thực hiện chính xác một lần sau đó điều gì sẽ xảy ra khi một thể hiện của lớp thay đổi giá trị của biến tĩnh? –

+0

Khi trình nạp lớp gặp từ khóa lớp, nó sẽ kiểm tra xem lớp đã được nạp hay chưa. Biến tĩnh được khởi tạo khi lớp được nạp, các thay đổi được thực hiện theo lớp sẽ được phản ánh khi bạn tạo cá thể lớp mới. – Rohan

+0

Có lẽ tôi không rõ ràng. Tôi yêu cầu cho phép nói rằng tôi tạo ra một thể hiện (đối tượng) của một lớp. sử dụng cá thể này, tôi thay đổi giá trị của biến tĩnh. Sự thay đổi này được phản ánh như thế nào trong lớp được nạp? –

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