What is the difference between these 4 method signatures, and why does the 4th not work?

```
public void main(String args[]) {... } 
public void main(String[] args) {... }
public void main(String... args) {... }
public void main(String[] args[]) {... }

```