2012-03-14 44 views
6

Tôi biết rằng hàm main() có thể bị quá tải trong một lớp với trình biên dịch luôn lấy một đối số có số String[] args làm đối số chính từ nơi bắt đầu thực hiện. Nhưng là nó có thể tuyên bố cùngchúng ta có thể có một() chính trong một giao diện và triển khai khác nhau cho chính() trong các lớp học thực hiện giao diện này?

main(String args[]) in an interface and implement it in different classes differently? 

Ví dụ,

package test; 
interface test 
{ 
    public void main(String args[]); 
    public void display(); 
} 



package test; 
class Testclass1 implements test 
{ 
    public void display() 
    { 
     System.out.println("hello"); 
    } 
    public static void main(String[] args) 
    { 
     test t; 
     t.display(); 
    } 
} 


package temp; 
import test.*; 
abstract class Testclass2 implements test 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("TESTING"); 
    } 
} 

Trả lời

12

Không, bạn không thể, vì main phải là tĩnh để được sử dụng làm điểm vào và giao diện không cho phép sử dụng tĩnh.

+0

Đây là câu trả lời duy nhất +1. – Lion

+1

Và chưa có câu trả lời nào khác. ;) –

-2

đây là một lỗi biên dịch. bạn không thể ghi đè lên giao diện tĩnh không phải là phương thức tĩnh

-1

Tôi nghĩ bạn đang thiếu thứ gì đó. Các phương thức tĩnh (như phương thức chính trong Testclass1Testclass2) không thể ghi đè lên các phương thức lớp con.

+0

Giao diện không thể có 'phương pháp static' ở tất cả! – Rakesh

+0

Tôi đã nói nó ở đâu? Jeez – Johannes

+0

bạn đã không nói nó không thể! – Rakesh

2

Có hai câu trả lời cho câu hỏi của bạn.

  1. Trước hết, bạn không thể có static phương pháp trong một Interface
  2. Có bạn có thể quá tải main() phương pháp, nhưng khi bạn khởi động lớp học của bạn, chỉ có phương pháp public static void main(String args[]){} sẽ được coi như một điểm nhập cảnh.

Ví dụ

public class Test { 
    public static void main(String[] args) { 
     System.out.println("entry point)"); 
    } 

    public static void main(String arg1) { 
     System.out.println("overload2"); 
    } 

    public static void main(String arg1, String arg2) { 
     System.out.println("overload3"); 
    } 
} 

Khi bạn khởi động lớp trên, ra sẽ là "entry point"

+0

+1 cho "* bạn không thể có các phương thức' tĩnh' trong 'Giao diện' *", vì đây là câu trả lời duy nhất cho câu hỏi này. – Lion

+1

Bạn có thể sử dụng Java 8, @Lion –

0

Tôi không chắc chắn Nhưng Bạn có thể có nhiều phương pháp chính trong nhiều lớp (không cùng lớp). Chúng tôi bắt đầu chương trình với tên của lớp có phương pháp chính mà chúng tôi muốn chạy. Vì vậy, sau đó JVM sẽ tìm phương pháp chính trong lớp đó mà thôi. Vì vậy, không nên có bất kỳ vấn đề.

Tôi không chắc chắn vì vậy hãy cho tôi biết nếu tôi sai.

0

Bạn có thể tạo riêng cho mình cơ chế khởi động, nhưng tôi không chắc chắn lý do bạn muốn.

public class RunTests { 
    public static void main(String... args) throws ClassNotFoundException { 
     List<Class> classes = new ArrayList<Class>(); 
     try { 
      for (String arg : args) { 
       classes.add(Class.forName(arg)); 
      } 
     } catch (ClassNotFoundException e) { 
      if (classes.isEmpty()) 
       throw e; 
     } 
     String[] remainingArgs = Arrays.asList(args).subList(classes.size(), args.length).toArray(new String[0]); 
     for(Class clazz: classes) { 
      try { 
       Test test = (Test) clazz.newInstance(); 
       test.main(remainingArgs); 
       test.display(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

interface Test { 
    public void main(String... args); 
    public void display(); 
} 

BTW: Bạn không cần phải có phương thức main(), ví dụ:

class NoMain { 
    static { 
     System.out.println("Hello World"); 
     System.exit(0); 
    } 
} 

biên dịch và chạy mà không có lỗi.

0

bạn khai báo chính (String [] args) là tĩnh trong Testclass1, nhưng trong giao diện "test", nó không tĩnh và giao diện không cho phép chính (String [] args) là static .even nếu bạn ghi đè chính (String [] args) trong Testcalss1 là không tĩnh nó không được phép, bởi vì chính (String args) đã được định nghĩa trong Testclass1.so bạn không thể khai báo chính (String [] args) trong interface. Và u đã thực hiện thêm một lỗi nữa là khởi tạo kiểm tra giao diện như t.You không thể làm điều đó.

7

Với Java-8, bạn có thể có phương thức chính được xác định bên trong giao diện, Mã dưới đây sẽ hoạt động trong Java-8.

public interface TestInterfaces { 
    public static void main(String[] a){  
     System.out.println("I am a static main method inside Inteface !!"); 
    } 
} 
0

main() là static.so, chúng tôi không thể ghi đè methods.Interfaces tĩnh cho phép phương pháp trừu tượng phương pháp & họ sẽ được thực hiện trong subclasses.So, phương pháp trừu tượng không bao giờ có static.finally tôi kết luận rằng main() là không thể thực hiện trong giao diện.

-1

Trả lời: Có, chúng tôi có thể cung cấp triển khai thực hiện khác nhau() được khai báo trong giao diện và các lớp thực hiện giao diện đó bằng phương pháp ghi đè và có thể quá tải phương thức tĩnh tĩnh nếu được xác định trong giao diện.

Một số thêm thông tin về thay đổi giao diện trong Java 8.

Trước Java 8, nó đã không thể xác định phương pháp bên trong giao diện.

Nhưng có những thay đổi được thực hiện đối với Java 8 liên quan đến giao diện mà người ta có thể DEFINE phương thức mặc định và tĩnh bên trong giao diện. Do đó dưới đây mã sẽ làm việc tốt mà không có bất kỳ vấn đề.

public interface TestInterfaces { 
    public static void main(String[] a){  
     System.out.println("I am a static main method inside Inteface !!"); 
    } 
} 

Để biết thông tin về vấn đề này các tính năng, vui lòng tham khảo bên dưới liên kết: http://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method

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