• Skip to primary navigation
  • Skip to content

Mauda

IT, Java and Music

Graduação   SCJP   Mestrado
  • Apresentação
  • Certificação Java
  • JPA
    • Exceptions
  • JSF
  • Versionamento
  • Contato

OO + Java Básico: Instanciando Objetos – Métodos Construtores

August 14, 2017 by Mauda Leave a Comment

Conteúdo do Post:
  1. Definição de Construtor
  2. Incrementando a classe Casa
  3. Obrigatoriedade de informações
  4. Adicionando mais construtores
  5. Chamando um construtor dentro de outro construtor
  6. A palavra chave “new”
  7. finally{

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:

  1. É um método que possui o mesmo nome que a classe onde este se encontra
  2. Não possui um valor de retorno, nem mesmo void.
  3. É passível de possuir parâmetros (argumentos)
  4. Toda classe deve possuir ao menos 1 construtor
  5. 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.

Java
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:

Java
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:

Java
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:

Java
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:

Java
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:

Java
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!

Filed Under: Java, Orientação a Objetos Tagged With: Construtores, Java, Orientação a Objetos

About Mauda

Mestre em Informática, Analista de Sistemas, Professor, SCJP e Baterista. Desde 2002 trabalhando no mundo Java e ensinando pessoas sobre desenvolvimento de sistemas. Mais informações

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Advertisements

Copyright © 2025 · Genesis Framework · WordPress · Log in