Não entendi a seguinte parte da explicação: "o compilador não sabe qual deles você deseja invocar pois os tipos que são argumentos do construtor não possuem herança entre si (um não herda necessariamente do outro)."
Não entendi a seguinte parte da explicação: "o compilador não sabe qual deles você deseja invocar pois os tipos que são argumentos do construtor não possuem herança entre si (um não herda necessariamente do outro)."
Não fiz esse curso ainda, mais isso é simples de entender. Se você tiver dois construtores, que recebem duas Strings por exemplo, na hora de compilador o compilador não vai saber qual dos dois chamar por são dois construtores que recebem dois parâmetros iguais.
Exemplo:
private String recebeTeste;
public Teste(String teste) {
this.recebeTeste = teste;
}
E se caso houver um outro construtor:
private String recebeTeste2;
public Teste(String teste2){
this.recebeTeste2 = teste2;
}
Nesse caso o compilador não sabe se invoca o primeiro ou o segundo construtor, é necessário ter alguma diferença entre eles. Seja no tipo recebido ou no parâmetro passado, e ainda mais, você pode ter vários construtores em uma classe e um construtor ainda pode ser pai de outro.
Entendido? Abraços, e bons estudos. Espero ter esclarecido sua dúvida.
Olá Otávio, tudo bem?
Dado o código do exercício 11, relativo a criação e manipulação de Strings:
class A {
public static void main(String[] args) {
String s2 = new String(null);
System.out.println(s2);
}
}
Quando chamamos o construtor da String: new String(null), estamos chamando um dos muitos construtores sobrecarregados da classe.
No javadoc, há todos os construtores da classe String, dentre os quais apenas um não recebe nenhum parâmetro: String(). link para o javadoc da String: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
Nos demais, você pode passar argumentos diferentes, como por exemplo, referências para objetos String, StringBuffer e StringBuider.
Estas três classes, herdam diretamente de Object.
Poderíamos fazer, por exemplo:
String s1 = new String("certificação");
String s2 = new String(s1); // s1 é uma referência para String.
String s3 = new String( new StringBuilder("certificação") );
String s4 = new String( new StringBuffer("certificação") );
Desta forma, quando passamos uma referência nulla, String s = new String(null) como poderemos afirmar que é uma referência a um StringBuilder ou StringBuffer?
Tanto que se você tentar compilar o código do exercício, ocorrerá o seguinte erro:
error: reference to String is ambiguous, both constructor String(StringBuffer) in String and constructor String(StringBuilder) in String match
String s2 = new String(null);
^
Os construtores em questão, de fato, "não herdam um do outro".
Caso esteja utilizando alguma IDE para estudar para a certificação(como o eclipse, por exemplo), eu aconselho a não fazê-lo. Acho interessante treinar tentando prever o que irá acontecer: Compila? Executa? Lança Exceção?.....
O que acha?
Grande Abraço!