O exemplo do @Lucas_Camara é muito bom, a única observação é que vc não precisa criar sequencias de ifs ou switches para imprimir diferentes tipos de objetos.
Isso porque os métodos print e println já tem uma forma padrão de transformar qualquer objeto em String que é invocando, por debaixo dos panos, o método toString() que todo objeto possui.
Uma outra possibilidade é usar Generics assim:
import java.util.List;
class Main {
public static <T> void escreva(T objeto) {
System.out.print(objeto);
}
public static void main(String[] args) {
escreva("Olá");
escreva(List.of(1, 2, 3));
escreva(new Object() {
@Override
public String toString() {
return "Eu sou uma classe anônima";
}
});
}
}
Viu como eu pedi pra imprimir uma String, uma List e um outro objeto qualquer? Com a versão do Lucas também é possivel fazer isso.
Aproveitando só pra te corrigir em uma coisa:
No Java não temos funções e sim métodos.
No meu entendimento eles são parecidos, são blocos de códigos que vc pode invocar, mas sinceramente não sei se há diferenças tecnicas ou filosóficas entre elas.
Já vi gente dizer que funções são como em C em elas são declaras independentes e métodos são membros de uma classe como no Java. Só que em C++ não chamamos de métodos e sim de funções membros.
Enfim, em Java temos métodos e isso é importante para que possamos nos comunicar de forma mais efetiva.