2011-10-03 35 views
5

OK, do đó, tệp nguồn java phải có ít nhất một lớp công khai và tệp phải được gọi là "class-name.java". Đủ công bằng.Biên dịch Java của tệp .java không có lớp công khai

Do đó, nếu tôi có một lớp học, thì sau đây sẽ biên dịch:

public class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

Nhưng điều làm tôi phát cáu là nếu tôi loại bỏ các sửa đổi lần truy cập 'công' từ mã trên, các mã vẫn biên dịch. Tôi chỉ không nhận được nó. Loại bỏ nó, mã trông giống như:

class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

Trong đoạn mã trên, kể từ khi tôi loại bỏ các sửa đổi lần truy cập 'công cộng', lớp học của tôi có mặc định hoặc đóng gói truy cập riêng, tức là nó không thể được truy cập từ thế giới bên ngoài , chỉ từ bên trong gói.

Câu hỏi của tôi là, mã trên được biên dịch như thế nào? Tệp HelloWorld.java trong trường hợp này không có lớp HelloWorld 'public' (chỉ có lớp HelloWorld.class riêng) và do đó sự hiểu biết của tôi không được biên dịch.

Đánh giá cao thời gian của bạn khi trả lời các câu hỏi của tôi!

regards, anon

+0

* "tệp nguồn java phải có ít nhất một lớp công khai" * Không, [không cần phải có bất kỳ thứ gì.] (Http://stackoverflow.com/q/7791487/1134080) – ADTC

Trả lời

1

Bạn có thể đặt ngoài công lập lớp học trong một tập tin, và nó không phải là một lỗi nhưng tính năng.

Sự cố của bạn ở cấp độ đóng gói, không biên dịch. Bởi vì bạn có thể biên dịch tập tin này với những người không public class, nhưng bạn không thể gọi nó từ bên ngoài, vì vậy nó không làm việc như lớp cơ sở ứng dụng

Như thế này:

// [+] single file: SomeWrapper.java 

public class SomeWrapper { 
    ArrayList<_PrivateDataType> pdt; 
} 
// [-] single file: SomeWrapper.java 

// [+] single file: _PrivateDataType.java 
class _PrivateDataType { 
    // members, functions, whatever goes here 
} 

// [-] single file: _PrivateDataType.java 
+0

Cảm ơn , nhưng quan điểm của tôi không phải là thêm một kiểu dữ liệu cá nhân hay bất cứ thứ gì. Câu hỏi của tôi là làm thế nào để biên dịch mã trên và/làm việc kể từ đây tôi có một tập tin .java, nhưng không có bất kỳ lớp nào trong nó. Lớp duy nhất bên trong nó là một lớp riêng tư, không phải là lớp công khai. – anon1981

+0

Và đâu là vấn đề? Bạn có thể tạo một lớp khác trong cùng một gói (với cùng một hiệu ứng) và sử dụng lớp gói riêng đó. –

+0

Một lần nữa, câu hỏi của tôi không phải là thêm bất kỳ lớp mới nào trong tệp. Tôi chỉ quan tâm đến quyền truy cập gói riêng tư. – anon1981

6

một file nguồn java phải có ít nhất một lớp công khai và tệp phải được gọi là class-name.java

Không chính xác, lớp cấp cao nhất không được công bố công khai. Trạng thái JLS;

Nếu loại cấp cao nhất hoặc loại giao diện không được khai báo công khai, thì nó chỉ có thể được truy cập từ bên trong gói được khai báo.

Xem http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285 phần 6.6.1.

+0

Cảm ơn! Vì vậy, bạn có nói rằng bất cứ ai gọi chính() gọi nó từ một số loại bối cảnh gói? Đó là, người gọi (JVM có lẽ) mà gọi main() là trong cùng một gói như lớp HelloWorld của tôi? Chỉ cần bối rối! Vì vậy, cảm ơn vì đã dành thời gian để trả lời câu hỏi của tôi. – anon1981

+0

Ngoài ra, bạn có thể xác định nhiều lớp không công khai trong một tệp java. –

+0

Vì vậy, bây giờ câu hỏi của tôi là: HelloWorld là một gói riêng lớp trong lớp mặc định, tôi có phải không? Vì vậy, nó nên được truy cập từ bên trong gói mặc định nhưng không phải từ bên ngoài gói mặc định, phải không? Vì vậy, suy luận thêm, khi main() được gọi, nó phải được gọi từ * trong * gói mặc định, tôi có đúng không? Hoặc, bất cứ ai gọi main() nằm trong cùng một gói với lớp HelloWorld. Đúng ? – anon1981

-1

Khi bạn không chỉ định công cụ sửa đổi truy cập của lớp (hoặc trường hoặc phương thức của lớp), nó được gán quyền truy cập "mặc định". Điều này có nghĩa là nó chỉ có thể truy cập từ bên trong cùng một gói (trong trường hợp này là gói mặc định).

Trang web Javabeginner.com có một bài viết về chủ đề - bạn nên làm quen với các công cụ sửa đổi truy cập trong Java, hoặc từ trang web này, hoặc các trang khác.

1

Phương pháp chính giống như bất kỳ phương pháp nào khác. Sự khác biệt duy nhất là nó có thể được gọi từ dòng lệnh với lệnh java. Ngay cả khi phương thức chính không nhìn thấy được từ dòng lệnh, lớp vẫn có thể được sử dụng giống như bất kỳ lớp Java nào khác và phương thức chính của bạn có thể được gọi bởi một lớp khác trong cùng một gói. Do đó tôi có ý nghĩa rằng nó biên dịch.

Trong chức năng chính của Java không phải là đặc biệt theo bất kỳ nghĩa nào. Chỉ tồn tại một lệnh thiết bị đầu cuối có thể gọi các phương thức tĩnh được gọi là chính ...

+1

Vì vậy, bây giờ, lớp HelloWorld có khả năng truy cập gói riêng. Vì vậy, bất cứ ai gọi chính (JVM?) Bây giờ cũng phải được trong cùng một gói, phải không? – anon1981

+0

Tôi gọi trực tiếp từ một lớp java rồi có. Tuy nhiên, các quy tắc cho sự phản chiếu hơi khác nhau. Với sự phản chiếu, bất kỳ phương thức phi riêng nào đều có thể được gọi. JVM sử dụng sự phản chiếu để gọi phương thức chính của bạn. –

1

đó là điều không có gì đáng ngạc nhiên. Tôi cho rằng hành vi này tương tự như một trong một số trình biên dịch C/C++.

Mã như "void main() {/ ... /}" sẽ được biên dịch chính xác bởi các trình biên dịch đó, mặc dù nó không phải là mã tuân thủ tiêu chuẩn. Đơn giản chỉ cần nói, trình biên dịch trao đổi "void" với "int".

Tôi nghĩ rằng một hành vi tương tự được thực hiện bởi trình biên dịch java.

Kính trọng, xong

+0

Có vẻ như tôi đã sai. =) – xong

1

Có tập quán có giá trị trong một lớp phi công. Vì vậy trình biên dịch không đưa ra lỗi khi bạn cố biên dịch tệp.

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