2010-11-18 46 views
42

Tôi đã được viết java cho một thời gian, và hôm nay tôi gặp phải khai báo như sau:Cú pháp khai báo đối số mảng Java "..." hoạt động như thế nào?

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

} 

Lưu ý "chấm chấm chấm" trong khai báo mảng, chứ không phải là khung thông thường []. Rõ ràng nó hoạt động. Trong thực tế, tôi đã viết một bài kiểm tra nhỏ và xác minh nó hoạt động. Vì vậy, tôi đã kéo ngữ pháp java để xem cú pháp của khai báo đối số này ở đâu, nhưng không tìm thấy gì cả.

Vì vậy, với các chuyên gia ở đó, công việc này hoạt động như thế nào? Nó là một phần của ngữ pháp? Ngoài ra, trong khi tôi có thể khai báo hàm như thế này, tôi không thể khai báo một mảng trong cơ thể của hàm như thế này.

Dù sao, bạn có biết nơi nào có tài liệu này không. Đó là sự tò mò, và có lẽ không có giá trị của bất kỳ thời gian đầu tư vào nó, nhưng tôi đã stumped.

+1

Cũng xem xét http://stackoverflow.com/questions/315846/why-null-cast/315853#315853 –

Trả lời

25

Kiểm tra các Java Language Specification, Third Edition, Chapter 8 (Classes). Chôn trong đó là nugget này:

Nếu tham số chính thức cuối cùng là tham số biến thiên của loại T, nó được coi là xác định tham số chính thức của loại T []. Phương thức này sau đó là một phương thức biến đổi. Nếu không, nó là một phương pháp chữa trị cố định. Invocations của một phương thức arity variable có thể chứa các biểu thức đối số thực tế hơn các tham số chính thức. Tất cả các biểu thức đối số thực tế không tương ứng với các tham số chính thức trước tham số arity biến sẽ được đánh giá và kết quả được lưu trữ thành một mảng sẽ được chuyển tới lời gọi phương thức (§15.12.4.2).

Về cơ bản, thông số cuối cùng của bất kỳ cuộc gọi phương thức nào đều có thể có T.... Nếu có, nó được chuyển đổi thành T[].

Vì vậy, về cơ bản, những gì bạn có là một cách ưa thích tái tạo các truyền thống hơn

String[] args 
+1

Ngoài ra, cho rằng chữ ký của tham số mảng và varargs là khác nhau, nó hoạt động như thế nào? – hexafraction

28

Tôi tin rằng điều này đã được triển khai trong Java 1.5. Cú pháp cho phép bạn gọi một phương thức với một danh sách các đối số được phân cách bằng dấu phẩy thay vì một mảng.

public static void main(String... args); 
main("this", "is", "multiple", "strings"); 

là giống như:

public static void main(String[] args); 
main(new String[] {"this", "is", "multiple", "strings"}); 

http://today.java.net/article/2004/04/13/java-tech-using-variable-arguments http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

+1

cảm ơn để so sánh! – Antonio

3

Nó có nghĩa là bạn có thể vượt qua không hay nhiều Member đối tượng với phương pháp setMembers(). Trong phương thức setMembers, members sẽ có ngữ nghĩa mảng.

6

Đó là cú pháp varargs được gọi là. Trong phần thân phương thức, bạn có thể đọc tham số members vì nó là một mảng - thực ra, nó/là/'chỉ' một mảng.

Tuy nhiên, bit ma thuật đang gọi phương thức. Trước cú pháp varargs đã được giới thiệu, bạn muốn gọi phương thức một chút như vậy:

setMembers(new Members[] {member1, member2, member3}); 

Với cú pháp varargs mới tuy nhiên, bạn không cần phải tạo ra một cách rõ ràng mảng nữa, và bạn có thể vượt qua:

setMembers(member1, member2, member3); 

Điều này có nghĩa là đối số varargs phải là đối số cuối cùng trong phương thức. Do đó, điều này không được phép:

void setMembers(Member ... members, String memberType); 

Tóm tắt: Đó là một chút đường cú pháp, thực sự. Tôi không có chuyên gia về các hoạt động bên trong của trình biên dịch Java, nhưng tôi khá chắc chắn rằng các phương thức gọi một phương thức chấp nhận tham số varargs được xây dựng lại thành các phương thức xây dựng một mảng của kiểu đã cho.

2

Variable arguments. Có thể có 0 hoặc nhiều đối số String.

Chức năng có thể truy cập các thông số dưới dạng một chuỗi các chuỗi.

+1

ok tôi nghĩ rằng tôi hiểu nó giống như: chuỗi x = "hi" chuỗi y = "bạn" printString (x, y); public void printString (String ... lời chào) { cho (int x = 0; x Winter

+1

Có, để chính xác "hi bạn ". Bạn cũng có thể sử dụng "for (String s: greetins) ..." trông đẹp hơn :) –

0

Điều này có nghĩa là phương thức chấp nhận một số biến đối số Chuỗi. Các đối số được coi là một mảng và do đó được truy cập theo chỉ số, theo thứ tự chúng được chuyển vào.

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