Por exemplo, por que pra declarar uma variável String nome = “Java” não usamos um new?
Como não?
Não acredite, apenas, no que você vê. Lembre-se, você tem um JRE por baixo dos panos.
Da mesma maneira, lembre-se de que toda e qualquer classe em que você não define uma superclasse explicitamente e quando você não define um construtor, o compilador entende, respectivamente que
public class Foo extends Object {}
E que
public class Foo {
public Foo() {
super();
}
}
Basicamente, ao criar uma String desta maneira
String bla = "Blá blá blá";
Você está fazendo
String bla = new String("Blá blá blá");
A instrução new
é utilizada para instanciar uma classe e não para declarar variáveis.
Acontece que a sintaxe do Java permite que você inicialize uma variável no mesmo momento em que a declara, então ao invés de escrever.
String nome; // declarando
nome = "Java"; // inicializando
Você pode encurtar o código escrevendo:
String nome = "Java"; // declarando e inicializando
Não usa porque não quer, nada impede de você escrever:
String nome = new String("Java");
Acontece que o compilador Java é implementado de forma a tratar os literais entre aspas como sendo objetos do tipo String
.
Além disso ele ainda é otimizado de forma que cada literal com o mesmo conteúdo seja uma instância do mesmo objeto.
Execute o exemplo abaixo para entender:
public class Exemplo {
public static void main(String[] args) {
Exemplo exemplo = new Exemplo();
exemplo.semNew();
exemplo.comNew();
}
private void semNew() {
System.out.printf("Exemplo sem new%n");
String a = "Java";
String b = "Java";
String c = "Java";
testar(a, b, c);
}
private void comNew() {
System.out.printf("Exemplo com new%n");
String a = new String("Java");
String b = new String("Java");
String c = new String("Java");
testar(a, b, c);
}
private void testar(String a, String b, String c) {
System.out.printf(" referencia:%n");
System.out.printf(" a == a: %s%n", a == a);
System.out.printf(" b == b: %s%n", b == b);
System.out.printf(" c == c: %s%n", c == c);
System.out.printf(" a == b: %s%n", a == b);
System.out.printf(" a == c: %s%n", a == c);
System.out.printf(" b == c: %s%n", b == c);
System.out.printf(" conteudo:%n");
System.out.printf(" a.equals(a): %s%n", a.equals(a));
System.out.printf(" b.equals(b): %s%n", b.equals(b));
System.out.printf(" c.equals(c): %s%n", c.equals(c));
System.out.printf(" a.equals(b): %s%n", a.equals(b));
System.out.printf(" a.equals(c): %s%n", a.equals(c));
System.out.printf(" b.equals(c): %s%n", b.equals(c));
}
}