[Resolvido] Ajuda com métodos

11 respostas Resolvido
C

Boa noite! Sou novo por aqui e no mundo da programação também.
Estou estudando pelo livro da caelum fj-11e me estou quebrando a cabeça para resolver um exercício.
Ele diz para criar 3 portas e abrir e fechar elas como desejar e utilizar um método para imprimir quantas portas estão abertas. A parte de imprimir quantas portas estão abertas que eu não estou conseguindo. Segue o código que tenho até agora. Se alguém puder me ajudar… agradeço desde já.

public static void main(String [] args) {

Porta porta1;
    porta1 = new Porta();

    Porta porta2;
    porta2 = new Porta();

    Porta porta3;
    porta3 = new Porta();

    porta1.fechaPorta();
    porta2.abrePorta();
    porta3.abrePorta();
}

}

public class Porta {

boolean status;

int quantasPortasEstaoAbertas = 0;
void statusDaPorta(boolean status){
    this.status = status;
    if (status){
        System.out.println("A porta esta aberta!");
        } else {
        System.out.println("A porta esta fechada!");
    }
}
void abrePorta(){
    this.statusDaPorta(true);
}
void fechaPorta(){
    this.statusDaPorta(false);
}

}

11 Respostas

Rodrigo_Void

coloca quantasPortasEstaoAbertas como static ai no método de abrir vc incrementa 1 e no de fechar decrementa 1
depois só criar um método pra retornar o valor

staroski

Primeiramente eu renomearia o atributo status para aberta, que é justamente o que ele representa.
Depois eu mudaria o atributo quantasPortasEstaoAbertas para estático de forma que pertença à classe e não às instâncias.
Aí é só incrementar no método abrePorta() e decrementar no método fechaPorta().

Exemplo:

public class Exemplo {

    public static void main(String[] args) {
        Porta porta1 = new Porta();
        Porta porta2 = new Porta();
        Porta porta3 = new Porta();

        porta1.fechaPorta();
        porta2.abrePorta();
        porta3.abrePorta();

        System.out.println("Portas abertas:  " + Porta.quantidadeAbertas());
        System.out.println("Portas fechadas: " + Porta.quantidadeFechadas());
    }
}

Classe Porta:

public class Porta {

    private static int abertas;
    private static int fechadas;

    public static int quantidadeAbertas() {
        return abertas;
    }

    public static int quantidadeFechadas() {
        return fechadas;
    }

    private boolean aberta;

    public Porta() {
        aberta = false;
        fechadas++;
    }

    public void abrePorta() {
        if (!aberta) {
            aberta = true;
            abertas++;
            fechadas--;
        }
        imprimeStatusDaPorta();
    }

    public void fechaPorta() {
        if (aberta) {
            aberta = false;
            fechadas++;
            abertas--;
        }
        imprimeStatusDaPorta();
    }

    private void imprimeStatusDaPorta() {
        if (aberta) {
            System.out.println("A porta esta aberta!");
        } else {
            System.out.println("A porta esta fechada!");
        }
    }
}
C

A troca do nome do atributo status para aberta foi uma boa! Não tinha pensado nisso. Ainda não aprendi o conceito de métodos estáticos…achava que só eram utilizados em variáveis(ex static double pi = 3.14). Vou dar uma pesquisada sobre métodos estáticos. Muito obrigado. Ajudaram bastante!

staroski
Solucao aceita

Membros estáticos (atributos, métodos ou classes) pertencem à classe e não aos objetos daquela classe.
Tudo o que é estático é acessível sem precisar ter uma instância da classe, é algo global.

No seu exemplo os métodos quantidadeAbertas() e quantidadeFechadas() retornam o valor dos atributos estáticos abertas e fechadas.
Porque retornar através de um método?
Porque senão os atributos teriam que ser públicos e sendo públicos eles ficam acessíveis à mudanças a partir de outras classes e isso não é legal.
Os atributos abertas e fechadas, embora sejam estáticos, são modificados pelas instâncias dos objetos.

C

Não poderia usar o private?

staroski

Se não quiser acessar de fora da classe, pode.

C

Staroski, obrigado pela explicação! Só achei estranho um exercício na apostila sendo que ainda não foi falado sobre isso.

staroski

Existem N formas de resolver um problema.
Em nenhum momento foi dito que não era pra usar membros estáticos.

C

Como eu faria para ter esse mesmo resultado sem usar um método estático?
Oque eu quis dizer é que a apostila tem um exercício para usar um conceito que ainda não foi ensinado na mesma.

staroski

Na classe onde instanciou as portas, poderia ter contadores.

Porta porta1 = new Porta();
Porta porta2 = new Porta();
Porta porta3 = new Porta();

porta1.fechaPorta();
porta2.abrePorta();
porta3.abrePorta();

int abertas = 0;
int fechadas = 0;
if (porta1.aberta) {
    abertas++;
} else {
    fechadas++;
}

if (porta2.aberta) {
    abertas++;
} else {
    fechadas++;
}

if (porta3.aberta) {
    abertas++;
} else {
    fechadas++;
}

System.out.println("abertas:  " + abertas);
System.out.println("fechadas: " + fechadas);
C

ah… você fez um if para cada porta…também não tinha pensado nisso… eu estava tentando criar um metodo contador e incrementa ele a cada porta aberta…novamente obrigado!

Criado 6 de julho de 2018
Ultima resposta 7 de jul. de 2018
Respostas 11
Participantes 3