1
resposta

método construtor retorna erro

Bom dia! Estou fazendo um exercício para testar um método, mas ele retorna erro: Segue o enunciado:

Implemete um programa que tenha:
Classe: Pessoa
Atributos: nome, idade.
Método: void fazAniversario()
Crie uma pessoa, coloque seu nome e idade iniciais, faça alguns aniversários
(aumentando a idade) e imprima seu nome e sua idade. (2 pontos)

Abaixo segue o código que eu implementei:

package modelo;

public class Pessoa {

    public String nome;
    public int idade;


public Pessoa(String nome, int idade) {
        //super();
        this.nome = nome;
        this.idade = idade;
    }



//public Pessoa() {
    // TODO Auto-generated constructor stub
//}



public String getNome() {
    return nome;
}


public void setNome(String nome) {
    this.nome = nome;
}


public int getIdade() {
    return idade;
}


public void setIdade(int idade) {
    this.idade = idade;
}



public int fazAniversario() {
    return idade ++;
}

}
package view;

import modelo.Pessoa;

public class SistemaAniversario {


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Pessoa p1 = new Pessoa(null, 0);

            p1.nome = "João Moura";
            System.out.println("Informe o nome: " + p1.nome);
            p1.idade = 27;
            System.out.println("Informa a idade: " + p1.idade);
            p1.fazAniversario();
            System.out.println(p1.idade);

    }

}

Quando eu estava implementando, ele retornava um erro na linha 11 (Pessoa p1 = new Pessoa(); ele me retornava o erro dizendo que o "The constructor Pessoa() is undefined" Nesse caso, ele me dava 3 opções:

1)Add arguments to match 'Pessoa(String, int)' Que foi o que eu fiz no caso, mas aí dentro do parametros fica (null, 0)...pq?? Na minha cabeça ia ficar escrito (String,int)

2)Change Constructor 'Pessoa(String, int)': Remove parameters String, int não cheguei a tentar essa opção...

3)Create Constructor 'Pessoa()' Eu já tinha criado um construtor Pessoa() na classe Pessoa...pq ele quer que eu crie, alem daquele que eu já tinha criado, outro só que vazio??

O código funciona....mas fiquei com duvidas nesses pontos.. Obrigada desde já! o/

1 resposta

Oi Alexandra, tudo bem?

O Java apontou o erro "The constructor Pessoa() is undefined", pois o único construtor implementado da classe Pessoa é o:

// construtor de Pessoa

public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }

Quando você colocou String nome e um int idade como parâmetros do construtor de Pessoa, você está obrigando quem for instanciar um objeto a partir dessa classe a atribuir valores a estes dois atributos durante a criação do objeto!

Só contextualizando, toda vez que você instancia um objeto a partir de uma classe, é chamado o construtor dessa classe (como se fosse um método mesmo). Então, veja bem, quando você instanciou o objeto do tipo Pessoa Pessoa p1 = new Pessoa(); pela primeira vez, ele não recebeu nenhum parâmetro dentro dos parênteses de Pessoa(), sendo que no construtor dele, foi declarado que ele receberia um String nome e um int idade: public Pessoa(String nome, int idade). Vamos agora para as 3 alternativas que o Java ofereceu para contornar esse problema:

  1. Add arguments to match 'Pessoa(String, int)'

Começando pela solução que você implementou. Aqui você está adicionando parâmetros (null, 0) ao chamar o construtor para montar o seu objeto do tipo Pessoa. null e 0 são os valores padrões de String e int, respectivamente, portanto são valores válidos para preencher os parâmetros do construtor public Pessoa(String nome, int idade), com o seu nome agora valendo null, sua idade valendo 0.

  1. Change Constructor 'Pessoa(String, int)': Remove parameters String, int

Aqui você simplesmente remove todos os parâmetros do construtor, dessa forma não é mais obrigatório passar nada como parâmetro na hora de instanciar um objeto. Você poderia simplesmente deixar em branco o Pessoa p1 = new Pessoa();, que funcionaria numa boa, já que não é mais obrigatório passar os valores de String nome e um int idade, porém como agora o construtor está vazio, você não pode passar mais nada dentro dos parênteses.

  1. Create Constructor 'Pessoa()'

Aqui você não substitui o construtor, mas acaba criando mais um vazio. Dessa forma você vai ter os dois na sua classe Pessoa:

    public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }
    public Pessoa() {
        // TODO Auto-generated constructor stub
    }

Agora você pode instanciar o objeto, tanto com ou sem parâmetros.

Nessa explicação acabei usando o conceito de construtores, que nada mais é que um método que é chamado toda vez que um objeto é criado, mas não se preocupe com isso agora, pois no final desse curso o Paulo irá explicar com ainda mais detalhes sobre o funcionamento dele. Por enquanto, o que eu recomendaria é usar a opção 2 e simplesmente remover os parâmetros. Dessa forma você atribui os valores ao atributos da forma como você sabe: p1.nome = "João Moura";. Mas caso queira deixar o construtor da forma como está, basta passar os valores que você deseja na instância do objeto:

public static void main(String[] args) {

        Pessoa p1 = new Pessoa("João Mora", 27);

        System.out.println(p1.nome);
        System.out.println(p1.idade);
    }

Isso também funcionaria! O p1.nome = "João Moura" e o p1.idade = 27 foi feito internamente pelo construtor lá no código de Pessoa.

public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }

Espero ter ajudado, se ficou qualquer dúvida é só avisar!

Bons estudos!!