Ответ 1
Как сказали devA и VVV, это называется "varargs". Фактически следующие две строки кода эквивалентны:
public void makeLemonade(String[] args) {
и
public void makeLemonade(String... args) {
код внутри метода будет таким же, но когда он будет вызван, они будут вызываться по-разному. Первый должен быть вызван следующим образом:
makeLemonade(new String[]{"lemon1", "lemon2", "lemon3"});
в то время как вторая сигнатура метода может иметь 0 (предположительно) бесконечное количество аргументов, но все они должны быть аргументами String. Все следующие вызовы будут работать:
makeLemonade("lemon1");
makeLemonade("lemon4", "lemon7", "lemon11", "lemon12");
makeLemonade();
// ... etc ...
Тонкая разница между двумя заключается в том, что вы можете называть makeLemonade() юридически здесь, если вы используете varargs.