2013-08-12 37 views
5

Tôi có lớp học sau.Hai phương pháp chính có chữ ký khác nhau

public class Test { 

    public static void main(Integer[] args) { 
     System.out.println("This is not a main"); 
    } 

    public static void main(String[] args) { 
     System.out.println("This is the main"); 
    } 
} 

Tại đây có hai main phương pháp đó là chấp nhận Integer[]String [] như là đối số đầu vào. Câu hỏi của tôi là cách JVM luôn tải phương thức thứ hai làm phương thức chính của lớp này. Tại sao luôn xem xét đối số đầu vào là array trong số String?

+5

Quyết định thiết kế dựa trên nhận xét của SLaks. –

+6

Bởi vì đó là những gì một dòng lệnh. – SLaks

+0

Có thể trùng lặp http://stackoverflow.com/questions/10183611/using-int-instead-of-string-public-static-void-main-int-args – rozar

Trả lời

14

Vì đó là những gì Java luôn tìm kiếm. Java Language Specification, Section 12.1.4:

Phương thức chính phải được khai báo là công khai, tĩnh và vô hiệu. Nó phải chỉ định một tham số chính thức (§8.4.1) mà tuyên bố loại là mảng String

5

Vì chuỗi là thứ bạn đang truyền vào dòng lệnh.

các 45 từ

myProgram.exe 45

không phải là một số nguyên. nó là một chuỗi chứa các ký tự 45

Nó chỉ xảy ra khi bạn có thể sử dụng một chuỗi như "45" để biểu diễn một số nguyên. Sẽ khó khăn hơn một chút để thực hiện theo cách khác. (Đối với người dùng ít nhất)

+0

... Vì bạn có thể chuyển số nguyên dưới dạng Chuỗi, trong khi chuỗi như Integer khá hạn chế. –

4

Vì đối số dòng lệnh luôn là Strings.

+3

+1 để đề cập đến đối số dòng lệnh .... –

2

Chúng tôi luôn nhập args dòng lệnh như Strings. :)

0

Như những người khác đã nói, phương pháp main sẽ luôn luôn được gọi bằng JVM với tình trạng quá tải có một mảng chuỗi. Bạn được tự do để thực hiện các tình trạng quá tải khác để metod đó nếu bạn muốn. Bạn thậm chí có thể gọi cho mình trong mã của bạn. Nó chỉ là VM đặc biệt trông cho rằng một quá tải mà mất một mảng các chuỗi.

0

Đây là chữ ký chỉ được công nhận bởi JVM như CHÍNH PHƯƠNG PHÁP

Bạn có thể có nhiều phương pháp chính quá tải như bạn muốn nhưng chỉ có phương pháp với chữ ký trên sẽ được gọi bằng các jvm

0

Đối số dòng lệnh là đối số cho phương thức main() được chuyển đến phương thức đó trong thời gian chạy. Vì Java chỉ sử dụng các đối số dòng lệnh String, JVM bỏ qua phương thức main() khác mà vượt qua số nguyên.

1

Ngoài những gì người khác đã đề cập, bạn có thể sử dụng var-arg để triển khai mảng Chuỗi.

public static void main (String ...a) 
0

Chữ ký của phương pháp chính trong java là public static void main(String[] args) {} và đó là những gì của JVM tải classloader vào lúc bắt đầu của chương trình. Chính khác với một đối số Integer sẽ không được gọi trừ khi bạn đã làm nó bằng tay bên trong chính. Hãy thử sửa đổi mã của bạn như hình dưới đây và bạn sẽ nhận thấy rằng không có gì sẽ được gọi và chương trình của bạn sẽ không in bất cứ điều gì.

public class Test { 
    public static void main(Integer[] args) { 
     System.out.println("This is not a real main so nothing gets printed"); 
    } 
} 

Btw, bạn có thể viết phương thức chính bị quá tải với bất kỳ đối số nào bạn muốn. Miễn là đối số không phải là Chuỗi [] hoặc Chuỗi ... giống nhau, không có gì sẽ bắt đầu lăn chương trình.

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