Số biến hoặc đối số Java cho một phương thức


146

Có thể khai báo một phương thức sẽ cho phép số lượng tham số thay đổi không?

Ký hiệu được sử dụng trong định nghĩa chỉ ra rằng phương thức nào sẽ cho phép số lượng tham số thay đổi?

Trả lời: varargs


11
Vì bài tập về nhà, chúng tôi không muốn biết câu hỏi của bạn, chúng tôi chỉ muốn biết bạn đang học.
HDave

Câu trả lời:


274

Đúng rồi. Bạn có thể tìm hiểu thêm về nó trong hướng dẫn của Oracle về varargs .

Đây là một ví dụ:

void foo(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

có thể được gọi là

foo("foo"); // Single arg.
foo("foo", "bar"); // Multiple args.
foo("foo", "bar", "lol"); // Don't matter how many!
foo(new String[] { "foo", "bar" }); // Arrays are also accepted.
foo(); // And even no args.

1
Có thể làm nhiều loại thông số không? ví dụ: (Chuỗi ... strs, int ... ints). Điều gì về bất kỳ loại đối số theo thứ tự nào?
trusktr

5
@trusktr: nếu bạn muốn bất kỳ đối tượng nào, chỉ cần sử dụng Object....
BalusC

2
@trusktr Không, nguyên thủy không phải là đối tượng. Có một lời giải thích tuyệt vời về sự khác biệt ở đây: lập trình viên
Dick Lucas

5
@ Richard: Sử dụng Object... argssẽ làm việc với nguyên thủy vì autoboxing .
Sumit

1
@StevenVascellaro: Tôi giả sử rằng các đối số được xử lý như một mảng, vì vậy bạn có thể chỉ cần làmvarargs.length
LMD

15
Variable number of arguments

Có thể truyền một số lượng đối số khác nhau cho một phương thức. Tuy nhiên, có một số hạn chế:

  • Số lượng tham số biến phải cùng loại
  • Chúng được coi là một mảng trong phương thức
  • Chúng phải là tham số cuối cùng của phương thức

Để hiểu các hạn chế này, hãy xem xét phương thức, trong đoạn mã sau, được sử dụng để trả về số nguyên lớn nhất trong danh sách các số nguyên:

private static int largest(int... numbers) {
     int currentLargest = numbers[0];
     for (int number : numbers) {
        if (number > currentLargest) {
            currentLargest = number;
        }
     }
     return currentLargest;
}

nguồn Oracle Certified Associate Java SE 7 Hướng dẫn học lập trình 2012


14

Vâng nó có thể:

public void myMethod(int... numbers) { /* your code */ }

10

Đối với các loại đối số khác nhau, có 3 dấu chấm :

public void foo(Object... x) {
    String myVar1  = x.length > 0 ? (String)x[0]  : "Hello";
    int myVar2     = x.length > 1 ? Integer.parseInt((String) x[1]) : 888;
} 

Sau đó gọi nó

foo("Hii"); 
foo("Hii", 146); 

để bảo mật, hãy sử dụng như thế này:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

Hạn chế chính của phương pháp này là nếu các tham số tùy chọn thuộc các loại khác nhau, bạn sẽ mất kiểm tra kiểu tĩnh. Xin vui lòng, xem thêm các biến thể .



0

Có Java cho phép vargstrong tham số phương thức.

public class  Varargs
{
   public int add(int... numbers)
   { 
      int result = 1; 
      for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.