Sobrecarga

É possível, em várias linguagens de programação, definir duas ou mais funções de mesmo nome, porém com os tipos dos parâmetros diferentes. Assim, o compilador olha quais valores foram passados por parâmetro para uma função para descobrir qual deve ser chamada. Por exemplo:

void foo() {
    System.out.println("Calling foo()...");
}

void foo(int x) {
    System.out.printf("Calling foo(%d)...\n", x);
}

void foo(String s) {
    System.out.printf("Calling foo(%s)...\n", s);
}

void foo(String s, int x) {
    System.out.printf("Calling foo(%s, %d)...\n", s, x);
}


void main(String[] args) {
    foo();          // => Calling foo()...
    foo(3);         // => Calling foo(3)...
    foo("Hey", 2);  // => Calling foo(Hey, 2)...
    foo("Dude");    // => Calling foo(Dude)...
}

Esse mecanismo (de poder ter funções com mesmo nome, porém tipos dos parâmetros diferentes) se chama "Sobrecarga de função". Perceba que é essencial que as funções mantenham uma assinatura diferente.