javac không chủ động cấm điều này, nhưng nó có một hạn chế khá nhiều có nghĩa là bạn sẽ không bao giờ muốn tham khảo một lớp cấp cao nhất từ một tệp khác trừ khi nó có cùng tên với tệp.
Giả sử bạn có hai tệp, Foo.java và Bar.java.
Foo.java chứa:
Bar.java chứa:
- lớp học công cộng
- lớp Baz
Chúng ta cũng nói rằng tất cả các lớp nằm trong cùng một gói (và các tệp nằm trong cùng một thư mục).
Điều gì xảy ra nếu Foo.java đề cập đến Baz nhưng không phải là Bar và chúng tôi cố gắng biên dịch Foo.java? Việc biên dịch thất bại với một lỗi như thế này:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Điều này có ý nghĩa nếu bạn nghĩ về nó. Nếu Foo.java đề cập đến Baz, nhưng không có Baz.java (hoặc Baz. Class), làm thế nào javac có thể biết tệp nguồn nào cần tìm?
Thay vào đó, nếu bạn yêu cầu javac biên dịch Foo.java và Bar.java cùng một lúc hoặc ngay cả khi bạn đã biên dịch Bar.java trước đó (để lại Baz. Class nơi javac có thể tìm thấy nó) thì lỗi này sẽ biến mất. Điều này làm cho quá trình xây dựng của bạn cảm thấy rất không đáng tin cậy và không ổn định, tuy nhiên.
Bởi vì giới hạn thực tế, giống như "không đề cập đến một lớp cấp cao nhất từ một tệp khác trừ khi nó có cùng tên với tệp đó hoặc bạn cũng đang đề cập đến một lớp trong cùng một tệp có tên đó điều tương tự như tệp "rất khó theo dõi, mọi người thường đi theo quy ước đơn giản hơn (mặc dù chặt chẽ hơn) về việc chỉ đưa một lớp cấp cao nhất vào mỗi tệp. Điều này cũng tốt hơn nếu bạn thay đổi suy nghĩ về việc một lớp học có nên công khai hay không.
Đôi khi thực sự có một lý do chính đáng tại sao mọi người làm điều gì đó theo một cách cụ thể.