2012-05-04 24 views
17

thể trùng lặp:
Why filename in java should be same as class name?Tại sao một tệp Java có cùng tên với lớp công khai của nó?

Tôi có một file có tên temp.java. Tôi đã viết mã sau đây. Tại sao điều này hoạt động?

class demo //not public keyword and not same as filename 
{ 
    public static void main(String []args) 
    { 
     System.out.println("this is Main method"); 
    } 
} 

Mọi lý do tại sao tính năng này không hoạt động?

public class demo 
{ 
    public static void main(String []args) 
    { 
     System.out.println("this is Main method"); 
    } 
} 
+9

Vì đó là * luật *! –

+0

Vui lòng xem liên kết sau http://wiki.answers.com/Q/Why_do_file_name_and_class_name_always_coincide_in_Java –

+1

Câu hỏi này được đánh dấu là trùng lặp như thế nào mà không có liên kết đến quảng cáo lừa đảo? Đây có phải là một số phép thuật 2012 di sản không? – Zsw

Trả lời

21

Trong ví dụ đầu tiên của bạn, lớp học của bạn là thực sự khai báo là "gói tin" (không bổ), có nghĩa là chỉ có các lớp học trong cùng một gói có thể truy cập vào nó. Trong ví dụ thứ hai của bạn, bạn đã tuyên bố nó là công khai.

Đây là trường hợp trình biên dịch đã đáp ứng JLS khá tốt.

The JLS states:

Khi gói được lưu trữ trong một hệ thống tập tin (§7.2.1), hệ thống máy chủ có thể chọn để thực thi các hạn chế đó nó là một lỗi thời gian biên dịch nếu một loại không tìm thấy trong một tệp 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.

Điều này có nghĩa là, đối với kịch bản 1, điều đó bởi vì bạn chỉ có temp.java với gói lớp tin demo, nó không được gọi bằng mã trong bất kỳ đơn vị biên soạn khác của gói, do đó nó sẽ biên dịch mà không vấn đề .

Kịch bản thứ hai của bạn đã tuyên bố lớp công khai - có nghĩa là nó có khả năng truy cập từ mã trong các gói khác - vì vậy nó phải tuân theo các tiêu chuẩn tên lớp bằng tên tệp.

Nếu bạn tạo một lớp khác trong kịch bản đầu tiên của bạn (trong cùng một gói) và sau đó cố gắng tham khảo lớp demo, bạn sẽ gặp phải lỗi biên dịch.

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