2012-03-13 33 views
9

Cho phép nói, có một số câu lệnh nhập trong lớp. Khi mã byte được tạo cho lớp đó, điều gì sẽ xảy ra với các câu lệnh nhập này.tuyên bố nhập mã byte có nghĩa là

Nếu các câu lệnh nhập bị bỏ qua trong thời gian chạy, các phụ thuộc vào các phương thức lớp đó được giải quyết như thế nào trong thời gian chạy.

+4

Tại sao không tìm ra cho chính mình? Viết một vài biến thể của một lớp: một sự phụ thuộc vào các lớp bên ngoài, một dựa trên (ví dụ) 'java.util.List' thông qua nhập khẩu, và một dựa vào' List' nhưng sử dụng nó hoàn toàn đủ điều kiện (không nhập). Sau đó sử dụng 'javap -c' trên mỗi cái và xem cái gì xuất hiện. – yshavit

+1

Bổ sung cho nhận xét @yshavit, trong quá trình biên dịch, sử dụng 'javac -g: none Foo.java' để không tạo thông tin gỡ lỗi (ví dụ: số dòng) ở tất cả trong tệp' .class', sau đó so sánh các '.class'es được tạo và chúng sẽ giống hệt nhau ở cấp độ byte và điều này có thể được kiểm tra để nhận được băm cho mỗi loại. –

Trả lời

9

Mục đích của báo cáo nhập khẩu chỉ là làm cho cuộc sống dễ dàng hơn cho người đọc và tác giả của mã. Do đó, chúng được thay thế bằng các tham chiếu đến các tên lớp/phương thức có đủ điều kiện trong bytecode. Và các câu lệnh nhập không sử dụng được bỏ qua.

1

nhập khẩu trong Java chỉ là một cách viết tắt

do đó nếu bạn nhập java.util.* bạn không phải viết java.util.ArrayList trong mã của bạn nhưng có thể viết ArrayList

1

import báo cáo là chỉ có cho trình biên dịch để nó biết tên lớp (hoặc tên phương thức tĩnh) nào bạn có thể truy cập không đủ tiêu chuẩn trong mã của bạn (tức là MyClass thay vì foo.bar.MyClass). Đằng sau hậu trường, điều này chỉ được sử dụng để giải quyết các tên lớp đầy đủ mà sau đó được sử dụng trong bytecode.

+1

Nó được sử dụng để giải quyết các tên không đủ tiêu chuẩn * thành * tên đầy đủ. – EJP

+0

Đó là ý của tôi. Tôi không nên viết bằng tiếng nước ngoài trong khi vẫn còn nửa ngủ;) – Joey

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