Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 11 da Aula 7 - Criando e Manipulando Strings

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)."

2 respostas

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.

solução!

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!