Galera o operador new é responsável em alocar memória para as variáveis de instância, de chamar o construtor e retornar a referência do objeto?
Já o construtor é apenas responsável em executar comandos descritos dentro de seu escopo e nada mais, como por exemplo inicializar as variáveis de instância. Os construtores não são responsáveis em retornar a referência do objeto e nem em criar o objeto em si certo?
Fiquei na dúvida ao ler um artigo meio duvidoso sobre java, falando sobre chamadas explicidas de construtores da superclasse.
“O operador new cria um objeto enquanto o programa está sendo executado, obtendo memória suficiente para armazenar um objeto do tipo especificado à direita de new. O processo de criar novos objetos é também conhecido como criar uma instância ou instanciar um objeto. O operador new é conhecido como operador de alocação de memória dinâmica. O valor entre parênteses depois do tipo em um operador new é utilizado para inicializar (i. e., atribuir um valor a) o novo objeto”. (Java, como programar / H. M. Deitei e P. J. Deitei; trad. Carlos Arthur Lang Lisboa. - 4,ed. - Porto Alegre: Bookman, 2003, p.192).
[quote=dntalemao]Galera o operador new é responsável em alocar memória para as variáveis de instância, de chamar o construtor e retornar a referência do objeto?
[/quote]
Não bem. O responsável por alocar a memória é a JVM. new não é o mesmo que o maloc do C. Ele não devolve a referencia, ele devolve o objeto construido (as referencias são implicitas em java). Em resumo, ele é apenas uma forma de comandar a classe a executar o contrutor e devolver o objeto.
O construtor é um menbro da classe, não do objeto ( é um static especial)
Certo. Quando o contrutor é invocado o objeto já existe, já foi construido pela JVM. O nome certo para o contrutor deveria ser “inicializador”, mas o nome “contrutor” é melhor porque remete ao padrão Builder. O objeto já existe (vc pode usar “this”) mas ele não está em um estado consistente. O trabalho do construtor é esse, deixar o objeto em um estado consistente. Existem algumas especificidades como o uso de final em variáveis de instancia que significa que elas devem estar inicializadas quando o construtor acabar ( exactament por causa da consisência)
Em outras linguagens o construtor é mais parecido com um método estático e até é invocado como um, usando um sintaxe como Cliente.new().
No java 8 está sendo previsto que isto também exista em java isto porque a partir do java 8 teremos Functors o que singnifica que todos os métodos das classes podem virar objetos de função ( especilamente os estáticos) e como os construtores não métodos especiais eles também poderão ser transformados em functors ( encapsulados numa nova interface chamada Factory).
Na prática vc pode encarar os construtores como métodos especiais que a jvm invoca ,mas que o prrgrama não pode invocar diretamente. O new é a forma de vc comandar a jvm a invocar o construtor.