Você está na página 1de 34

Capitulo 3 1) Imprima todos os nmeros de 150 a 300.

package Capitulo3; public class PrimeiraQuestao { public static void main(String[] args) { for(int i = 150; i <= 300; i ++){ System.out.println(i); } } }
2) Imprima a soma de 1 at 1000.

package Capitulo3; public class SegundaQuestao { public static void main(String[] args) { int soma = 0; for(int i = 1; i <= 1000; i ++){ soma = soma + i; } System.out.println(soma); } }
3) Imprima todos os mltiplos de 3, entre 1 e 100. package Capitulo3; public class TerceiraQuestao { public static void main(String[] args) { for(int i = 1; i <= 100; i ++){ if(i % 3 == 0){ System.out.println(i); } } } }

4) Imprima os fatoriais de 1 a 10. package Capitulo3; public class QuartaQuestao { public static void main(String[] args) { int i,n; for (n = 1; n <= 10; n++){ int fatorial=1; for(i = n; i>=1; i--){ fatorial = fatorial * i; } System.out.println(n+"!="+fatorial); } } } 5) Aumente a quantidade de nmeros que tero os fatoriais impressos, at 20, 30, 40. Em um determinado momento, alm desse clculo demorar, vai comear a mostrar respostas completamente erradas. Porque? Mude de int para long, e voc poder ver alguma mudana. package Capitulo3; public class QuartaQuestao { public static void main(String[] args) { int i,n; for (n = 1; n <= 40; n++){ int fatorial=1; for(i = n; i>=1; i--){ fatorial = fatorial * i; } System.out.println(n+"!="+fatorial); } } } 7) (opcional) Escreva um programa que, dada uma varivel x (com valor 180, por exemplo), temos y de acordo com a seguinte regra:

_ se x par, y = x / 2 _ se x impar, y = 3 * x + 1 _ imprime y _ O programa deve ento jogar o valor de y em x e continuar at que y tenha o valor final de 1. Por exemplo, para x = 13, a sada ser:
40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 package Capitulo3; public class SetimaQuestao { public static void main(String[] args) { int x = 13; int y = 0; while (y != 1) { if (x % 2 == 0) { y = x / 2; } else { y = (3 * x) + 1; } x = y; System.out.println(y); } } } Capitulo 4.12 1) Modele um funcionrio. Ele deve ter o nome do funcionrio, o departamento onde trabalha, seu salrio (double), a data de entrada no banco (String), seu RG (String) e um valor booleano que indique se o funcionrio est na empresa no momento ou se j foi embora. Voc deve criar alguns mtodos de acordo com sua necessidade. Alm deles, crie um mtodo bonifica que aumenta o salario do funcionrio de acordo com o parmetro passado como argumento. Crie, tambm, um mtodo demite, que no recebe parmetro algum, s modifica o valor booleano indicando que o funcionrio no trabalha mais aqui. A idia aqui apenas modelar, isto , s identifique que informaes so importantes e o que um funcionrio faz. Desenhe no papel tudo o que um Funcionario tem e tudo que ele faz. package Capitulo4_12; public class Funcionario { String nome;

String departamento; double salario; String dataEntradaBanco; String rg; boolean estaNaEmpresa; void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } } }2) Transforme o modelo acima em uma classe Java. Teste-a, usando uma outra classe que tenha o main. Voc deve criar a classe do funcionrio chamada Funcionario, e a classe de teste voc pode nomear como quiser. A de teste deve possuir o mtodo main. package Capitulo4_12; public class TestaFuncionario { public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.nome = "Luiz Washington"; funcionario.salario = 1800; funcionario.dataEntradaBanco = "25/10/2007"; funcionario.departamento = "Engenharia"; funcionario.rg = "16661848"; funcionario.estaNaEmpresa = true; System.out.println("Nome:"+funcionario.nome); System.out.println("Departamento:"+funcionario.departamento); System.out.println("Salario:"+funcionario.salario); System.out.println("Rg:"+funcionario.rg); System.out.println("Data de entrada no banco:"+funcionario.dataEntradaBanco); System.out.println("Funcionario est na empresa:"+funcionario.estaNaEmpresa); } } 3) Crie um mtodo mostra(), que no recebe nem devolve parmetro algum e simplesmente imprime todos os atributos do nosso funcionrio. Dessa maneira, voc no precisa ficar copiando e colando um monte de System.out.println() para cada mudana e teste que fizer com cada um de seus funcionrios, voc simplesmente vai fazer:
package Capitulo4_12;

public class Funcionario { String nome; String departamento; double salario; String dataEntradaBanco; String rg; boolean estaNaEmpresa; void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } public void mostra(){ System.out.println("Nome:"+nome); System.out.println("Departamento:"+departamento); System.out.println("Salario:"+salario); System.out.println("Rg:"+rg); System.out.println("Data de entrada no banco:"+dataEntradaBanco); System.out.println("Trabalha na empresa:"+estaNaEmpresa); } } package Capitulo4_12; public class TestaFuncionario { public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.nome = "Luiz Washington"; funcionario.salario = 1800; funcionario.dataEntradaBanco = "25/10/2007"; funcionario.departamento = "Engenharia"; funcionario.rg = "16661848"; funcionario.estaNaEmpresa = true;

funcionario.mostra(); funcionario.bonifica(780);

funcionario.demite(); funcionario.mostra(); } }

4) Construa dois funcionrios com o new e compare-os com o ==. E se eles tiverem os mesmos atributos? Para isso voc vai precisar criar outra referncia: package Capitulo4_12; public class TestaFuncionario { public static void main(String[] args) { Funcionario f1 = new Funcionario(); Funcionario f2 = new Funcionario(); f1.nome = "Dallas"; f1.salario = 1800; f2.nome = "Isac"; f2.salario = 2100; if (f1 == f2) { System.out.println("Os funcionrios so iguais"); } else { System.out.println("Os funcionrios so diferentes"); } } 5) Crie duas referncias para o mesmo funcionrio, compare-os com o ==. Tire suas concluses. Para criar duas referncias pro mesmo funcionrio package Capitulo4_12; public class TestaFuncionario { public static void main(String[] args) { Funcionario f1 = new Funcionario(); f1.nome = "Dallas"; f1.salario = 1800; Funcionario f2 = f1; if (f1 == f2) { System.out.println("Os funcionrios so iguais"); } else { System.out.println("Os funcionrios so diferentes"); } }

} Os funcionrios vo ser iguais, pois as duas referncias esto referenciando o mesmo objeto. 6) (opcional) Em vez de utilizar uma String para representar a data, crie uma outra classe, chamada Data. Ela possui 3 campos int, para dia, ms e ano. Faa com que seu funcionrio passe a us-la. ( parecido com o ltimo exemplo, em que a Conta passou a ter referncia para um Cliente). package Capitulo4_12; public class Data { int dia; int mes; int ano; } package Capitulo4_12; public class Funcionario { String nome; String departamento; double salario; Data dataEntradaBanco; String rg; boolean estaNaEmpresa; void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } public void mostra(){ System.out.println("Nome:"+nome); System.out.println("Departamento:"+departamento); System.out.println("Salario:"+salario); System.out.println("Rg:"+rg); System.out.println("Data de entrada no banco:"+dataEntradaBanco); System.out.println("Trabalha na empresa:"+estaNaEmpresa); } } package Capitulo4_12; public class TestaFuncionario { public static void main(String[] args) { Funcionario f1 = new Funcionario(); Data data = new Data(); f1.dataEntradaBanco = data;

f1.nome = "Dallas"; f1.salario = 1800; Funcionario f2 = f1; if (f1 == f2) { System.out.println("Os funcionrios so iguais"); } else { System.out.println("Os funcionrios so diferentes"); } } }

7) (opcional) Modifique seu mtodo mostra para que ele imprima o valor da dataDeEntrada daquele Funcionario: package Capitulo4_12; public class Funcionario { String nome; String departamento; double salario; Data dataEntradaBanco; String rg; boolean estaNaEmpresa; void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } public void mostra(){ System.out.println("Nome:"+nome); System.out.println("Departamento:"+departamento); System.out.println("Salario:"+salario); System.out.println("Rg:"+rg); System.out.println("Trabalha na empresa:"+estaNaEmpresa); System.out.println("Dia:"+this.dataEntradaBanco.dia); System.out.println("Ms:"+this.dataEntradaBanco.mes); System.out.println("Ano:"+this.dataEntradaBanco.ano); } } As datas vo retornar o valor default para int, ou seja, vo retornar 0. Capitulo 4.14 1) Programa 1 Classe: Pessoa Atributos: nome, idade. Mtodo: void fazAniversario() Crie uma pessoa, coloque seu nome e idade iniciais, faa alguns aniversrios (aumentando a idade) e imprima seu nome e sua idade.

package Capitulo4_14; public class Pessoa { String nome; int idade; public void aniversario(){ idade++; } } package Capitulo4_14; public class TestaPessoa { public static void main(String[] args) { Pessoa p1 = new Pessoa(); p1.nome = "Luiz"; p1.idade = 1; System.out.println("Idade:"+p1.idade); for(int i = 1; i<=80; i ++){ p1.aniversario(); System.out.println("Idade:"+p1.idade); } } }

2) Programa 2 Classe: Porta Atributos: aberta, cor, dimensaoX, dimensaoY, dimensaoZ Mtodos: void abre(), void fecha(), void pinta(String s), boolean estaAberta() Crie uma porta, abra e feche a mesma, pinte-a de diversas cores, altere suas dimenses e use o mtodo estaAberta para verificar se ela est aberta. package Capitulo4_14; public class Porta { boolean estaAberta; String cor; double dimensaoX; double dimensaoY; double dimensaoZ; public void pinta(String cor){ this.cor = cor; } public void abre(){ estaAberta = true; } public void fecha(){ estaAberta = false; } public boolean estaAberta(){ if(estaAberta == true){ return true;

} else{ } } } package Capitulo4_14; public class TestaPorta { public static void main(String[] args) { Porta porta1 = new Porta(); porta1.pinta("Preto"); porta1.abre(); porta1.mostra(); porta1.estaAberta(); porta1.pinta("Azul"); porta1.dimensaoX = 1.8; porta1.dimensaoY = 2.25; porta1.dimensaoZ = 0.25; System.out.println("\n"); porta1.mostra(); porta1.fecha(); porta1.pinta("Amarelo"); System.out.println("\n"); porta1.mostra(); porta1.pinta("Preto e branco"); System.out.println("\n"); porta1.mostra(); } } 3) Programa 3 Classe: Casa Atributos: cor, porta1, porta2, porta3 Mtodo: void pinta(String s), int quantasPortasEstaoAbertas() Crie uma casa e pinte-a. Crie trs portas e coloque-as na casa; abra e feche as mesmas como desejar. Utilize o mtodo quantasPortasEstaoAbertas para imprimir o nmero de portas abertas. package Capitulo4_14; public class Casa { String cor; Porta porta1; Porta porta2; Porta porta3; int portasAbertas = 0; public void pinta(String s){ cor = s; } public int quantasPortasEstaoAbertas(){ if(porta1.estaAberta){ portasAbertas++; return false;

} if(porta2.estaAberta){ portasAbertas++; } if(porta3.estaAberta){ portasAbertas++; } return portasAbertas; } }

package Capitulo4_14; public class TestaCasa { public static void main(String[] args) { Casa casa1 = new Casa(); casa1.pinta("Verde"); Porta casaPorta1 = new Porta(); Porta casaPorta2 = new Porta(); Porta casaPorta3 = new Porta(); casa1.porta1 = casaPorta1; casa1.porta2 = casaPorta2; casa1.porta3 = casaPorta3; casa1.porta1.abre(); casa1.porta2.abre(); casa1.porta3.abre(); casa1.porta2.fecha(); casa1.porta1.fecha(); System.out.println("Quantidade abertas:"+casa1.quantasPortasEstaoAbertas()); } } de portas

Capitulo 5.5 1) Volte ao nosso sistema de Funcionario e crie uma classe Empresa dentro do mesmo arquivo .java. A Empresa tem um nome, cnpj e uma referncia a uma array de Funcionario, alm de outros atributos que voc julgar necessrio. package Capitulo5_5; public class Empresa2 { String nomeEmpresa; String cnpj; Funcionario [] funcionarios; } 2) A Empresa deve ter um mtodo adiciona, que recebe uma referncia a Funcionario como argumento, e guarda esse funcionrio.

package Capitulo5_5; public class Empresa { String nomeEmpresa; String cnpj; Funcionario [] funcionarios; void adiciona(Funcionario f){ for(int i=0; i<funcionarios.length; i++){ if(funcionarios[i]==null){ funcionarios[i] = f; break; } } } } 3) Crie uma classe TestaEmpresa que possuir um mtodo main. Dentro dele crie algumas instncias de Funcionario e passe para a empresa pelo mtodo adiciona. Repare que antes voc vai precisar criar a array, pois inicialmente o atributo empregados da classe Empresa no referencia lugar nenhum (null): package Capitulo5_5; public class Empresa { String nomeEmpresa; String cnpj; Funcionario [] funcionarios; void adiciona(Funcionario f){ for(int i=0; i<funcionarios.length; i++){ if(funcionarios[i]==null){ funcionarios[i] = f; break; } } } void mostraEmpregados() { for (int i = 0; i <funcionarios.length; i++) { if(funcionarios[i]!=null){ System.out.println("Funcionrio na posio: " + i); System.out.println("Nome:"+funcionarios[i].nome); System.out.println("Salario:"+funcionarios[i].salario); } } } } package Capitulo5_5; public class TestaEmpresa { public static void main(String[] args) { Empresa empresa = new Empresa(); empresa.funcionarios = new Funcionario[5]; Funcionario Funcionario Funcionario Funcionario f1 f2 f3 f4 = = = = new new new new Funcionario(); Funcionario(); Funcionario(); Funcionario();

Funcionario f5 = new Funcionario(); f1.salario = 5005; f2.salario = 3424; f1.nome = "Luiz"; f2.nome = "Dallas"; empresa.adiciona(f1); empresa.adiciona(f2); empresa.mostraEmpregados(); } }

Capitulo 5.8 1) O objetivo dos exerccios a seguir fixar os conceitos vistos at agora. Se voc est com dificuldade em alguma parte desse captulo, aproveite e treine tudo o que vimos at agora no pequeno programa abaixo:

_ Programa: Classe: Casa Atributos: cor, totalDePortas, portas[] Mtodos: void pinta(String s), int quantasPortasEstaoAbertas(), void adicionaPorta(Porta p), int totalDePortas() Crie uma casa, pinte-a. Crie trs portas e coloque-as na casa atravs do mtodo adicionaPorta, abra e feche-as como desejar. Utilize o mtodo quantasPortasEstaoAbertas para imprimir o nmero de portas abertas e o mtodo totalDePortas para imprimir o total de portas em sua casa.
package capitulo5_8; public class Porta { boolean estaAberta; String cor; double dimensaoX; double dimensaoY; double dimensaoZ; public void pinta(String cor){ this.cor = cor; } public void abre(){ estaAberta = true; } public void fecha(){ estaAberta = false; } public boolean estaAberta(){ if(estaAberta){ return true; } else{ return false; } } public void mostra(){

} }

System.out.println("Cor:" + cor); System.out.println("Est aberta:"+ estaAberta); System.out.println("Dimenso X:"+ dimensaoX); System.out.println("Dimenso Y:"+ dimensaoY); System.out.println("Dimenso Z:"+ dimensaoZ);

package capitulo5_8; public class Casa { String cor; int totalDePortas = 0; Porta[] portas; /** * @return Returns the cor. */ public String getCor() { return cor; } public void pinta(String s){ cor = s; } public int quantasPortasEstaoAbertas(){ int portasAbertas = 0; for(int i = 0; i < portas.length; i++){ if(portas[i].estaAberta()){ portasAbertas++; } } return portasAbertas; } public void adicionaPorta(Porta p){ for(int i = 0; i < portas.length; i++){ if(portas[i] == null){ portas[i] = p; break; } } } public int totalDePortas(){ for(int i = 0; i < portas.length; i ++){ if(portas[i] != null){ totalDePortas++; } } return totalDePortas; } } package capitulo5_8; public class TestaCasa { public static void main(String[] args) {

Casa novaCasa = new Casa(); novaCasa.portas = new Porta[3]; Porta porta1 = new Porta(); Porta porta2 = new Porta(); Porta porta3 = new Porta(); novaCasa.pinta("verde"); novaCasa.adicionaPorta(porta1); novaCasa.adicionaPorta(porta2); novaCasa.adicionaPorta(porta3); porta1.abre(); porta2.abre(); porta3.abre(); porta1.fecha(); porta3.fecha(); System.out.println("Quantidade de portas abertas:"+novaCasa.quantasPortasEstaoAbertas()); System.out.println("A casa contm "+novaCasa.totalDePortas()+" porta(s)");

Capitulo 6.8 1) Adicione o modificador de visibilidade (private, se necessrio) para cada atributo e mtodo da classe Funcionario. Tente criar um Funcionario no main e modificar ou ler um de seus atributos privados. O que acontece? package Capitulo6_8; public class Funcionario { private String nome; private String departamento; private double salario; private Data dataEntradaBanco; private String rg; private boolean estaNaEmpresa; void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } public boolean isEstaNaEmpresa() { return estaNaEmpresa; } public void mostra(){

System.out.println("Nome:"+nome); System.out.println("Departamento:"+departamento); System.out.println("Salario:"+salario); System.out.println("Rg:"+rg); System.out.println("Data de entrada no banco:"+dataEntradaBanco); System.out.println("Trabalha na empresa:"+estaNaEmpresa); System.out.println("Dia:"+this.dataEntradaBanco.dia); System.out.println("Ms:"+this.dataEntradaBanco.mes); System.out.println("Ano:"+this.dataEntradaBanco.ano); } }

package capitulo6_8; public class TestaFuncionario { public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.salario = 2800; funcionario.departamento = "Engenharia"; funcionario.rg = "16661848"; funcionario.estaNaEmpresa = true; funcionario1.dataEntradaBanco(25,10,2008); funcionario.mostra(); System.out.println("\n"); }

A classe teste funcionrio no consegue acessar diretamente os atributos de funcionrio, acessa apenas atravs de mtodos. 2) Crie os getters e setters necessrios da sua classe Funcionario . package Capitulo6_8; public class Funcionario { private String nome; private String departamento; private double salario; private Data dataEntradaBanco = new Data(); private String rg; private boolean estaNaEmpresa; /** * @param dataEntradaBanco The dataEntradaBanco to set. */ public void setDataEntradaBanco(int dia, int mes, int ano) { this.dataEntradaBanco.setDia(dia); this.dataEntradaBanco.setMes(mes); this.dataEntradaBanco.setAno(ano); } /** * @return Returns the dataEntradaBanco. */ public void getDataEntradaBanco() { System.out.println("Dia:"+dataEntradaBanco.getDia()); System.out.println("Mes:"+dataEntradaBanco.getMes());

System.out.println("Ano:"+dataEntradaBanco.getAno()); } /** * @return Returns the departamento. */ public String getDepartamento() { return departamento; } /** * @param departamento The departamento to set. */ public void setDepartamento(String departamento) { this.departamento = departamento; } /** * @return Returns the estaNaEmpresa. */ public boolean isEstaNaEmpresa() { return estaNaEmpresa; } /** * @param estaNaEmpresa The estaNaEmpresa to set. */ public void setEstaNaEmpresa(boolean estaNaEmpresa) { this.estaNaEmpresa = estaNaEmpresa; } /** * @return Returns the nome. */ public String getNome() { return nome; } /** * @param nome The nome to set. */ public void setNome(String nome) { this.nome = nome; } /** * @return Returns the rg. */ public String getRg() { return rg; } /** * @param rg The rg to set. */ public void setRg(String rg) { this.rg = rg; } /** * @return Returns the salario. */ public double getSalario() { return salario; } /** * @param salario The salario to set. */ public void setSalario(double salario) {

this.salario = salario; } void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } public void mostra(){ System.out.println("Nome:"+nome); System.out.println("Departamento:"+departamento); System.out.println("Salario:"+salario); System.out.println("Rg:"+rg); System.out.println("Trabalha na empresa:"+estaNaEmpresa); System.out.println("Dia:"+dataEntradaBanco.getDia()); System.out.println("Ms:"+dataEntradaBanco.getMes()); System.out.println("Ano:"+dataEntradaBanco.getAno()); } } 3) Modifique suas classes que acessam e modificam atributos de um Funcionario para utilizar os getters e setters recm criados. package Capitulo6_8; public class TestaFuncionario { public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.setNome("Luiz Washington"); funcionario.setSalario(1800); funcionario.setDepartamento("Engenharia"); funcionario.setRg("16661848"); funcionario.setEstaNaEmpresa(true); funcionario.setDataEntradaBanco(25,10,2008); funcionario.mostra(); System.out.println("\n"); funcionario.bonifica(780); System.out.println("\nSalrio depois do aumento"); System.out.println("Novo salrio:"+funcionario.getSalario()); funcionario.demite(); System.out.println(funcionario.isEstaNaEmpresa()); } } 4) Faa com que sua classe Funcionario possa receber, opcionalmente, o nome do Funcionario durante a criao do objeto. Utilize construtores para obter esse resultado. Dica: utilize um construtor sem argumentos tambm, para o caso de a pessoa no querer passar o nome do Funcionario. package Capitulo6_8;

public class Funcionario { private String nome; private String departamento; private double salario; private Data dataEntradaBanco = new Data(); private String rg; private boolean estaNaEmpresa; /** * */ public Funcionario(String nome) { this.nome = nome; } public Funcionario() { } /** * @param dataEntradaBanco The dataEntradaBanco to set. */ public void setDataEntradaBanco(int dia, int mes, int ano) { this.dataEntradaBanco.setDia(dia); this.dataEntradaBanco.setMes(mes); this.dataEntradaBanco.setAno(ano); } /** * @return Returns the dataEntradaBanco. */ public void getDataEntradaBanco() { System.out.println("Dia:"+dataEntradaBanco.getDia()); System.out.println("Mes:"+dataEntradaBanco.getMes()); System.out.println("Ano:"+dataEntradaBanco.getAno()); } /** * @return Returns the departamento. */ public String getDepartamento() { return departamento; } /** * @param departamento The departamento to set. */ public void setDepartamento(String departamento) { this.departamento = departamento; } /** * @return Returns the estaNaEmpresa. */ public boolean isEstaNaEmpresa() { return estaNaEmpresa; } /** * @param estaNaEmpresa The estaNaEmpresa to set. */ public void setEstaNaEmpresa(boolean estaNaEmpresa) { this.estaNaEmpresa = estaNaEmpresa; } /** * @return Returns the nome.

*/ public String getNome() { return nome; } /** * @param nome The nome to set. */ public void setNome(String nome) { this.nome = nome; } /** * @return Returns the rg. */ public String getRg() { return rg; } /** * @param rg The rg to set. */ public void setRg(String rg) { this.rg = rg; } /** * @return Returns the salario. */ public double getSalario() { return salario; } /** * @param salario The salario to set. */ public void setSalario(double salario) { this.salario = salario; } void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } public void mostra(){ System.out.println("Nome:"+nome); System.out.println("Departamento:"+departamento); System.out.println("Salario:"+salario); System.out.println("Rg:"+rg); System.out.println("Trabalha na empresa:"+estaNaEmpresa); System.out.println("Data de entrada no banco"); System.out.print("Dia:"+dataEntradaBanco.getDia()); System.out.print(" Ms:"+dataEntradaBanco.getMes()); System.out.println(" Ano:"+dataEntradaBanco.getAno()); } } 5) (opcional) Adicione um atributo na classe Funcionario de tipo int que se chama identificador. Esse identificador deve ter um valor nico para cada instncia do tipo Funcionario. O primeiro Funcionario instanciado tem identificador 1, o segundo 2, e assim por diante. Voc deve utilizar os recursos aprendidos aqui para resolver esse problema.

Crie um getter para o identificador. Devemos ter um setter? package capitulo6_8; public class Funcionario { private String nome; private String departamento; private double salario; private Data dataEntradaBanco = new Data(); private String rg; private boolean estaNaEmpresa; private static int idPassado; private int identificador; /** * */ public Funcionario(String nome) { this.nome = nome; idPassado++; identificador += idPassado; } public Funcionario() { idPassado++; identificador += idPassado; } /** * @return Returns the identificador. */ public int getIdentificador() { return identificador; } /** * @param dataEntradaBanco The dataEntradaBanco to set. */ public void setDataEntradaBanco(int dia, int mes, int ano) { this.dataEntradaBanco.setDia(dia); this.dataEntradaBanco.setMes(mes); this.dataEntradaBanco.setAno(ano); } /** * @return Returns the dataEntradaBanco. */ public void getDataEntradaBanco() { System.out.println("Dia:"+dataEntradaBanco.getDia()); System.out.println("Mes:"+dataEntradaBanco.getMes()); System.out.println("Ano:"+dataEntradaBanco.getAno()); } /** * @return Returns the departamento. */ public String getDepartamento() { return departamento; } /** * @param departamento The departamento to set. */ public void setDepartamento(String departamento) { this.departamento = departamento;

} /** * @return Returns the estaNaEmpresa. */ public boolean isEstaNaEmpresa() { return estaNaEmpresa; } /** * @param estaNaEmpresa The estaNaEmpresa to set. */ public void setEstaNaEmpresa(boolean estaNaEmpresa) { this.estaNaEmpresa = estaNaEmpresa; } /** * @return Returns the nome. */ public String getNome() { return nome; } /** * @param nome The nome to set. */ public void setNome(String nome) { this.nome = nome; } /** * @return Returns the rg. */ public String getRg() { return rg; } /** * @param rg The rg to set. */ public void setRg(String rg) { this.rg = rg; } /** * @return Returns the salario. */ public double getSalario() { return salario; } /** * @param salario The salario to set. */ public void setSalario(double salario) { this.salario = salario; } void bonifica(double aumento) { salario = salario + aumento; } void demite() { estaNaEmpresa = false; System.out.println("Funcionario demitido"); } public void mostra(){ System.out.println("Nome:"+nome); System.out.println("Departamento:"+departamento); System.out.println("Salario:"+salario);

System.out.println("Rg:"+rg); System.out.println("Trabalha na empresa:"+estaNaEmpresa); System.out.println("Data de entrada no banco"); System.out.print("Dia:"+dataEntradaBanco.getDia()); System.out.print(" Ms:"+dataEntradaBanco.getMes()); System.out.println(" Ano:"+dataEntradaBanco.getAno()); System.out.println("Identificador:"+getIdentificador()); } }

No devemos ter um setter para o identificador, pois o ele criado automaticamente quando um novo objeto criado. 6) (opcional) Crie os getters e setters da sua classe Empresa e coloque seus atributos como private. Lembre-se de que no necessariamente todos os atributos devem ter getters e setters. package Capitulo5_5; public class Empresa { private String nomeEmpresa; private String cnpj; private Funcionario [] funcionarios; /** * @return Returns the cnpj. */ public String getCnpj() { return cnpj; } /** * @param cnpj The cnpj to set. */ public void setCnpj(String cnpj) { this.cnpj = cnpj; } /** * @return Returns the funcionarios. */ public Funcionario getFuncionarios(int posicao) { return this.funcionarios[posicao]; } /** * @return Returns the nomeEmpresa. */ public String getNomeEmpresa() { return nomeEmpresa; } /** * @param nomeEmpresa The nomeEmpresa to set. */ public void setNomeEmpresa(String nomeEmpresa) { this.nomeEmpresa = nomeEmpresa; } void adiciona(Funcionario f){ for(int i=0; i<funcionarios.length; i++){ if(funcionarios[i]==null){ funcionarios[i] = f; break; }

} } void mostraEmpregados() { for (int i = 0; i <funcionarios.length; i++) { if(funcionarios[i]!=null){ System.out.println("Funcionrio na posio: " + i); System.out.println("Nome:"+funcionarios[i].nome); System.out.println("Salario:"+funcionarios[i].salario); } } }

7) (opcional) Na classe Empresa, em vez de criar um array de tamanho fixo, receba como parmetro no construtor o tamanho do array de Funcionario. Agora, com esse construtor, o que acontece se tentarmos dar new Empresa() sem passar argumento algum? Por qu? package capitulo6_8; public class Empresa { private String nomeEmpresa; private String cnpj; private Funcionario [] funcionarios; /** * @return Returns the cnpj. */ public String getCnpj() { return cnpj; } public Empresa(int tamanho) { funcionarios = new Funcionario[tamanho]; } /** * @param cnpj The cnpj to set. */ public void setCnpj(String cnpj) { this.cnpj = cnpj; } /** * @return Returns the funcionarios. */ public Funcionario getFuncionarios(int posicao) { return this.funcionarios[posicao]; } /** * @return Returns the nomeEmpresa. */ public String getNomeEmpresa() { return nomeEmpresa; } /** * @param nomeEmpresa The nomeEmpresa to set. */ public void setNomeEmpresa(String nomeEmpresa) { this.nomeEmpresa = nomeEmpresa; } void adiciona(Funcionario f){ for(int i=0; i<funcionarios.length; i++){ if(funcionarios[i]==null){

funcionarios[i] = f; break; } } } void mostraEmpregados() { for (int i = 0; i <funcionarios.length; i++) { if(funcionarios[i]!=null){ System.out.println("Funcionrio na posio: " + i); System.out.println("Nome:"+funcionarios[i].getNome()); System.out.println("Salario:"+funcionarios[i].getSalario()); } } } Vai gerar um erro, porque o construtor da classe solicita no momento da criao do objeto o tamanho do array de funcionrios, logo, obrigatrio informar o tamanho. 8) (opcional) Como garantir que datas como 31/2/2005 no sejam aceitas pela sua classe Data? package capitulo6_8; public class Data private int private int private int { dia; mes; ano; }

public void setData(int dia, int mes, int ano) { if (mes >= 1 && mes <= 12) { switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(dia >= 1 && dia <= 31){ this.dia = dia; this.mes = mes; this.ano = ano; } break; case 2: if (dia >= 1 && dia <= 28) { this.dia = dia; this.mes = mes; this.ano = ano; } break; case 4: case 6: case 9: case 11: if (dia >= 1 && dia <= 30) { this.dia = dia; this.mes = mes; this.ano = ano; }

break; default: this.dia = 0; this.mes = 0; this.ano = 0; } } }

/** * @return Returns the ano. */ public int getAno() { return ano; } /** * @return Returns the dia. */ public int getDia() { return dia; } /** * @return Returns the mes. */ public int getMes() { return mes; } public void mostraData(){ System.out.print("Data:"+getDia()); System.out.print("/"+getMes()); System.out.print("/"+getAno()); } } package capitulo6_8; public class TestaData { public static void main(String[] args) { Data data = new Data(); data.setData(31,02,1983); data.mostraData(); }

9) (opcional) Crie a classe PessoaFisica. Queremos ter a garantia de que pessoa fsica alguma tenha CPF invalido, nem seja criada PessoaFisica sem cpf inicial. (voc no precisa escrever o algoritmo de validao de cpf, basta passar o cpf por um mtodo valida(String x)....) package capitulo6_8; public class PessoaFisica { private String nome; private String cpf; public PessoaFisica(String nome, String cpf){ this.nome = nome; valida(cpf); } /**

* @param cpf The cpf to set. * mtodo para alterar um cpf invlido informado no momento da criao do objeto. */ public void setCpf(String cpf) { valida(cpf); } protected String valida(String cpf){ int cump = cpf.length(); if(cump==11){ this.cpf = cpf; } return cpf; } /** * @return Returns the cpf. */ public String getCpf() { return this.cpf; } /** * @return Returns the nome. */ public String getNome() { return nome; } public void mostra(){ System.out.println("Nome:"+getNome()); System.out.println("CPF:"+getCpf()); } } package capitulo6_8; public class TestePessoaFisica { public static void main(String[] args) { PessoaFisica p1 = new PessoaFisica("Luiz","80000000259863220"); p1.mostra(); p1.setCpf("14000000004"); p1.mostra(); } } Capitulo 7 1) Vamos criar uma classe Conta, que possua um saldo, e os mtodos para pegar saldo, depositar, e sacar. package capitulo7; public class Conta { private double saldo; void deposita(double valor) { this.saldo += valor;

} void saca(double valor) { this.saldo -= valor; } double getSaldo() { return this.saldo; } } 2) Adicione um mtodo na classe Conta, que atualiza essa conta de acordo com uma taxa percentual fornecida. package capitulo7; public class Conta { private double saldo; void deposita(double valor) { this.saldo += valor; } void saca(double valor) { this.saldo -= valor; } double getSaldo() { return this.saldo; } void atualiza(double taxa) { this.saldo += this.saldo * taxa; } } 3) Crie duas subclasses da classe Conta: ContaCorrente e ContaPoupanca. Ambas tero o mtodo atualiza reescrito: A ContaCorrente deve atualizar-se com o dobro da taxa e a ContaPoupanca deve atualizar-se com o triplo da taxa. Alm disso, a ContaCorrente deve reescrever o mtodo deposita, afim de retirar uma taxa bancria de dez centavos de cada depsito. package capitulo7; public class ContaCorrente extends Conta { void atualiza(double taxa) { this.saldo += this.saldo * taxa * 2; } void deposita(double valor) { this.saldo += valor - 0.10; } } package capitulo7; public class ContaPoupanca extends Conta{ void atualiza(double taxa) { this.saldo += this.saldo * taxa * 3;

} } 4) Crie uma classe com mtodo main e instancie essas classes, atualize-as e veja o resultado. package capitulo7; public class TestaContas { public static void main(String[] args) { Conta c = new Conta(); ContaCorrente cc = new ContaCorrente(); ContaPoupanca cp = new ContaPoupanca(); c.deposita(5000); cc.deposita(10000); cp.deposita(125000); c.atualiza(0.01); cc.atualiza(0.01); cp.atualiza(0.01); System.out.println(c.getSaldo()); System.out.println(cc.getSaldo()); System.out.println(cp.getSaldo()); } } Aps imprimir o saldo (getSaldo()) de cada uma das contas, o que acontece? R = cada objeto tem seu prprio getSaldo. 5) O que voc acha de rodar o cdigo anterior da seguinte maneira:
Conta c = new Conta(); Conta cc = new ContaCorrente(); Conta cp = new ContaPoupanca(); package capitulo7; public class TestaContas { public static void main(String[] args) { Conta c = new Conta(); Conta cc = new ContaCorrente(); Conta cp = new ContaPoupanca(); c.deposita(5000); cc.deposita(10000); cp.deposita(125000); c.atualiza(0.01); cc.atualiza(0.01); cp.atualiza(0.01); System.out.println(c.getSaldo()); System.out.println(cc.getSaldo()); System.out.println(cp.getSaldo()); } }

Compila? Roda? O que muda? Qual a utilidade disso? Realmente, essa no a maneira mais til do polimorfismo - veremos o seu real poder no prximo exerccio. Porm existe uma utilidade de declararmos uma varivel de um tipo menos especfico do que o objeto realmente .

R = Compila e roda, pois, como ContaCorrente e ContaPoupanca so heranas da classe Conta, ambas podem ser referenciadas por Conta, o compilador verifica que objeto est chamando o mtodo em tempo de execuo. 6) (opcional) Vamos criar uma classe que seja responsvel por fazer a atualizao de todas as contas bancrias e gerar um relatrio com o saldo anterior e saldo novo de cada uma das contas. package capitulo7; public class AtualizadorDeContas { private double saldoTotal = 0; private double selic; AtualizadorDeContas(double selic) { this.selic = selic; } void roda(Conta c) { System.out.println(c.getSaldo()); c.atualiza(selic); System.out.println(c.getSaldo()); saldoTotal += c.getSaldo(); } /** * @return Returns the saldoTotal. */ public double getSaldoTotal() { return saldoTotal; } }

7) (opcional) No mtodo main, vamos criar algumas contas e rod-las: package capitulo7; public class TesteAtualizadorDeContas { public static void main(String[] args) { Conta contaNormal = new Conta(); Conta contaPoupanca = new ContaPoupanca(); Conta contaCorrente = new ContaPoupanca(); contaNormal.deposita(8540); contaCorrente.deposita(300); contaPoupanca.deposita(7400); AtualizadorDeContas atualizador = new AtualizadorDeContas(0.25); atualizador.roda(contaNormal); atualizador.roda(contaCorrente); atualizador.roda(contaPoupanca); }

Capitulo 9.6

1) Repare que a nossa classe Conta uma excelente candidata para uma classe abstrata. Por qu? Que mtodos seriam interessantes candidatos a serem abstratos? Transforme a classe Conta em abstrata, repare o que acontece no seu main j existente do TestaContas. package capitulo9_6; public abstract class Conta { protected double saldo; void deposita(double valor) { this.saldo += valor; } void saca(double valor) { this.saldo -= valor; } double getSaldo() { return this.saldo; } void atualiza(double taxa) { this.saldo += this.saldo * taxa; } } R = porque no faz muito sentido criar um objeto do tipo Conta, o ideal fazer com que a classe conta torne-se abstrata e os seus mtodos comuns s subclasses sejam declarados como abstratos, para que seja obrigatrio a implementao deles na criao de objetos das subclasses. 2) Para que o cdigo do main volte a compilar, troque o new Conta() por new ContaCorrente(). Se agora no podemos dar new em Conta, qual a utilidade de ter um mtodo que recebe uma referncia a Conta como argumento? Alis, posso ter isso?

package capitulo9_6; public class TestaContas { public static void main(String[] args) { Conta c = new ContaCorrente(); Conta cc = new ContaCorrente(); Conta cp = new ContaPoupanca(); c.deposita(5000); cc.deposita(10000); cp.deposita(125000); c.atualiza(0.01); cc.atualiza(0.01); cp.atualiza(0.01); System.out.println(c.getSaldo()); System.out.println(cc.getSaldo()); System.out.println(cp.getSaldo());

} }

R = A utilidade que um mtodo definido em Conta pode ser chamado por objetos de suas subclasses, mesmo que o mtodo da superclasse receba como parmetro um objeto do tipo Conta, no ocorrera erro se for passado um objeto do tipo ContaCorrente ou ContaPoupanca porque eles tambm so objetos Conta. 3) Apenas pare efeito de entender melhor o abstract, remova (delete) o mtodo atualiza() da ContaPoupanca, dessa forma ele herdar o mtodo diretamente de Conta. Transforme o mtodo atualiza() da classe Conta em abstrato. Repare que, ao colocar a palavra chave abstract ao lado do mtodo, o Eclipse rapidamente vai sugerir que voc deve remover o corpo (body) do mtodo com um quick fix: package capitulo9_6; public abstract class Conta { protected double saldo; void deposita(double valor) { this.saldo += valor; } void saca(double valor) { this.saldo -= valor; } double getSaldo() { return this.saldo; } abstract void atualiza(double taxa); } R = A classe ContaPoupanca tem um erro, pois, o mtodo atualiza na classe Conta est definido como abstract, ou seja, todas suas subclasses tm que implement-lo. 4) Reescreva o mtodo atualiza() na classe ContaPoupanca para que a classe possa compilar normalmente. O eclipse tambm sugere isso como um quick fix: package capitulo9_6; public class ContaPoupanca extends Conta{ /* (non-Javadoc) * @see capitulo9_6.Conta#atualiza(double) */ void atualiza(double taxa) { // TODO Auto-generated method stub this.saldo += this.saldo * taxa * 3; } } Capitulo 11.11 1) Na classe Conta, modifique o mtodo deposita(double x): Ele deve lanar uma exception chamada IllegalArgumentException, que j faz parte da biblioteca do java, sempre que o valor passado como argumento for invlido (por exemplo, quando for negativo). package capitulo11_11; public abstract class Conta {

protected double saldo; public void deposita(double valor) { if (this.saldo < valor) { throw new IllegalArgumentException(); } else { this.saldo += valor - 0.10; } } public void saca(double valor) { if (this.saldo < valor) { this.saldo -= valor; } } public double getSaldo() { return this.saldo; } abstract void atualiza(double taxa); } 2) Crie uma classe TestaDeposita com o mtodo main. Crie uma ContaPoupanca e tente depositar valores invlidos: package capitulo11_11; public class TestaDeposita { public static void main(String[] args) { Conta novaConta1 = new ContaPoupanca(); try { novaConta1.deposita(300); novaConta1.deposita(-100); } catch (IllegalArgumentException e) { System.out.println("Voc tentou depositar um valor invlido"); } } } 3) Ao lanar a IllegalArgumentException, passe via construtor uma mensagem a ser exibida. Lembre que a String recebida como parmetro acessvel depois via o mtodo getMessage() herdado por todas as Exceptions. package capitulo11_11; public abstract class Conta { protected double saldo; public void deposita(double valor) { if (this.saldo < valor) { throw new IllegalArgumentException("Voc tentou depositar um valor negativo"); } else { this.saldo += valor - 0.10; }

} public void saca(double valor) { if (this.saldo < valor) { this.saldo -= valor; } } public double getSaldo() { return this.saldo; } abstract void atualiza(double taxa); } 4) Agora, altere sua classe TestaDeposita para exibir a mensagem da exceo atravs da chamada do getMessage(): package capitulo11_11; public class TestaDeposita { public static void main(String[] args) { Conta novaConta1 = new ContaPoupanca(); try { novaConta1.deposita(300); novaConta1.deposita(-100); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } Luiz Carlos