Aula 4.1 - Trabalhando com classes em Java, programação orientada a objetos.
Este artigo faz parte do projeto #LTCode
Continuando com nossa série de aulas sobre Programação Orientada a Objeto, clique aqui e confira a lista de aulas já divulgadas, vamos realizar uma atividade para compreender melhor as classes.
Seu objetivo é implementar um relógio digital em Java. Para isso, você deverá criar três classes:
- Contador;
- Relogio;
- TesteRelogio (classe para testar a execução do programa);
Nas classes Contador e Relogio deverão constar os métodos modificadores e métodos de acesso (get's e set's) para os atributos criados. O resultado da sua execução deverá exibir todos os horários possíveis do relógio, exemplo:
Deverá existir uma opção para exibir as horas no formato 12 horas ou 24 horas. Caso seja feita a seleção para exibir no formato de 12 horas, deverá ser exibido a.m. ou p.m. conforme o caso.
Dicas:
- Ainda que você possa visualizar um relógio digital que exibe as horas no formato HH:MM, por exemplo: 11:03, como um mostrador de quatro dígitos, para facilitar a implementação em Java, você deverá considerá-lo como dois contadores de dois dígitos (um par para as horas e um par para os minutos). Um par inicia em zero, aumenta a cada hora e volta para zero após alcançar seu limite de 23. O outro faz o mesmo, porém a cada minuto, até alcançar seu limite de 59.
- Na classe Contador deverá constar um método para incrementar o valor, respeitando o limite definido, (método incrementar()).
- Na classe Relogio deverá constar um método que atualize as horas, caso o contador de minutos seja zerado, (método TicTac()).
- Para que um número nunca exceda um determinado valor, você poderá utilizar o resto inteiro da divisão – função mod. Exemplo: para que A + B nunca seja maior que 100, em Java faça o seguinte: (A + B) % 100.
A atividade já abstraiu o objeto que vamos desenvolver, um relógio digital, em classes. Na classe "Contador" vamos inserir a lógica de mudar a hora ou minutos, o ideal é generalizar ou seja sempre que passarmos um valor para esta classe ela retorna este valor+1, assim poderíamos utilizar a mesma classe em outros tipos de relógios ou programas que precisa da mesma lógica.
Confira na imagem abaixo como ficou nossa classe Contador:
Na linha 5 declaramos uma variável do tipo inteiro, esta variável é inicializada com valor 0 na linha 9 dentro do construtor.. assim sempre que instanciamos um novo objeto, garantimos que a variável inicie com valor zero.
Na linha 13 criamos um método chamado "incrementar", este método contém a nossa lógica de somar mais um à variável "valor". Não passamos nada como parâmetro pois a atividade exigiu a utilização de métodos get's e set's, ou seja, nosso método "incrementar" vai trabalhar com o dado contido na variável "valor" presente na própria classe, podemos alterar o valor da variável "valor" usando o método "setValor" presente na linha 22. *Note na linha 14 que o correto seria "this.valor = (valor+1)%60;" já que nosso relógio volta a 0 ao chegar em 59 minutos ou segundos.
Nossa classe "Contador" está pronta, agora precisamos criar a classe "Relogio"! Portanto vamos por partes, a própria atividade deu algumas dicas para sabermos por onde começar.
A primeira dica informa que vamos usar duas variáveis, uma para a hora e outra para os minutos. Essas duas variáveis vão ser tipos objetos, pois compartilham atributos e comportamentos presente na classe "Contador". Pense comigo, o horário 05:10 possui valor 5 (hora) e valor 10 (minutos). Sendo assim podemos declarar ambas variáveis como:
private Contador hora;
private Contador minuto;
Não podemos esquecer do fato que o usuário poderá escolher entre exibir o horário no formato 12 e 24 horas, sendo assim declaramos uma variável para trabalhar com essa escolha: private int limite;
Toda classe possui um construtor, mesmo que você não crie um, a própria IDE criará para você quando compilar o código. Como precisamos obter do usuário qual tipo de formato exibir do relógio, criaremos um construtor que inicialize com o formato escolhido pelo usuário jogando o valor em nossa variável "limite", aproveitando terminaremos de instanciar a classe "Contador" para as variáveis hora e minuto:
public Relogio(int lim){ //construtor, recebe inteiro em 'lim'
this.hora = new Contador(); //cria objeto
this.minuto = new Contador(); //cria objeto
this.limite = lim; //limite recebe a escolha do usuário, 12 ou 24 horas
}
Na dica 3, é informado para criar um método que atualize as horas, ou seja quando os minutos valer 59, nós chamamos o método incrementar() da classe "Contador" usando a variável de instancia que criamos para a hora, e depois precisamos zerar os minutos para que ele comece a incrementar a partir do zero novamente.
public void Tictac() {
this.hora.incrementar();
this.minuto.setValor(0);
}
public void Tictac() {
this.hora.incrementar();
this.minuto.setValor(0);
}
Note que o código acima é genérico, a lógica de chamar o método Tictac() quando os minutos valer 59 será feita em outro método. Primeiramente vamos criar um método para ser nosso ponto de partida.. ou seja mostrar, imprimir, o relógio na tela... o código deste método já é auto explicativo se você já conhece alguma linguagem de programação:
public void mostrarRelogio(){
String modo;
if(this.limite==12){
modo="a.m.";
relogio12(modo);
modo="p.m.";
this.hora.setValor(0);
relogio12(modo);
}
else{
relogio24();
}
}
Ainda vamos criar os métodos "relogio12()" e "relogio24()", mas já deu para entender que se o usuário escolher 12 vai chamar o método "relogio12()"... caso contrário será chamado o método para mostrar o relógio no modo 24 horas.
Por enquanto nosso código está desta forma:
Ignore as linha 2 e 9 por enquanto. Agora vamos criar o método relogio24(), clique sobre a imagem para ampliar se necessário:
A lógica do método é a seguinte, enquanto "j" for menor que o limite.. no caso 24, incrementamos "j". Dentro do primeiro "for" temos outro "for" para ser os minutos, enquanto "i" for menor que 60, incrementamos "i" e imprimimos na tela o valor presente no objeto "hora" e o valor presente no objeto "minuto", note que realizamos uma impressão formatada, ou seja será impresso a hora e minutos com 2 casas decimais, por isso na linha 2 importamos a classe "DecimalFormat" e na linha 9 instanciamos usando a variável "formato".
Na linha 41 chamamos o método incrementar para o objeto "minuto" ser alterado. Depois que a variável "i" chegar em 59, saímos do segundo "for" e chamamos na linha 43 o método "Tictac()" que incrementa a hora e zera os minutos.
Abaixo você confere o método relogio12(), a lógica continua sendo a mesma.. só que com uma condição para imprimir no modo "am" ou "pm" . Clique sobre a imagem para ampliar se necessário.
Para finalizar nossa classe "Relogio", adicionamos métodos get's e set's.
Agora que nossa classe "Relogio" e "Contador" estão prontas, vamos criar uma classe para testar nosso programinha. Essa classe vai se chamar "TesteRelogio", nela conterá o método main(), vamos ler do teclado a opção de hora que o usuário quer exibir e instanciar a classe "Relogio" passando 12 ou 24 como parâmetro para o construtor, para depois chamarmos o método "mostrarRelogio()", presente nessa classe já que a partir dela o programa vai fluir naturalmente. Confira como ficou a classe na imagem abaixo:
A saída da execução do programa é a seguinte:
run:
24 Horas ou 12 Horas?
Indique o modo do relógio: 12
00:00 a.m.
00:01 a.m.
00:02 a.m.
00:03 a.m.
00:04 a.m.
...
11:56 a.m.
11:57 a.m.
11:58 a.m.
11:59 a.m.
12:00 p.m.
12:01 p.m.
12:02 p.m.
12:03 p.m.
...
12:56 p.m.
12:57 p.m.
12:58 p.m.
12:59 p.m.
01:00 p.m.
01:01 p.m.
01:02 p.m.
01:03 p.m.
...
11:54 p.m.
11:55 p.m.
11:56 p.m.
11:57 p.m.
11:58 p.m.
11:59 p.m.
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
public void mostrarRelogio(){
String modo;
if(this.limite==12){
modo="a.m.";
relogio12(modo);
modo="p.m.";
this.hora.setValor(0);
relogio12(modo);
}
else{
relogio24();
}
}
Ainda vamos criar os métodos "relogio12()" e "relogio24()", mas já deu para entender que se o usuário escolher 12 vai chamar o método "relogio12()"... caso contrário será chamado o método para mostrar o relógio no modo 24 horas.
Por enquanto nosso código está desta forma:
Ignore as linha 2 e 9 por enquanto. Agora vamos criar o método relogio24(), clique sobre a imagem para ampliar se necessário:
A lógica do método é a seguinte, enquanto "j" for menor que o limite.. no caso 24, incrementamos "j". Dentro do primeiro "for" temos outro "for" para ser os minutos, enquanto "i" for menor que 60, incrementamos "i" e imprimimos na tela o valor presente no objeto "hora" e o valor presente no objeto "minuto", note que realizamos uma impressão formatada, ou seja será impresso a hora e minutos com 2 casas decimais, por isso na linha 2 importamos a classe "DecimalFormat" e na linha 9 instanciamos usando a variável "formato".
Na linha 41 chamamos o método incrementar para o objeto "minuto" ser alterado. Depois que a variável "i" chegar em 59, saímos do segundo "for" e chamamos na linha 43 o método "Tictac()" que incrementa a hora e zera os minutos.
Abaixo você confere o método relogio12(), a lógica continua sendo a mesma.. só que com uma condição para imprimir no modo "am" ou "pm" . Clique sobre a imagem para ampliar se necessário.
Para finalizar nossa classe "Relogio", adicionamos métodos get's e set's.
Agora que nossa classe "Relogio" e "Contador" estão prontas, vamos criar uma classe para testar nosso programinha. Essa classe vai se chamar "TesteRelogio", nela conterá o método main(), vamos ler do teclado a opção de hora que o usuário quer exibir e instanciar a classe "Relogio" passando 12 ou 24 como parâmetro para o construtor, para depois chamarmos o método "mostrarRelogio()", presente nessa classe já que a partir dela o programa vai fluir naturalmente. Confira como ficou a classe na imagem abaixo:
A saída da execução do programa é a seguinte:
run:
24 Horas ou 12 Horas?
Indique o modo do relógio: 12
00:00 a.m.
00:01 a.m.
00:02 a.m.
00:03 a.m.
00:04 a.m.
...
11:56 a.m.
11:57 a.m.
11:58 a.m.
11:59 a.m.
12:00 p.m.
12:01 p.m.
12:02 p.m.
12:03 p.m.
...
12:56 p.m.
12:57 p.m.
12:58 p.m.
12:59 p.m.
01:00 p.m.
01:01 p.m.
01:02 p.m.
01:03 p.m.
...
11:54 p.m.
11:55 p.m.
11:56 p.m.
11:57 p.m.
11:58 p.m.
11:59 p.m.
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
run:
24 Horas ou 12 Horas?
Indique o modo do relógio: 24
00:00
00:01
00:02
00:03
00:04
00:05
...
23:55
23:56
23:57
23:58
23:59
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
*Claro que o programa vai mostrar todas as horas, coloquei reticencias para encurtar aqui no site.
Espero que tenha compreendido, qualquer dúvida deixe um comentário.
>> Próxima aula, em breve.
COMENTÁRIOS