Q:

what is the difference between main(String... s) and main(String[] s)? 

class Test{
    public static void main(String... s){
        System.out.println("Hello");
    }
}

class Test{
    public static void main(String[] s){
        System.out.println("Hello");
    }
}

What is the difference between above two syntax of main() declaration? 
Does Java has any special need to have variable length argument? 

A:

No difference (when you run the program from the command line, i.e. what the main method is used for).  The first variant appeared after Java 5 introduced varargs.  
In short, varargs allows you to pass a variable number of arguments to a method.  For the method body the arguments are grouped into an array.  Like Test.main("foo", "bar") instead of Test.main(new String[] {"foo", "bar"}).  The compiler does the array creation for you behind the scene. 

A:

The only difference is if you call main directly from other Java code.  The first form allows you to write:
Test.main("first", "second", "third");

whereas the second would require you to create an array explicitly:
Test.main(new String[] { "first", "second", "third" });

Personally I don't think I've ever seen the first form used - calling main from other code is pretty rare.  There's nothing wrong with it though. 

A:

There is no difference. 
In general, String... s allows to pass arguments with comma as separator, while the String[] s requires an array. 
But in the implementation s is array in both cases.  So ... is sintactic sugar in a sense.