2010-02-04 29 views
17

Tôi có một câu hỏi về cú pháp của việc kê khai Java main:Tại sao Java không sử dụng chính danh sách đối số độ dài thay đổi?

public static void main (String[] args) 

Vì bạn có thể vượt qua một số biến của Strings khi gọi chức năng chính, không nên này là một danh sách đối số chiều dài thay đổi chứ không phải là một mảng? Tại sao một lời gọi dòng lệnh của phương thức này với một danh sách các tham số chuỗi thậm chí còn hoạt động? (Trừ khi có xử lý đằng sau hậu trường xây dựng một mảng với danh sách các chuỗi và sau đó chuyển mảng đó vào phương thức chính ...?) Không phải tuyên bố chính là một cái gì đó giống như thế này ...? -

public static void main(String... args) 
+3

Tôi đoán đây là một mối quan tâm tương thích ngược ... –

+0

Tôi không thực sự nghĩ rằng bạn nên gọi chính chức năng chính ... Nó có nghĩa là được gọi từ máy ảo. –

+1

Tôi không tự gọi hàm chính. Tôi không nghĩ điều đó là có thể. Tôi đoán đây thực sự là một câu hỏi về các hoạt động bên trong của Java ... – froadie

Trả lời

31

main(String... args)main (String[] args) là một cách hiệu quả cùng một điều: Những gì bạn đang nhận được là một mảng String. Các varargs chỉ là cú pháp cú pháp cho người gọi.

Tôi đoán là bạn không bao giờ gọi main() từ mã, nó không được trang bị thêm khi varargs được giới thiệu.

Chỉnh sửa: Thực ra, hãy viết câu cuối cùng. main(String... args) là cú pháp hoàn toàn hợp lệ, tất nhiên. Hai phong cách hoàn toàn có thể hoán đổi cho nhau. Điều này chỉ hoạt động tốt:

public class Test { 

    public static void main(String... args) { 
     System.out.println("Hello World"); 
    } 

} 
+4

Vì vậy, khi bạn thực thi một chương trình từ dòng lệnh, bạn không thực sự trực tiếp gọi điện thoại chính? Có một số xử lý xảy ra trước khi chính được thực hiện? (ví dụ: xây dựng mảng từ các chuỗi được thông qua) – froadie

+0

Chúng không giống nhau. Người ta không thể gọi 'chính (String [] args)' là 'chính (" aaaa ")'. – fastcodejava

+3

Bạn không gọi phương thức main() bằng Java. Thời gian chạy gọi nó cho bạn. –

9

Phương pháp chính được thiết kế cho Java 1.0.

Các "..." cú pháp đã được giới thiệu trong Java 1.5

Nó thực hiện thông qua một loạt các loại bạn định nghĩa (tôi đoán, nhưng ... nếu Java 1.4 và 1.5 mã byte tương thích nên nó phải được thực hiện với mảng).

1

Cú pháp chính java trước các biến thể, chỉ được giới thiệu trong java 1.5.

0

Vâng, cú pháp thứ 2 chỉ là một biến thể của 1 và có nó sẽ được tốt đẹp nhưng nó không được xây dựng vào Java vào thời điểm

-2

này Tại sao bạn quan tâm? Không ai gọi phương pháp chính bằng tay. Nó là nội bộ cho Java.

EDIT: Tôi đoán nó không quan trọng bây giờ là bạn có thể xác định phương pháp chính như:

public static void main(String... args); 

Quan điểm của tôi vẫn còn hợp lệ như không ai gọi chính một cách rõ ràng.

+1

Nó không tạo sự khác biệt về cách tôi viết mã. Tôi chỉ quan tâm. – froadie

+0

trừ khi bạn gọi phương thức chính của một lớp khác từ lớp hiện tại của bạn ... Bạn có thể muốn làm điều đó, sau khi tất cả. –

+3

Tôi gọi "chính()" một cách rõ ràng - lý thuyết bị phá hủy – Pointy

5

Có phương pháp chính không Java, trên thực tế bạn có thể khai báo mảng như một vararg trong phương pháp chính của bạn:

public static void main(String... args) { System.out.println("Hi!"); } 
+1

Thú vị. Đánh giá bởi các câu trả lời/bình luận khác, tôi đoán cú pháp khai báo chính mới này đã được thêm vào với Java 1.5. Vì vậy, thời gian chạy Java xác định, dựa trên khai báo phương pháp chính của bạn, cho dù để vượt qua các chuỗi trực tiếp đến chính hoặc xây dựng một mảng đầu tiên? – froadie

+5

Varargs đã được giới thiệu trong Java 5 là cú pháp đường cho mảng, có nghĩa là chúng ẩn mảng thực tế, nhưng bên dưới, nó là cùng một điều, đó là lý do tại sao điều này hoạt động. Xem thêm http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html –

+0

No. Nó luôn xây dựng một mảng. Nó chỉ là một cú pháp khác để diễn tả chính xác cùng một mã cơ bản. Java sẽ vẫn phân tích cú pháp dòng lệnh args thành một mảng chuỗi, nạp lớp được tham chiếu, tìm nó là phương thức chính và gọi nó với args. – Yuliy

1

nên không khai báo chính là một cái gì đó giống như điều này...?

public static void main(String... args) 

Trên thực tế, có thể được thực hiện mà không có một vấn đề.

Đó là String [] args trước khi var args được giới thiệu nhưng hiện nay cả hai đều hoạt động.

15

Bạn có thể khai báo chính theo cách này, và nó hoạt động tốt. Không có vấn đề "tương thích ngược" hoặc "trang bị thêm". Tuy nhiên, người đọc mã của bạn có thể thấy nó mất tập trung và không có khả năng cải thiện chương trình của bạn theo bất kỳ cách nào.

The Java Language Specification (third edition) section 8.4.1 nói rằng "Nếu tham số chính thức cuối cùng là một tham số arity biến kiểu T, nó được coi là để xác định một thông số chính thức của loại T []".

Đặc điểm kỹ thuật về cách chương trình Java khởi động là trong JLS 12.2, tham chiếu chương 5 của thông số VM. VM spec section 5.2 nói rằng VM gọi phương thức lớp công khai "void main(String[])". Vì VM spec không có khái niệm về arity biến, một chính được khai báo sử dụng "..." thỏa mãn yêu cầu.

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