Universidade Estadual da Paraíba Campus VII – Gov. Antônio Mariz CCEA – Centro de Ciências Exatas e Sociais Aplicadas Licenciatura em Computação Java - Noturno Exercício Prático 3 – Reutilizando Objetos Nome:______________________________________________ Com base no modelo de Orientação à Objetos nós podemos formar classes que possuem atributos de tipos primitivos(int, char, float), porém outro fator importante é a possibilidade de termos classes que possuem atributos desenvolvidos de forma customizada por nós programadores. Ou seja, uma classe contém um atributo que pode ser outra classe. Observe a classe “Endereco.java” /** @author professor_Hugo_Barros @version 1.0 Representa endereco de uma Pessoa. */ public class Endereco{ private String cidade; private String rua; private int num; public Endereco(String cidade, String rua, int num){ this.cidade = cidade; this.rua = rua; this.num = num; } /** Altera o valor da Cidade @param cidade Cidade da pessoa referenciada. */ public void setCidade(String cidade){ this.cidade = cidade; } /** Altera o valor da Rua @param rua Rua onde a pessoa reside. */ public void setRua(String rua){ this.rua = rua; } /** Altera o numero da residencia @param num Numero da residencia da Pessoa. */ public void setNum(int num){ this.num = num; } /** Resgata a Cidade onde a pessoa reside @return Cidade no formato String. */ public String getCidade(){ return this.cidade; } /** Resgata a Rua onde a pessoa reside @return Rua no formato String. */ public String getRua(){ return this.rua; } /** Resgata o numero da residencia onde a pessoa reside @return numero no formato de inteiro. */ public int getNum(){ return this.num; } } Agora, voltemos à Classe Pessoa.java vista no exercício anterior, a qual todos modificaram, criaram novos construtores adicionando atributos e etc. Será que é possível adicionar um objeto do tipo Endereco ? Vamos fazer um teste adicionando um atributo na classe Pessoa.java do tipo Endereco. Exemplo: public class Pessoa{ private int idade; private String nome; private Endereco endereco; //construtor public Pessoa(){ } ... Se foi adicionado um atributo na classe Pessoa.java o que é preciso fazer ? Adicionar o get e o set do atributo adicionado, então faça-o: … public void setEndereco(Endereco endereco) … E quanto ao construtor da classe Pessoa ? Já que temos mais um atributo, seria interessante deixar a possibilidade de passá-lo como parâmetro no construtor, porém sabemos que na classe pessoa não temos os métodos get e set da classe Endereco.java, mas na classe Endereco temos um construtor que recebe todos os seus atributos como parâmetro, então porque não chamar esse construtor na inicialização da classe Pessoa.java. Fazendo isso, com certeza estará diminuindo consideravelmente o número de linhas do meu código. Exemplo: … public Pessoa(){ } public Pessoa(int idade, String nome, String cidade, String rua, int num){ this.idade = idade; this.nome = nome; this.endereco = new Endereco(cidade,rua,num); } //construtor public Pessoa(int idade, String nome, Endereco endereco){ this.idade = idade; this.nome = nome; this.endereco = endereco; } ... E o método Main ? Crie uma classe que contenha um método Main e faça seus testes com todos os construtores criados. Exemplo: ... public static void main(String args[]){ Pessoa p = new Pessoa(21,"Hugo","Patos","Av. Teste",500); System.out.println("Nome: "+p.getNome()+"\n"+ "Idade: "+p.getIdade()+"\n"+ "Cidade: "+p.getEndereco().getCidade()+"\n"+ "Rua: "+p.getEndereco().getRua()+"\n"+ "Número: "+p.getEndereco().getNum()+"\n"); } ... Outro exemplo seria: ... public static void main(String args[]){ Endereco e = new Endereco(“Patos”,”Av.teste”,500); Pessoa p = new Pessoa(21,"Hugo", e); } System.out.println("Nome: "+p.getNome()+"\n"+ "Idade: "+p.getIdade()+"\n"+ "Cidade: "+p.getEndereco().getCidade()+"\n"+ "Rua: "+p.getEndereco().getRua()+"\n"+ "Número: "+p.getEndereco().getNum()+"\n"); … Porque separar em classes, atributos que poderíamos colocar em apenas uma classe. Essa é uma pergunta que nós programadores sempre fazemos quando estamos desenvolvendo a capacidade de “quebrar” o nosso código em “pedacinhos” cada vez menores. A resposta mais simples para essa pergunta é que em um desenvolvimento de um sistema pouco mais complexo, a classe Endereco pode ser utilizada não apenas pela classe Pessoa.java mas sim, por diversas outras classes. Pois não só um objeto do tipo Pessoa pode ter um Endereco, mas sim a necessidade de representar a residencia de entrega de um cliente e entre outros motivos. O ideal é sempre: “Dividir para Conquistar!” A metodologia que criamos acima é uma maneira de atribuir vários atributos de classes diferentes, onde o construtor identifica e coloca cada valor de atributo no lugar correto, inclusive passando por parâmetros atributos da classe Endereco.java Crie outra classe que não seja a Classe Endereco.java e adicione-a como atributo e inclusive no seu construtor, criando gets e set's para o atributo adicionado. Agora que somos capazes de colocar na memória RAM dos nossos computadores – de uma forma organizada – informações de pessoas e seus respectivos endereços, vamos resolver o problema de João Carteiro: João é um carteiro que percorre a cidade de Patos inteira, portanto conhece muitas pessoas pelo nome e algumas ele sabe até a idade, mas o problema de João é que ele não consegue decorar as ruas e seus respectivos números de seus conhecidos. Pensando em facilitar a vida de João, crie um programa em java que leia do teclado quantas pessoas joão deseja cadastrar e depois seja capaz de inserir, alterar, excluir e a opção de “mostrar todos”(pode ser feito com menu) os dados dessas pessoas(nome, idade, cidade, rua, número). Considere importante ainda adicionar os dados da classe criada por você na questão anterior. Dica: Para facilitar e organizar o seu trabalho utilize métodos que diminuam as linhas de código e o uso de arrays não é uma má ideia. Comandos importantes: Comando Execução ls lista os arquivos de um determinado diretório pwd mostra o diretório atual mkdir <nome> cria um diretório com o <nome> passado como parâmetros cd <nome> direciona o terminal para o diretório com o <nome> javac <nome>.java compila um arquivo com o nome passado e gera o bytecode java <nome> executa o bytecode gerado pelo processo de compilação javadoc <nome>.java gera o javadoc do arquivo <nome>.java OBS.: – É importante saber que as “...” (reticências) indicam a existência de um código implícito. – O código deve obedecer as regras de identação, pois nas avaliações futuras será um quesito de pontuação. – Deve-se colocar comentários javadoc em todas as classes criadas nesse exercício. – Para todo programa criado deve-se gerar o seu javadoc respectivo. – O Exercício completo vale 2,00 Pontos; – O prolema não deve ser feito em dupla; – Deverá ser entregue até o dia 20/09/2011 até as 23:59(sem adiamentos); – A entrega deverá ser feita via e-mail; – O assunto do e-mail deverá ser como segue: “Entrega trabalho01 JAVA noturno” – O arquivos(compilados e fonte) deverão estar em uma pasta e zipados como mostra o exemplo: uepb_java_noturno_201102_trab01_meunome.zip – Existem infinitas formas de resolver o exercício, portanto a coincidente duplicidade será considerada cópia! – Dúvidas poderão ser retiradas por e-mail e presencialmente na sala de aula no dia 15/09/2011 Boa sorte !!!