Olá Pessoal, tudo bom?
O artigo de hoje continua a nossa descrição sobre o mundo básico do Java e a Orientação a Objetos. Nesse artigo iremos descrever sobre a construção de objetos, mais conhecido como instâncias. Para instanciar esses objetos utilizamos métodos especiais chamados construtores. Aprofunde-se na continuação desse artigo…
Definição de Construtor
Um construtor é um método de grande importância dentro de uma classe Java. Ele possui algumas características próprias:
- É um método que possui o mesmo nome que a classe onde este se encontra
- Não possui um valor de retorno, nem mesmo void.
- É passível de possuir parâmetros (argumentos)
- Toda classe deve possuir ao menos 1 construtor
- Se o desenvolvedor não escrever um construtor em uma classe, a JVM irá prover um construtor sem argumentos, também chamado de default.
Ao ser criada, uma classe inicializa seus atributos da seguinte maneira:
- Tipos primitivos númericos (int, short, byte, long, float, double) são inicializados com valor 0 (Zero)
- Tipos primitivos booleanos (boolean) são inicializados com valor false
- Tipos primitivos characters (char) são inicializar com valor ” (vazio)
- Objetos são inicializados como null
Incrementando a classe Casa
Existem algumas maneiras de gerar uma instância de uma classe, mas a mais comum é através de um construtor. Como mencionado acima, um construtor é um método com o mesmo nome da classe sem retorno, com possibilidade de ter parâmetros. Por exemplo, vamos criar na classe Casa o construtor mais simples possível.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Casa { private String localizacao; private int qtdQuartos; private int qtdBanheiros; private String dadosProprietarioAtual; private String tipoNegocio; private int qtdVeiculosGaragem; public Casa(){ } public String getTipoNegocio(){ return this.tipoNegocio; } public void setTipoNegocio(String tipoNegocio){ this.tipoNegocio = tipoNegocio; } } |
Esse construtor declarado acima é chamado de construtor default, padrão ou sem argumentos. Um construtor default não possui parâmetros e não possui um corpo válido. Toda classe Java possui uma característica especial, quando não é declarado nenhum construtor, a Java Virtual Machine cria um construtor default em tempo de compilação, ou seja, no arquivo .java não há o construtor default, mas no arquivo .class há. Assim a classe Casa acima, poderia declarar o construtor opcionalmente.
Agora, quando há um construtor declarado, independente se for o default ou diferente deste, seja por possuir parâmetros ou por possuir uma lógica de programação interna, a JVM NÃO irá criar um construtor default em tempo de execução.
Obrigatoriedade de informações
Antes de continuarmos é interessante explicar um pouco sobre associações obrigatórias. Quando vamos construir uma casa na vida real, quais são os “objetos” extremamente necessários para realizar essa construção?
- Água? É interessante, mas pode ser instalado depois.
- Luz? Também é necessário, mas podemos pedir uma ligação elétrica depois
- Localização? SIM!!! We have a Winner!!!
O primeiro objeto básico, realmente básico, é a localização. Senão tivermos uma localização, como iremos fazer alguma construção? Assim antes de iniciar a construção de uma casa, antes de pensarmos no projeto, é necessário existir uma descrição da localização. Bom partindo desse princípio, mas voltando para a realidade de software, como podemos obrigar a um desenvolvedor a enviar uma informação? A passar um objeto para uma instância?
Uma forma que poderia ser feita é no momento de gerar uma nova instância. Dessa forma ao utilizarmos o construtor da classe, podemos obrigar que o desenvolvedor envie objetos necessários para que aquela nova instância funcione corretamente.
Pegando o exemplo da casa, o seguinte código do construtor da classe Casa está seguindo esse conceito:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Casa { private String localizacao; private int qtdQuartos; private int qtdBanheiros; private String dadosProprietarioAtual; private String tipoNegocio; private int qtdVeiculosGaragem; public Casa(String localizacao){ this.localizacao = localizacao; } public String getTipoNegocio(){ return this.tipoNegocio; } public void setTipoNegocio(String tipoNegocio){ this.tipoNegocio = tipoNegocio; } } |
O código do construtor indica que o parâmetro localização será atribuído ao atributo localização da instância da classe Casa. A palavra chave this representa a nova instância que o construtor está ajudando a criar. Senão houvesse o conceito da palavra this, não seria possível ter o nome do parâmetro e o nome do atributo iguais, pois haveria conflitos de nomes.
Adicionando mais construtores
Até agora foi visto códigos com apenas 1 construtor. É possível criar mais de um construtor para a classe. Sempre lembrando do mencionado acima, todo construtor possui uma obrigatoriedade em seus parâmetros. Assim vamos pensar em um outro construtor para a classe Casa, como indica o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Casa { private String localizacao; private int qtdQuartos; private int qtdBanheiros; private String dadosProprietarioAtual; private String tipoNegocio; private int qtdVeiculosGaragem; public Casa(String localizacao){ this.localizacao = localizacao; } public Casa(String localizacao, String dadosProprietarioAtual){ this.localizacao = localizacao; this.dadosProprietarioAtual = dadosProprietarioAtual; } public String getTipoNegocio(){ return this.tipoNegocio; } public void setTipoNegocio(String tipoNegocio){ this.tipoNegocio = tipoNegocio; } } |
Perceba que a classe Casa passou a ter dois construtores, um em que é informado apenas a localização e o outro onde é informado a localização e os dados do proprietário atual. É possível criar quantos construtores forem necessários, mas não é possível criar dois construtores cuja assinatura de parâmetros seja igual, por exemplo dois construtores que definem apenas 1 String como parâmetro. Se isso for feito ocorrerá um erro de compilação, indicando há 2 construtores iguais.
Chamando um construtor dentro de outro construtor
Na linguagem Java, é possível chamar um construtor estando dentro de outro construtor. Por exemplo, perceba que no código dos construtores da classe Casa, existiu duas linhas iguais:
1 |
this.localizacao = localizacao; |
É possível evitar esse tipo de duplicidade de código, realizando um encadeamento de chamadas entre os construtores. Para isso será utilizada a palavra this(listaParâmetros), com a lista de parâmetros do construtor correspondente que queremos chamar. Além disso a chamada a esse construtor deverá estar na primeira linha da declaração do construtor. Veja no código abaixo a mudança:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Casa { private String localizacao; private int qtdQuartos; private int qtdBanheiros; private String dadosProprietarioAtual; private String tipoNegocio; private int qtdVeiculosGaragem; public Casa(String localizacao){ this.localizacao = localizacao; } public Casa(String localizacao, String dadosProprietarioAtual){ this(localizacao); this.dadosProprietarioAtual = dadosProprietarioAtual; } public String getTipoNegocio(){ return this.tipoNegocio; } public void setTipoNegocio(String tipoNegocio){ this.tipoNegocio = tipoNegocio; } } |
Na linha 14 foi removida a linha this.localizacao = localizacao; e adicionada a linha this(localizacao); Com isso quem assume o papel momentaneamente é o construtor que recebe apenas a String localização.
A palavra chave “new”
Para instanciar uma nova classe no Java nós utilizamos a palavra new com o construtor que gostaríamos de chamar. Assim para criar um novo objeto da classe Casa utilizando o construtor default, é necessário fazer o código abaixo:
1 |
Casa casa = new Casa("Rua 15 de novembro, 230, Curitiba, PR"); |
É importante destacarmos o que faz a palavra chave new. Conforme este artigo, é possível perceber que esta palavra realiza a alocação de um espaço de memória dentro da JVM. Assim ao realizarmos o código de instanciação de uma nova classe Java existe uma alocação de memória para esse novo espaço.
Após essa instanciação, decorrem 2 pontos básicos:
- A instanciação dos atributos da classe, chamando os construtores correspondentes para essa inicialização
- A chamada ao construtor da classe de acordo com os parâmetros passados
Após a chamada do construtor, o endereço de memória da nova instância da classe Casa será atribuído a variável casa conforme mostra o código acima.
finally{
Com o fim desse artigo, foi descrito como criar métodos que instanciam sua classe, chamados de construtores. Ainda é possível realizar muitas coisas com os construtores, mas por enquanto iremos ficar por aqui!
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply