2011-01-28 20 views

Trả lời

9

Vâng, đó không phải là giới hạn bắt buộc trong Java. Đó là một đặc điểm kỹ thuật ngôn ngữ Java được đề cập như một tùy chọn . Từ section 7.6 of the JLS:

Khi gói được lưu trữ trong hệ thống tệp (§7.2.1), hệ thống máy chủ có thể chọn thực thi hạn chế đó là lỗi biên dịch nếu không tìm thấy loại tệp nào dưới tên bao gồm tên loại cộng với phần mở rộng (chẳng hạn như .java hoặc .jav) nếu một trong các điều sau là đúng:

  • Loại được tham chiếu bằng mã trong các đơn vị biên dịch khác của gói, trong đó loại được khai báo.
  • Loại được công bố công khai (và do đó có khả năng truy cập từ mã trong các gói khác).

Hạn chế này ngụ ý rằng phải có tối đa một loại như vậy trên mỗi đơn vị biên dịch. Hạn chế này làm cho nó dễ dàng cho một trình biên dịch cho ngôn ngữ lập trình Java hoặc thực hiện một máy ảo Java để tìm một lớp có tên trong một gói; ví dụ, mã nguồn cho một loại công khai wet.sprocket.Toad sẽ được tìm thấy trong một tập tin Toad.java trong thư mục wet/sprocket, và mã đối tượng tương ứng sẽ được tìm thấy trong tập tin Toad.class trong cùng một thư mục.

Nhưng về cơ bản nó ở đó để khuyến khích bạn làm cho nguồn của bạn dễ điều hướng hơn. Nếu bạn biết tên của một lớp công khai, nó thường khá dễ dàng để tìm mã nguồn cho nó.

+3

Đây là một hạn chế không bắt buộc, nhưng (AFAIK) mọi cài đặt Java chính (trình biên dịch, các JVM, IDE, vv) thực thi nó. –

+0

ok tôi hiểu rằng quy tắc này dành cho quy ước để điều hướng tệp nguồn và lớp dễ dàng. Nhưng tại sao tôi không thể có nhiều tệp công khai và tại sao cùng một quy ước không được áp dụng cho lớp không công khai (gói mặc định) – saravanan

+2

@ user587072: Ý của bạn là gì "tại sao tôi không thể có nhiều hơn một tệp công khai"? Một tệp không công khai, một lớp là. Và nếu bạn có nhiều hơn một lớp công khai, họ không thể * cả hai * có tên liên quan - vì vậy ít nhất một trong số họ sẽ khó tìm hơn. Về lý do tại sao nó không áp dụng cho các lớp ngoài công lập: có lẽ điểm là các nhà phát triển có nhiều khả năng muốn tìm mã nguồn cho một lớp công khai hơn một lớp công cộng. Nhưng tôi thực sự chỉ đoán, phải trung thực. Tôi nghĩ rằng quy ước có ý nghĩa đối với tất cả các lớp nếu có thể. –

1

Có, đó là đặc điểm kỹ thuật của ngôn ngữ Java ...

1

Lý do là, đây là quy ước. Ngoài ra, trình nạp lớp mong đợi một lớp trong một tệp cụ thể. Bạn có thể viết trình nạp lớp của riêng mình để tránh hạn chế này, nhưng không có lý do chính đáng để làm điều này. Mọi người nhìn vào mã của bạn sẽ bị lẫn lộn. ;)

Tuy nhiên, bạn có thể tạo các lớp "nhiều" trong một tệp bằng cách tạo các lớp bên trong. Tôi biết, nó không giống nhau, nhưng thông thường bạn nên suy nghĩ về những điều quan trọng hơn lý do tại sao chỉ có một lớp trong một tập tin.

+0

Nó không chỉ là một quy ước. Đây là một hạn chế tùy chọn được chỉ định rõ ràng trong JLS. –

0

Nó ở đó để trình biên dịch có thể tìm mã nguồn của các lớp phụ thuộc.

0

@saravanan. Tôi đã thực hiện một số chương trình đơn giản cho thấy rằng chỉ một lớp mặc định duy nhất (tức là một lớp không có trình xác định truy cập) có phương thức chính hoạt động tốt trong java khi bạn lưu tên tệp với tên lớp mặc định.

Để thêm vào lý do đặt tên tệp bằng tên lớp công khai, trong tài liệu tôi đã xem chi tiết về trạng thái này mà JVM tìm kiếm lớp công khai (vì không có giới hạn và có thể truy cập từ bất kỳ vị trí nào) và cũng tìm kiếm public static void() trong lớp public.

Lớp công khai này hoạt động như lớp ban đầu từ nơi mà cá thể JVM cho ứng dụng java (chương trình) được bắt đầu. Khi u cung cấp nhiều lớp công khai trong một chương trình, trình biên dịch tự dừng bạn bằng cách ném một lỗi.Điều này là do sau này bạn không thể nhầm lẫn JVM là lớp nào là lớp ban đầu của nó vì chỉ có một lớp công khai với lớp là public static void main(String args[]) là lớp ban đầu cho JVM.

HOPE Tôi đã giúp bạn hiểu rõ hơn về cách đặt tên chương trình JAVA.

0

chỉ đơn giản là nhớ chỉ lớp đó sẽ được công khai trong đó có các tập tin khác chính không được công khai

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