2009-08-26 47 views

Trả lời

33

Gói trong Java không được lồng vào nhau.

Khi bạn import java.awt.*, bạn chỉ nhập khẩu tất cả các lớp và các giao diện có trong gói java.awt - bạn là không nhập khẩu tất cả các gói đang được java.awt như java.awt.event.

Mặc dù có vẻ như các gói được lồng nhau (nghĩa là, có vẻ như java.awt.event là "gói phụ" của java.awt), đây không phải là trường hợp thực sự. Bạn nên xem java.awtjava.awt.event là hai gói khác nhau, không có liên quan xảy ra có một phần chung trong tên của chúng.

+1

không đúng là nhập java.awt. * Cũng tự động nhập java.awt.event? –

+15

Không - đó là điểm của Jesper. nhập java.awt. *; nhập khẩu mọi lớp có gói chính xác là java.awt. Nó không nhập bất kỳ lớp nào mà gói của nó chỉ bắt đầu bằng java.awt. – Sbodd

5

Loại nhập chỉ đầu tiên từ gói java.awt (không phải gói con của nó) và các loại nhập khác chỉ từ java.awt.event (nhưng không phải từ bất kỳ gói nào khác).

Trong khi các gói trong Java có thể (và nên) được tổ chức trong một hệ thống phân cấp, câu lệnh nhập khẩu có xu hướng "bảo thủ" - khi bạn nhập tất cả các loại từ trong gói đó, bạn chỉ nhận được các gói đó ở cấp độ đó ở cấp thấp hơn trong hệ thống phân cấp.

Tôi cho rằng lý do đằng sau nó là tránh nhập khẩu giả mạo. Nói chung, bạn nên nhập ít nhất có thể - chỉ cần những thứ cần thiết, để tránh sự liên kết, phụ thuộc và không rõ ràng (ví dụ, điều gì sẽ xảy ra nếu một lớp mới được thêm vào gói có tên xung đột với tên một gói khác?). Đó là lý do tại sao nếu bạn sử dụng Eclipse để tổ chức nhập khẩu của bạn, nó sẽ thực sự thêm các câu lệnh nhập cụ thể bên trong phiên bản dấu hoa thị, mặc dù điều đó có nghĩa là các dòng bổ sung. Nhập tất cả mọi thứ trong các gói phụ sẽ tồi tệ hơn, bạn sẽ thực sự có được mọi thứ.

Ngoài ra, một thực tế phổ biến là đặt các lớp có mục đích đặc biệt và các lớp cụ thể trong các gói con của riêng chúng. Thông thường, bạn đặc biệt muốn tránh nhập chúng trừ khi rất quan trọng. Một lần nữa, nhập khẩu toàn bộ cây con sẽ xung đột với điều đó.

0

java.awt.*không cụm từ thông dụng, đó là những gì tôi nghĩ bạn đang mong đợi/suy nghĩ.

java.awt.* sẽ chỉ cung cấp cho bạn các lớp học trong gói chính xác đó chứ không phải các gói lồng nhau. Hãy tưởng tượng các xung đột không gian tên có liên quan với bên dưới!

import com.* 

Cần lưu ý rằng hành vi được coi là không hợp lệ để sử dụng *. Giải thích việc nhập tên lớp được ưu tiên.

Để đọc thêm: Wikipedia: Namespace (Computer Science)

+0

Thậm chí có được nhập * hỗ trợ không? : -o – OscarRyz

+2

@Oscar Reyes: Không, "nhập *" không tồn tại trong Java. – Jesper

+0

đã đồng ý, không hoạt động (điều này khiến tôi ngạc nhiên). tôi sẽ thay đổi nó để không làm người khác nhầm lẫn ... –

1

Như nhiều người đã nói trước đây.

import java.awt. * Sẽ không nhập khẩu bất cứ lớp học trong java.awt.event ...

Và sự khác biệt giữa hai gói là java.awt đó.* bao gồm các lớp như Khung, Nút, v.v. và gói java.awt.event. * bao gồm tất cả các sự kiện/người nghe có thể xảy ra.

Ví dụ, để tạo Nút, bạn cần lớp java.awt.Button nhưng nếu bạn muốn bất kỳ hành động nào xảy ra khi bạn nhấp vào nút, bạn cần một java.awt.event.ActionListener sẽ "chờ" cho bấm vào, sau đó tạo ra một java.awt.event.ActionEvent.