Em Java temos que usar o + antes e depois da variavel?

Porque quando imprimir um resultado emJava temos que usar o + antes e depois da variavel?

Manda um exemplo dessa situação.

Por favor, coloque o seu código!

public String detalhes() 
{
        return "Livro{" + "titulo=" + titulo + ", autor=" + autor + "\n, totPaginas=" + totPaginas + ", pagAtual=" + pagAtual + "\n, aberto=" + aberto + ", leitor=" + leitor.getNome() +", idade=" + leitor.getIdade() +" \n, sexo="+ leitor.getSexo()+ '}';
}

Chama-se Concatenação de String

Leitura Obrigatória:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1

Obrigado.

1 curtida

Entendi. Antes de responder, vou te explicar algumas coisas.

Em C++, os operadores da linguagem (+, -, /, %, *, <<, >>, etc) servem para qualquer coisa. Você pode por exemplo, somar um objeto da classe Carro, com um objeto da classe Moto, contanto que você escreva a chamada sobrecarga de operadores (ou operator overloading). Você simplesmente escreve uma função, tipo assim:

Veiculo operator+(Moto& moto, Carro& carro) {
    ...
}

E pronto, a mágica está feita. Podemos somar motos com carros e obter um veículo de resultado. Isso também serve para strings. Se você soma duas Strings em C++, o resultado é uma nova string, com o conteúdo das duas que foram chamadas. Por isso, o operador + concatenta strings.


Quando o Java foi criado, foi tomada uma decisão: é proibido fazer sobrecarga de operadores. Não sei explicar o motivo (por ignorância mesmo, nunca fui atrás de saber), mas essa foi a decisão tomada. Operadores servem apenas para tipos primitivos numéricos e booleano. Não tem como somar objetos (como Moto e Carro) em Java com o operador de soma.

Mas pera aí: Strings são objetos. Porque é que somar duas Strings funciona?

A classe String é um caso excepcional. O projetistas da linguagem abriram uma exceção para a regra de que é proibido fazer sobrecarga de operadores. Contudo, não é realmente uma sobrecarga que acontece. Não existe uma função secreta que recebe duas Strings e retorna a concatenação.

O que acontece, por baixo dos panos, é o seguinte. Quando você soma Strings, dessa forma:

String hello = "Hello, " + "world!";

O compilador transforma esse código em:

String hello = new StringBuilder().append("Hello, ").append("world!").toString();

A classe StringBuilder faz o trabalho de concatenar as Strings, através da utilização de arrays de caracteres. Dá uma olhadinha na implementação se estiver curioso: AbstractStringBuilder e StringBuilder.

Existe mas é hard-coded/inacessível pelo usuário. Em C++ se o operador for inline o compilador também não vai gerar uma chamada de função, que é o mesmo que acontece na implementação Java.

Sim, existe mas é inacessível mesmo, e acontece apenas nos casos de números, como int + int e float + float.

Mas para o caso de Strings, não é sobrecarga. O compilador literalmente troca os + por um StringBuilder.

Nesse post o cara mostra o bytecode gerado e comprova isso.

É só syntax sugar. Não existe um operador + (uma função mesmo) que concatena as Strings.

Colega, você não entendeu meu post anterior. Eu sei o bytecode que é gerado, é análogo ao que é gerado em C++. Isso só quer dizer que o compilador fez inlining do código. Mas claro, a sobrecarga de operador no caso do Java é hardcoded no compilador, só é bom deixar claro que pra existir sobrecarga não precisa ter um chamada de metodo, basta um operador realizar mais de uma operação. Mesmo no caso de um metodo com sobrecarga o compilador poderia decidir fazer inline do mesmo. Uma coisa não tem a ver com a outra.

1 curtida

Olhando pela pergunta e vendo as respostas do @lvbarbosa e do @Kronal, me lembrei das aulas de assembly, na faculdade (para o processador do mega drive, arquitetura RISC): registrador 0 diz: ULA, some!

Sim, tem razão.