Criando o alocando?

5 respostas
R

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??

*/

public class Cliente {

String nome;
public Cliente() {
   nome = "Albert";
}

   
public static void main(String[] args) {
    Cliente cliente = new Cliente();
    System.out.println(cliente.nome);
    //System.out.println(main.idade);
}

}

5 Respostas

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.

R

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

Cliente cliente;

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 = new Cliente();

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

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

ViniGodoy
No caso dos tipos primitivos:

byte e boolean (1 byte)

short e char (2 bytes)

int e float (4 bytes)

double e long (8 bytes)

No caso das referências (como o caso do String ou qualquer coisa que derive de Object), sempre 4 bytes.

Os arrays possuem o número de bytes acima multiplicado pelo tamanho.

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.

Criado 2 de outubro de 2011
Ultima resposta 2 de out. de 2011
Respostas 5
Participantes 2