Sans la généricité bien utilisée, pour appeler tes méthodes de l'objet humain sur les objets de ton Vector, tu devrais faire :
Object objet = population.get(i);
if (objet instanceof Humain)
{
Humain humain = (Humain)objet;
humain.maMethode;
// ou on peut faire : ((Humain)objet).maMethode; à la place des deux lignes
}
Concernant ta première utilisation en "Vector<Object>", c'est exactement comme si tu écrivais "Vector" en fait. La syntaxe change, mais le sens en est exactement le même.
En utilisant bien, comme l'écris String[]args, "Vector<Humain>". Avec ceci, ton vector contient normalement uniquement des objets de type Humain, donc tu n'auras pas à passer par le test du type et le transtypage.
Concernant le "for" que String[]args utilise, je pense que tu l'as déjà vu, mais c'est un "for each", qui est disponible en Java depuis la version 1.5. C'est un simple sucre syntaxique pour éviter d'écrire toujours le même code de parcours de collection via un itérateur (bien que cette méthode là soit toujours aussi valable, et est même à privilégier dans certains cas).
Concernant ce genre de retour : "Homme@1fb8ee3 ". C'est le retour standard de la méthode toString(), qui est appelée par défaut lors d'un affichage quelconque. Cela représente le type de l'objet, puis son adresse. Pour avoir un p'tit truc qui va bien, redéfinir toString() dans ses objets (mais je pense que ce paragraphe fait aussi doublon).