...Uma classe é uma estrutura que engloba informações (atributos) e também operações (métodos)
...Os métodos implementados numa classes só podem ser invocados a partir dos objetos daquela classe
...Os atributos especificados numa classe só existirão "dentro" dos objetos daquela classe, mas não podem ser acessados diretamente
...As informações internas aos objetos podem ser de diversos tipos: int, boolean, float, String
...E se quiséssemos armazenar informações mais complexas dentro dos objetos?
...Seriam suficientes os Strings e os tipos básicos para definir nossas classes?
Considere o seguinte problema:
Queremos desenvolver um programa orientado a objetos, em Java, que implemente uma agenda telefônica. A agenda deve armazenar um certo número de pessoas, e cada pessoa deve conter nome, idade e número de telefone. A agenda deve oferecer a possibilidade de pesquisa por nome.
Como resolver esse problema simples, com todas as informações e operações descritas/implementadas em apenas uma classe (ou em classes completamente independentes)?
Estas restrições dificultariam bastante o desenvolvimento e a compreensão das classes. Por isso, podemos definir e interrelacionar várias classes para a resolução de um determinado problema. A isto chamamos composição de classes.
Pela descrição do problema, podemos identificar uma classe Pessoa, que reúne os atributos nome, idade e número de telefone. Além de especificar os atributos, precisaremos implementar métodos acessadores e modificadores, para que os programadores que forem utilizar objetos da classe Pessoa possam cunfigurar devidamente seus atributos. Métodos acessadores, que simpesmente retornam algum atributo da classe, devem começar pelo nome get, enquanto métodos modificadores, que apenas recebem um parâmetro e o atribuem a algum atributo, devem começar pelo nome set e retornar void.
public class Pessoa{
private String nome;
private int idade;
private String telefone;
public Pessoa(){
nome="";
telefone="";
idade=0;
}
public Pessoa(String n, String t, int i){
nome=n;
telefone=t;
idade=i;
}
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
public void setTelefone(String tel){
this.telefone = tel;
}
public String getTelefone(){
return telefone;
}
public void setIdade(int i){
idade=i;
}
public int getIdade(){
return idade;
}
}
Objetos podem relacionar-se entre si
As relações são descritas através da composição de classes
Desta forma, uma classe pode descrever em seus atributos informação que, em si, são objetos de outras classes
Poderíamos, então, criar uma classe Agenda, que entre seus atributos teria objetos da classe Pessoa
public class Agenda{
private Pessoa[] pessoas;
private int proximo;
public Agenda(){
pessoas = new Pessoa[100];
proximo = 0;
}
public String procurarTelefone(String nome){
if (nome==null)
return null;
for (int k=0; k<proximo; k++)
if (nome.equalsIgnoreCase(pessoas[k].getNome()))
return pessoas[k].getTelefone();
return null;
}
public void adicionarPessoa(Pessoa p){
pessoas[proximo++] = p;
}
}
Poderíamos utilizar o seguinte programa principal para criarmos nossa aplicação:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner teclado = new Scanner(System.in);
Agenda agenda = new Agenda();
Pessoa p;
//inserindo dados na agenda...
do{
p = new Pessoa();
System.out.print("Nome: ");
p.setNome(teclado.next());
System.out.print("Telefone: ");
p.setTelefone(teclado.next());
System.out.print("Idade: ");
p.setIdade(teclado.nextInt());
if (p.getIdade()>0)
agenda.adicionarPessoa(p);
}while (p.getIdade()>0);
//pesquisando...
String nome;
String telefone;
System.out.println("Digite o nome a ser pesquisado (ou 'fim' para finalizar pesquisas): ");
nome = teclado.next();
while(!nome.equalsIgnoreCase("fim")){
telefone = agenda.procurarTelefone(nome);
if (telefone==null) {
System.out.println(nome+" não consta na agenda");
}
else System.out.println("O telefone de "+nome+" é: "+telefone);
nome = teclado.next();
}
}
}
Métodos representam operações que podem ser efetuadas através de objetos das classes. A classe que deve conter um determinado método é a classe que contém a informação necessária para a realização da operação.
Desta forma, a operação de pesquisa por telefones deve ser implementada pela classe Agenda pois esta tem as informações necessárias (um conjunto de objetos Pessoa) para a realização de tal operação.
1. Adicione um atributo à classe Pessoa. O atributo deve expressar a cidade onde mora a pessoa. Adicione métodos para que os programadores que forem utilizar objetos da classe Pessoa possam acessar e modificar este novo atributo
2. Implemente na classe Agenda o método
public int tamanho(),
que retorna o número de pessoas cadastradas na agenda
3. Reimplemente o método adicionarPessoa de maneira que um número indeterminado de pessoas possa ser incluído na agenda
4. Altere a classe Agenda para que a composição com objetos Pessoa se dê através de ArrayList em vez de vetor convencional.
5. Implemente um método que retorne, como resultado, todas as pessoas que tenham idade num intervalo conhecido.
6. Implemente um método que retorne todas as pessoas cujos nomes estejam entre dois outros strings
7. Implemente um método que ordene as pessoas por idade
8. Implemente um método que ordene as pessoas por nome
9. Implemente o método
public Pessoa excluir(String nome),
que exclui a pessoa cujo nome é igual ao parâmetro nome e retorna a pessoa excluída. Caso não conste na agenda nenhuma pessoa cujo nome seja igual a nome, o método deve retornar null.
10. Implemente um método que retorne todas as pessoas que moram numa determinada cidade
11. (Desafio) Implemente um método para retornar todos os aniversariantes do dia.