2012-11-15 32 views
20

Có thể tồn tại hai phương pháp chính trong một chương trình Java không? Chỉ bằng sự khác biệt trong lập luận của họ như:Có thể tồn tại hai phương pháp chính trong một chương trình Java không?

và thứ hai có thể

public static void main(StringSecond[] args) 

Nếu có thể, trong đó phương pháp sẽ được sử dụng như là điểm tuyển sinh? Làm cách nào để xác định điều này? Hãy giúp tôi.

+6

Đây sẽ là hợp pháp Java, nhưng chữ ký entry point được quy định rõ ràng là 'String [ ] '. Bạn có thể có một điểm vào ** mỗi lớp **. Bạn thậm chí có thể tạo một lớp lồng nhau ** tĩnh với chính 'main' của nó. –

Trả lời

18

Miễn là tham số phương pháp (số (hoặc) loại) khác nhau, có, chúng có thể. Nó được gọi là overloading.

phương pháp quá tải được phân biệt bởi số lượng và kiểu của các đối số được truyền vào phương pháp

chỉ phương pháp chính với đơn String[] (hoặc) String... như param sẽ được coi là điểm nhập cảnh cho chương trình.

+1

Tôi nghĩ câu trả lời của Swarish tốt hơn và hoàn chỉnh hơn. –

4

Chỉ tính số public static void main(String[] args). Đây là chữ ký duy nhất được coi là chính đúng() (như là điểm vào chương trình, ý tôi là).

5

Đó sẽ là mã có thể biên dịch, miễn là StringSecond là một lớp học. Tuy nhiên, nếu bằng "phương pháp chính" bạn có nghĩa là một điểm vào thứ hai vào chương trình, sau đó câu trả lời cho câu hỏi của bạn vẫn không có. Chỉ có tùy chọn đầu tiên (public static void main(String[] args)) có thể là điểm vào trong chương trình của bạn. Tuy nhiên, hãy lưu ý rằng nếu bạn đặt phương thức main(String[]) thứ hai trong một lớp khác (nhưng trong cùng một dự án), bạn có thể có nhiều điểm vào có thể vào dự án mà sau đó bạn có thể chọn. Nhưng điều này không thể xung đột với các nguyên tắc của trọng lượng hoặc quá tải. Cũng cần lưu ý rằng một nguồn gây nhầm lẫn trong lĩnh vực này, đặc biệt là đối với các lập trình viên giới thiệu, là public static void main(String[] args)public static void main(String ... args) đều được sử dụng làm điểm nhập cảnh và được coi là có cùng chữ ký phương thức.

0

Câu trả lời là không; chỉ có một phương pháp "chính" - nơi "chính" có nghĩa là một điểm vào mà bạn có thể "chạy".

Bạn có thể mã các phiên bản quá tải như trong ví dụ của mình, nhưng chúng không thể "chạy" được.

+3

Bạn có thể có các phương thức chính trong hai lớp khác nhau. –

7

Có thể có nhiều phương pháp chính trong một chương trình. Những người khác là phương pháp quá tải. phương pháp quá tải này hoạt động tốt dưới một phương pháp chính đơn

public class MainMultiple{ 

    public static void main(String args[]){ 
     main(122); 
     main('f'); 
     main("hello java"); 
    } 

    public static void main(int i){ 
     System.out.println("Overloaded main()"+i); 
    } 

    public static void main(char i){ 
     System.out.println("Overloaded main()"+i); 
    } 

    public static void main(String str){ 
     System.out.println("Overloaded main()"+str); 
    } 
} 
0

Có thể có nhiều hơn một phương pháp chính trong một chương trình duy nhất. Nhưng JVM sẽ luôn gọi phương thức main() của String []. Phương thức khác sẽ hoạt động như một phương thức Overloaded. Những phương pháp quá tải của chúng tôi phải gọi một cách rõ ràng.

0

khả năng hai phương thức chính (String [] args) trong cùng phạm vi tạo ra sự nhầm lẫn cho JVM. Nó không sử dụng chúng như là các phương thức quá tải. Vì vậy, chữ ký về các tham số) phải khác nhau.

1

Trong Java, bạn chỉ có thể mộtpublic static void main(String[] args)cho mỗi lớp. Có nghĩa là, nếu chương trình của bạn có nhiều lớp, mỗi lớp có thể cópublic static void main(String[] args). Xem JLS để biết chi tiết.

-1

tôi đã kiểm tra phiên bản java 1.6.0_32 nhiều phương pháp chính đang hoạt động nhưng có một phương pháp chính như công cộng tĩnh void chính (String [] args) của chữ ký loại. Ex là ở đây mà tôi đã thử nghiệm.

public class mainoverload 
{ 
public static void main(String a) 
{ 
    System.out.println("\nIts "+a); 
} 
public static void main(String args[]) 
{ 
    System.out.println("\nIts public static void main\n"); 
    mainoverload.main("Ankit"); 
    mainoverload.main(15,23); 
    mainoverload.main(15); 
} 
public static void main(int a) 
{ 
    System.out.println("\nIts "+a); 
} 
public static void main(int a,int b) 
{ 
    System.out.println("\nIts "+a+" "+b); 
} 
}  
14

Ở đây bạn có thể thấy rằng có 2 public static void main (String args[]) trong một tập tin duy nhất với tên Test.java (đặc biệt là không sử dụng tên của tập tin như một trong những cái tên 2 lớp) và 2 lớp học với mặc định truy cập specifier.

class Sum { 

    int add(int a, int b) { 
     return (a+b); 
    } 

    public static void main (String args[]) { 
     System.out.println(" using Sum class"); 
     Sum a = new Sum(); 
     System.out.println("Sum is :" + a.add(5, 10)); 
    } 

    public static void main (int i) { 
     System.out.println(" Using Sum class main function with integer argument"); 
     Sum a = new Sum(); 
     System.out.println("Sum is :" + a.add(20, 10)); 
    } 
} 

class DefClass { 

    public static void main (String args[]) { 
     System.out.println(" using DefClass"); 
     Sum a = new Sum(); 
     System.out.println("Sum is :" + a.add(5, 10)); 
     Sum.main(null); 
     Sum.main(1); 
    } 
} 

Khi chúng tôi biên dịch Test.java mã nó sẽ tạo ra 2 .class file (tức Sum.classDefClass.class) và nếu chúng ta chạy Test.java chúng ta không thể chạy nó vì nó sẽ không tìm thấy bất kỳ lớp học chính với tên Kiểm tra. Thay vào đó, nếu chúng tôi thực hiện java Sum hoặc java DefClass cả hai đều sẽ cung cấp kết quả đầu ra khác nhau bằng cách sử dụng khác nhau main(). Để sử dụng phương pháp chính của lớp Sum, chúng tôi có thể sử dụng tên lớp Sum.main(null) hoặc Sum.main(1)//Passing integer value in the DefClass main().

Trong phạm vi lớp, chúng tôi chỉ có thể có một public static void main (String args[]) mỗi lớp vì phương pháp tĩnh của một lớp thuộc về một lớp chứ không phải đối tượng của lớp và được gọi bằng tên lớp của nó. Ngay cả khi chúng ta tạo ra nhiều đối tượng và gọi các phương thức tĩnh giống nhau bằng cách sử dụng chúng thì trường hợp của phương thức tĩnh mà cuộc gọi này sẽ tham chiếu sẽ giống nhau.

Chúng tôi cũng có thể thực hiện quá tải phương thức chính bằng cách chuyển các nhóm đối số khác nhau trong chính. Ví dụ tương tự được cung cấp trong đoạn mã trên nhưng theo mặc định luồng điều khiển sẽ bắt đầu bằng public static void main (String args[]) của tệp lớp mà chúng tôi đã gọi bằng cách sử dụng java classname. Để gọi phương thức chính với các bộ đối số khác, chúng ta phải gọi nó một cách rõ ràng từ các lớp khác.

1

Chữ ký của phương pháp chính phải

public static void main(String[] args) 
  • tên của tham số có thể được bất kỳ tên hợp lệ
  • Các vị trí của các từ khóa tĩnh và công chúng có thể được trao đổi
  • Mảng Chuỗi có thể sử dụng cũng cú pháp varargs

Một lớp có thể xác định nhiều phương thức với tên chính. Chữ ký của các phương thức này không khớp với chữ ký của phương pháp chính. Những phương pháp khác có chữ ký khác nhau không được coi là phương pháp "chính".

1

Có thể có hai chính() trong cùng một chương trình. Ví dụ, nếu tôi có một lớp Demo1 như dưới đây. Biên dịch tệp này sẽ tạo tệp Demo1.class. Và một khi bạn chạy nó, nó sẽ chạy main() có mảng đối số String theo mặc định. Nó thậm chí sẽ không sniff tại chính() với int đối số.

class Demo1 { 
static int a, b;  
public static void main(int args) { 
    System.out.println("Using Demo1 class Main with int arg"); 
    a =30; 
    b =40; 
    System.out.println("Product is: "+a*b); 
} 
public static void main(String[] args) { 
     System.out.println("Using Demo1 class Main with string arg"); 
     a =10; 
     b =20; 
     System.out.println("Product is: "+a*b); 

} 
}  

Output: 
Using Demo1 class Main with string arg 
Product is: 200 

Nhưng nếu tôi thêm một lớp khác có tên Anonym và lưu tệp dưới dạng Anonym.java.Bên trong, tôi gọi lớp chính Demo1() [hoặc tham số int hoặc đối số chuỗi một]. Sau khi biên dịch tập tin Anonym.class này được tạo ra.

class Demo1 { 
    static int a, b;  
public static void main(int args) { 
    System.out.println("Using Demo1 class Main with int arg"); 
    a =30; 
    b =40; 
    System.out.println("Product is: "+a*b); 
} 
public static void main(String[] args) { 
    System.out.println("Using Demo1 class Main with string arg"); 
    a =10; 
    b =20; 
    System.out.println("Product is: "+a*b);   
} 
}  

class Anonym{ 
public static void main(String arg[]) 
{ 

    Demo1.main(1); 
    Demo1.main(null); 
} 
} 


Output: 
Using Demo1 class Main with int arg 
Product is: 1200 
Using Demo1 class Main with string arg 
Product is: 200 
0

Mã dưới đây trong tập tin "Locomotive.java" sẽ biên dịch và chạy thành công, với kết quả thực hiện cho thấy

2<SPACE> 

Như đã đề cập trong bài viết ở trên, quy tắc quá tải vẫn làm việc cho phương pháp chính. Tuy nhiên, điểm nhập là nổi tiếng psvm (public static void main (String [] args))

public class Locomotive { 
    Locomotive() { main("hi");} 

    public static void main(String[] args) { 
     System.out.print("2 "); 
    } 

    public static void main(String args) { 
     System.out.print("3 " + args); 
    } 
} 
Các vấn đề liên quan