Diz-se que quando eu uso esse comando Cliente cliente = new Cliente(); eu não estou criando, mas alocando espaço em memória para criação do objeto. E se na classe eu tivesse definido os atributos do construtor explicitamente, já não haveria um objeto??? Ex.: No codigo a seguir, o construtor Cliente() define que todos os objetos criados tenham o nome ‘Albert’. No método main, quando eu faço Cliente cliente = new Cliente();, o objeto cliente já não está setado com o nome ‘Albert’?? E mesmo que eu não tivesse definido no construtor valor algum, o objeto não teria valores nulos? Sendo assim, Cliente cliente = new Cliente(); não estaria já criando um objeto, ao invés de alocar espaço?? O que vcs acham??
Olá, ao postar códigos, por favor, use a tag code, como descrito aqui.
É, impossível criar um objeto sem alocar memória. A memória é o local onde os dados do objeto são guardados.
É o comando new que faz a alocação de memória e, seu usuário sempre fará um “new Cliente()” em algum momento.
O new é quem dispara o construtor.
Entretanto, um objeto só está efetivamente criado depois que o construtor termina sua execução. Isso porque, até que os valores internos dos objetos estejam perfeitamente inicializados, ele ainda estará num estado inconsistente.
R
r063rio
ViniGodoy:
Olá, ao postar códigos, por favor, use a tag code, como descrito aqui.
É, impossível criar um objeto sem alocar memória. A memória é o local onde os dados do objeto são guardados.
É o comando new que faz a alocação de memória e, seu usuário sempre fará um “new Cliente()” em algum momento.
O new é quem dispara o construtor.
Entretanto, um objeto só está efetivamente criado depois que o construtor termina sua execução. Isso porque, até que os valores internos dos objetos estejam perfeitamente inicializados, ele ainda estará num estado inconsistente.
Então, eu posso afirmar que o comando Cliente cliente = new Cliente();, no fim de sua execução, faz duas coisas…aloca espaço em memória(com o comando Cliente cliente; - identificando esse espaço na memória com o nome ‘cliente’) e já cria o objeto cliente(via comando new Cliente())…com os valores padrões(no construtor, nulos, ou previamente definidos).
Resumindo, basta essa linha de comando para que as 2 coisas sejam feitas.
Correto?
ViniGodoy
Sim, isso mesmo.
Então, revisando:
O comando
Clientecliente;
Sem o new cria apenas uma variável de referência. Ou seja, um valor inteiro que aponta para um local de memória, onde o objeto Cliente estará. Como inicialmente não existe objeto cliente, ele aponta para um endereço especial chamado de null (sem valor).
Quando você faz:
cliente=newCliente();
O new imediatamente aloca toda a memória necessária para o objeto do tipo Cliente existir. Ou seja, o espaço de todos os tipos primitivos e referências que estejam declarados nessa classe.
Então o new dispara o construtor, que inicializará o objeto. Esse construtor pode disparar outras construções de objetos internos. Até que o construtor termine, o objeto tem a memória alocada, mas não está completamente construído.
Poucas linguagens de programação permitem separar os dois conceitos em dois comandos. Uma delas é o C++ (embora não seja o usual e o padrão seja usar igual no Java).
R
r063rio
Tá, então, se na minha classe Cliente houver 2 atributos, o nome, tipo string, e idade, tipo inteiro, o comando new Cliente() alocará espaço na memória para o valor máximo desses 2 tipos. No caso de inteiro, 4 bytes; e no caso de string, o tamanho máximo que esse tipo suporta; se fosse um booleano, 1 byte(0 ou 1, se for falso ou verdadeiro).
O espaço da String em si só será alocado quando ela for inicializada. Aí, como ela é um objeto comum, o construtor dela irá alocar bytes da mesma forma. Mas para saber a quantidade exata teríamos que saber quais são os campos privados da classe String.