Método construtor, ou simplesmente construtor, é um método especial em uma classe que é executado quando uma instância desta classe é criada, ou seja, quando é criado um objeto da classe.
Os métodos construtores padrão (default) "não fazem nada", além de criar um objeto da classe, a não ser que sejam redefinidos explicitamente no código por um processo chamado sobrescrita de método.
A redefinição de métodos construtores é uma estratégia útil para antecipar comportamentos, tais como a inicialização de atributos da classe, entre outras estratégias de projeto orientado a objetos.
Ao criar um objeto de uma classe que possui um construtor, o construtor é automaticamente chamado e é responsável por definir os valores iniciais dos atributos da classe. Isso garante que os objetos criados a partir daquela classe tenham valores consistentes e possam ser usados corretamente.
O construtor é executado automaticamente assim que o objeto é criado e não pode ser chamado explicitamente em nenhum momento.
O método construtor default em Java "não faz nada" além de criar um objeto da classe. Ele é executado toda vez que a palavra reservada new é utilizada para a criação de objetos.
Para redefinir um método construtor em Java, realiza-se a sobrescrita do método no corpo da classe, seguindo a sintaxe descrita a seguir.
Sintaxe:
class ClasseConceitual {
modificadorDeAcesso ClasseConceitual(lista de parâmetros com seus tipos e separados por vírgula){
//bloco de instruções do método construtor
}
}
⚠️O nome do método construtor deve ser o mesmo nome da classe e estar declarado no início do corpo da classe.
O modificadorDeAcesso é opcional e precisa ser especificado apenas se desejar que seja diferente do default package. O modificador de acesso do método construtor não pode ser privado.
O método construtor não possui tipo de retorno, nem mesmo void, uma vez que o seu "retorno" é o próprio objeto criado.
A lista de parâmetros é opcional e precisa ser especificada, apenas, se houver parâmetros de entrada.
Nesse exemplo, o construtor da classe Pessoa recebe três parâmetros: "nome", "idade" e "gênero". Quando um objeto da classe Pessoa é criado, o construtor é chamado automaticamente e define os valores iniciais para os atributos da classe com base nos parâmetros passados. Estes valores podem ser acessados posteriormente através dos getters da classe, como mostra a classe Main.
Arquivo Pessoa.java
public class Pessoa {
private String nome, genero;
private int idade;
public Pessoa(String nome, int idade, String genero) {
this.nome = nome;
this.idade = idade;
this.genero = genero;
}
// getters e setters para os atributos
}
Arquivo Main.java
class Main {
public static void main(String[] args) {
Pessoa p1 = new Pessoa("Fei-Fei Li", 47, "feminino");
String nomeP1 = p1.getNome(); // retorna "Fei-Fei Li"
int idadeP1 = p1.getIdade(); // retorna 47
String generoP1 = p1.getGenero(); // retorna "feminino"
}
}
Arquivo Triangulo.java
public class Triangulo {
private double base, altura, area;
Triangulo(double base, double altura){
this.base = base;
this.altura = altura;
}
public double getBase() {
return base;
}
public void setBase(double base) {
this.base = base;
}
public double getAltura() {
return altura;
}
public void setAltura(double altura) {
this.altura = altura;
}
public double getArea() {
return area;
}
public void setArea(double area) {
this.area = area;
}
public double calcularArea() {
if (base > 0 && altura > 0) {
area = base * altura / 2;
return area;
} else {
System.out.println("Os valores de base e altura devem ser maiores do que 0 para o cálculo da área do triângulo.");
return 0;
}
}
}
Arquivo Main.java
class Main {
public static void main(String[] args) {
Triangulo t1 = new Triangulo(1.5, 2.0);
System.out.println(t1.calcularArea());
}
}
Após sobrescrito, o método construtor default para de funcionar. ⚠️
Então, para manter a opção de criar o objeto sem realizar nenhuma outra ação é preciso escrever um novo método construtor vazio. ⬅️
Arquivo Triangulo.java
public class Triangulo {
private double base, altura, area;
Triangulo(){
//construtor default
}
Triangulo(double base, double altura){
this.base = base;
this.altura = altura;
}
public double getBase() {
return base;
}
public void setBase(double base) {
this.base = base;
}
public double getAltura() {
return altura;
}
public void setAltura(double altura) {
this.altura = altura;
}
public double getArea() {
return area;
}
public void setArea(double area) {
this.area = area;
}
public double calcularArea() {
if (base > 0 && altura > 0) {
area = base * altura / 2;
return area;
} else {
System.out.println("Os valores de base e altura devem ser maiores do que 0 para o cálculo da área do triângulo.");
return 0;
}
}
}
Arquivo Main.java
class Main {
public static void main(String[] args) {
Triangulo t1 = new Triangulo(1.5, 2.0);
System.out.println(t1.calcularArea());
Triangulo t2 = new Triangulo();
System.out.println(t2.calcularArea());
}
}
Em Java, é possível definir vários métodos construtores para uma classe.
⚠️ Cada método construtor deve ter um nome idêntico ao nome da classe e deve ter parâmetros diferentes em quantidade ou na sequência de tipos (tipos e ordem).
O processo de ter mais de uma opção de método construtor é chamado de sobrecarga de método e será visto em detalhes em aulas futuras.
A escolha do método construtor a ser usado depende dos argumentos fornecidos quando o objeto é criado. Se nenhum argumento for fornecido, o construtor default será chamado. Se um ou mais argumentos forem fornecidos, o construtor que corresponde aos argumentos fornecidos será chamado.
Neste exemplo, a classe Bola possui dois métodos construtores: um com uma String como parâmetro e outro com um double como parâmetro. Assim, para criar um objeto do tipo Bola, um dos dois tipos de argumento (String ou double) devem ser informados ao chamar o método construtor.
Arquivo Bola.java
public class Bola {
private String cor, material, esporte;
private double raio;
Bola(String esporte){
this.esporte = esporte;
}
Bola(double raio){
this.raio = raio;
}
// getters e setters para os atributos
}
Arquivo Main.java
class Main {
public static void main(String[] args) {
Bola b1 = new Bola("Futebol");
System.out.println(b1.getEsporte());
Bola b2 = new Bola(12.41);
System.out.println(b2.getRaio());
}
}