Вы находитесь на странице: 1из 19

Captulo 8 - Classes internas

8.1 - Onde deve ser usada e para que serve ? Antes de qualquer introduo esse assunto, vamos fazer uma explanao sobre as classes internas, onde e quando devem ser usadas, visto que esse assunto um tanto contundente no que se refere a reutilizao de cdigo, extensabilidade e escalabilidade de um cdigo sob o tica da OO. 8.1.1 - Um exemplo oficial Definir uma classe interna ou aninhada um recurso interessante adicionado na verso 1.1 da Java, porm deve ser bem cauteloso o seu uso visto que se assim no o for, com certeza teremos redundncia de cdigo, classes extremamente complicadas de ser entendidas e com seu uso limitado, portanto saiba decidir seu uso. Vejamos um exemplo usado na prpria framework de coleo Java, as classes Map herdam de uma superclasse chamada AbstractList, para seu funcionamento ela usa um objeto de uma classe interna chamado Entry e seu escopo est limitado classe AbstractList, com um funcionamento totalmente peculiar AbstractList, no teria muito sentido, criar uma classe externa para Entry, visto que sua utilizao se limita AbstractList. Definir classes especilialista um conhecimento extremamente necessrio no tocante orientao a objeto e nesse caso a classe Entry nada mais do que um membro (pois assim que tambm pode ser chamadas as classes internas) de AbstractList. 8.2 - As classes internas so divididas em: - Classe esttica aninhada (top-level class) - Classe interna comum - Classe interna local de mtodo - Classe interna annima 8.3 - Classes estticas Entenderemos agora o que so as classes estticas que tambm podem ser chamadas como classe de nvel superior ou top-level class, entretanto no fritar dos ovos tudo a mesma coisa. Uma classe esttica no tem acesso aos membros da instncia da classe encapsulada, somente os membros estticos, tem a mesma visibilidade de uma classe externa. Modificadores que podem ser atribudos uma classe interna esttica: static - obrigatrio claro protected public private abstract final * nunca abstract e final simultneamente claro!

1. public class Ex03 { 2. static int CountStatic = 0; 3. int CountNonStatic = 0; 4. 5. public static class Inner { 6. } 7. }

Voc NUNCA podera referencia o membro CountNonStatic dentro da classe Inner, uma vez que esse membro no esttico. Isso geraria um erro de compilao como podemos observar a seguir: 1. public class Ex03 { 2. static int CountStatic = 0; 3. int CountNonStatic = 0; 4. 5. public static class Inner { 6. public void doInner() { 7. System.out.println( CountNonStatic ); 8. } 9. } 10. }

O erro acima bsico pra quem j est no captulo 8 desse guia, mas vou mostrar o erro que o compilador gera: [color=red:e4cc865dea]Erro de compilao: non-static variable CountNonStatic cannot be referenced from a static context.[/color:e4cc865dea] Agora analisaremos o cdigo a seguir: 1. public class Outer { 2. static private int CountStatic = 0; 3. int CountNonStatic = 0; 4. 5. public static class Inner { 6. public void doInner() { 7. System.out.println( CountStatic ); 8. } 9. } 10. }

J o cdigo acima compila sem nenhum problema, visto que CountStatic um membro esttico da classe e pode ser acessado sem que haja uma instncia de Outer.

Voc deve estar se perguntando: "Oxente, mas porqu ento criar uma classe esttica (top-level class) se ela se comporta da mesma forma que uma classe externa ?" - Essa questo natural na cabea de qualquer um. A resposta nem sempre, vejamos um explicao lgica para tal. O que ns aprendemos no captulo 2 sobre o modificador private ? Que um membro com modificador private s pode ser acesso de dentro da prpria classe certo ? Mentira era tudo mentira ! Calma s uma brincadeira. Note que no cdigo anterior o membro CountStatic tem o modificador private, e mesmo assim est sendo acessado de uma classe que se comporta como classe externa porm no deixa de ser interna. O que uma classe de nvel superior tm de diferentes das classes externas no tocante relacionamento com sua classe encapsulada um acesso direto aos membros independentes de sua modificador de acesso. A seguir temos um exemplo prtico do us desse tipo de classe: 1. import java.util.*; 2. public class Week { 3. private int weeknr; 4. private int year; 5. public Week(int weeknr, int year) { 6. this.weeknr = weeknr; 7. this.year = year; 8. } 9. public Iterator getDays() { 10. return new DayIterator(this); 11. } 12. public int getWeeknr() { 13. return weeknr; 14. } 15. public int getYear() { 16. return year; 17. } 18. public static class DayIterator implements Iterator { 19. private int index = 0; 20. private Calendar cal = null; 21. 22. DayIterator (Week aWeek) { 23. cal = new GregorianCalendar(); 24. cal.clear(); 25. cal.set(Calendar.YEAR, aWeek.getYear()); 26. cal.set(Calendar.WEEK_OF_YEAR, aWeek.getWeeknr()); 27. } 28. public boolean hasNext() { 29. return index < 7; 30. } 31. public Object next() { 32. cal.set(Calendar.DAY_OF_WEEK, index++); 33. return cal.getTime(); 34. } 35. public void remove() {

36. // not implemented 37. } 38. } 39. 40. public static void main(String[] args) { 41. // list the days of the week 42. if (args.length < 2) { 43. System.err.println("Usage: java Week <weeknr> year>"); 44. System.exit(1); 45. } else { 46. try { 47. int weeknr = Integer.parseInt(args[0]); 48. int year = Integer.parseInt(args[1]); 49. Week wk = new Week(weeknr, year); 50. for (Iterator i=wk.getDays();i.hasNext();) { 51. System.err.println(i.next()); 52. } 53. } catch (NumberFormatException x) { 54. System.err.println("Illegal week or year"); 55. } 56. } 57. } 58. }

Entender o cdigo acima o far abrir os horizontes para o uso de classes estticas. 8.4 - Classe interna comum O estudo de classes internas no segue uma orientao explcita da Sun, porm comum se deparar com questes ao longo do exame, e voc precisar saber algumas regras para no vacilar (errar mesmo) alguma questo pertinentes esse assunto. Voc NUNCA poder ter uma instncia de uma classe interna sem que haja uma instncia de uma classe externa, Vejamos: 1. public class Outer { 2. class Inner { 3. } 4. }

Fixe bem isso: "Qualquer tentativa de instanciao da classe Inner sem que haja um OBJETO do tipo Outer, no funciona e entenderemos isso no que segue". Podemos inferir a partir dessa assero que um mtodo esttico de Outer nunca poder instanciar uma classe Inner, visto que um mtodo esttico pode ser acesso sem um objeto propriamente dito e isso viola a regra definida anteriormente. Portanto: 1. public class Outer {

2. public static void main(String[] args) { 3. Inner i = new Inner(); 4. } 5. 6. class Inner { 7. } 8. }

O cdigo anterior causa erro de compilao, visto que o mtodo main esttico e pode ser chamado sem que haja uma instncia de Outer, portanto erro: "Uma instncia de Inner s poder existir a partir sua classe externa" - mudando um pouco o cdigo obteramos um xito na compilao: 1. 2. 3. 4. 5. 6. 7. 8. 9. public class Outer { public static void main(String[] args) { Outer o = new Outer(); Inner i = o.new Inner(); } class Inner { } }

Compilao executado sem nenhum erro ! 8.4.1 - Classes internas e membros externos Uma classe interna como j foi falado, pode ser chamada de membro de classe da classe externa, portanto se um membro, ter visibilidade para qualquer membro da classe externa, isso mesmo, qualquer membro da classe externa pode ser acesso pela classe interna, vejamos: 1. public class Outer { 2. private int x = 0; 3. public static void main(String[] args) { 4. Outer o = new Outer(); 5. Inner i = o.new Inner(); 6. o.print(); 7. } 8. public void print() { 9. System.out.println("x before "+x); 10. Inner i = new Inner(); 11. i.print(); 12. } 13. class Inner { 14. public void print() {

15. x++; 16. System.out.println("x after: "+x); 17. } 18. } 19. }

Note que o membro x que privado foi acesso por Inner sem nenhum erro. O cdigo acima resulta em: x before 0 x after: 1 8.4.2 - Instanciando um objeto interno fora da classe externa Por mais que isso possa parecer estranho, mas possvel obter uma instncia de uma classe interna fora de sua classe externa, vejamos o cdigo que segue: 1. 2. 3. 4. 5. 6. 7. 8. 9. public class TestOuter { public static void main(String[] args) { Outer o = new Outer(); Outer.Inner i = o.new Inner(); } } class Outer { class Inner { } }

O cdigo acima compila e vlido, pois para se obter uma instncia Inner se informa sua classe externa - Outer. Isso muito interessante pode ser usado tambem para deixar o acoplamento de classes em um nvel baixo - mas tome muito cuidado com isso! 8.4.3 - Referenciando a classe externa de dentro da classe interna Ter uma referncia da classe externa de dentro da classe interna pode parecer estranho, porm, s vezes, necessrio. Imaginemos uma situao em que um mtodo da classe interna precise passar como referncia a classe externa, viu ? Por mais que a classe interna tem acesso todos os membros da classe externa, pode ser que em um caso atpico, voc precise disso, ou acha que estamos colocando isso aqui por ser notrio ? 1. public class TestOuter { 2. public static void main(String[] args) { 3. Outer o = new Outer(); 4. Outer.Inner i = o.new Inner(); 5. i.see(); 6. }

7. } 8. class Outer { 9. private int x = 10; 10. class Inner { 11. public void see() { 12. System.out.println(x); 13. System.out.println(this); // nota 1 14. System.out.println(Outer.this); // nota 2 15. } 16. } 17. }

Nota 1: Observe que a palavra chave this foi usada, nesse caso ele uma referncia ao objeto de Inner ! Nota 2: Note que this foi usado com o nome da classe externa, portanto, esse o objeto da classe externa 8.4.4 - Modificadores aplicados as classes internas comuns Como j foi falado mais tenho certeza que sua displicncia o fez esqueer :) - calma, calma s um teste de pacincia ! - uma classe interna um membro da classe externa, portando os modificadores a seguir podem ser aplicados uma classe interna, seguindo as mesmas regras do captulo 2: final abstract public private protected static - com uma exceo que estudaremos mais adiante. strictfp 8.5 - Classe interna local de mtodo At agora vimos como uma classe pode ser criada dentro de outra, com escopo em toda a classe, pois bem, agora vamos reduzir esse escopo, isso mesmo, definir uma classe com escopo de mtodo, vejamos: 1. public class Outer { 2. public void see() { 3. class Inner { }

4. } 5. }

Note que a classe Inner foi criada dentro do mtodo see(), apesar de no fazer nada pois nenhuma instncia foi criada de Inner dentro do mtodo see. 8.5.1 - Modificador padro Uma classe de mtodo tem o modificador private por padro, visto que no pode ser instancia de nenhum outro local seno o mtodo que encapsula a classe, vejamos um exemplo de uso: 1. public class TestOuter { 2. public static void main(String[] args) { 3. Outer o = new Outer(); 4. o.see(); 5. } 6. } 7. class Outer { 8. private int x = 10; 9. public void see() { 10. System.out.println("before "+x); 11. class Inner { 12. public Inner() { 13. x = 0; 14. } 15. } 16. System.out.println("after "+x); 17. } 18. }

Note que a classe Inner foi criada no meio do mtodo, e isso perfeitamente aceitvel pelo compilador, s no tente instanci-la antes de criar, pois isso seria um insulto ao compilador. O cdigo acima resulta em: before 10 after 10 A varivel x no foi inicializada com 0 pois o construtor de Inner no foi chamado, vejamos o exemplo a seguir: 1. public class TestOuter { 2. public static void main(String[] args) { 3. Outer o = new Outer(); 4. o.see(); 5. }

6. } 7. class Outer { 8. private int x = 10; 9. public void see() { 10. System.out.println("before "+x); 11. class Inner { 12. public Inner() { 13. x = 0; 14. } 15. } 16. Inner i = new Inner(); 17. System.out.println("after "+x); 18. } 19. }

Resultado: before 10 after 0 No existe forma no mundo Java para instanciar uma classe interna de mtodo fora do prprio mtodo, se conhecerem no esqueam de me avisar. Tentei mostrar um exemplo de instanciao invlida mas no fui criativo o suficiente, vejamos algo: 1. public class TestOuter { 2. public static void main(String[] args) { 3. Outer o = new Outer(); 4. o.see(); 5. } 6. } 7. 8. class Outer { 9. private int x = 10; 10. Inner x; // ERRO A CLASSE INNER NAO FOI DECLARADA 11. public void see() { 12. System.out.println("before "+x); 13. class Inner { 14. public Inner() { 15. x = 0; 16. } 17. } 18. Inner i = new Inner(); 19. System.out.println("after "+x); 20. } 21. }

ou 1. public class TestOuter { 2. public static void main(String[] args) { 3. Outer o = new Outer(); 4. System.out.println(o.see().new Inner().s); // SERIA O CMULO 5. } 6. } 7. 8. class Outer { 9. private int x = 10; 10. public void see() { 11. System.out.println("before "+x); 12. class Inner { 13. public String s = "string inner"; 14. public Inner() { 15. x = 0; 16. } 17. } 18. Inner i = new Inner(); 19. System.out.println("after "+x); 20. } 21. }

8.5.2.1 - Modificadores aplicados classe interna de mtodo Os nicos modificadores aplicados a essa classe so: abstract final Nunca os dois ao mesmo tempo claro! Pesquisamos muito para saber qual seria o sentido de criar uma classe de mtodo abstrata. Se algum descobrir esse enigma no esquea de me avisar... PODE ESPERAR QUE NA PROVA PODE CAIR ALGO ASSIM, MAS NO VACILEM !! 8.5.2 - Usando as variveis automtica de mtodos Uma classe interna de mtodo no pode referenciar as variveis locais de mtodo, por incrvel que parea ! Voc deve estar desgrenhando-se, mas no pode ! E existe uma explicao plausvel para isso. Imagina que uma classe interna de mtodo chame um mtodo e precise passar como parmetro a prpria classe, como um mtodo da classe interna pode referenciar uma varivel automtica aps a execuo do mtodo, uma vez que esse sendo finalizado, suas variveis so destrudas. Voc pode estar se

perguntando: "Oxente, mas como a classe interna precisar de uma varivel local aps a execuo do mtodo ?" Calma, imagine que o objeto da classe interna, que est no heap foi passado para um outro mtodo, e esse tem sua execuo mesmo aps o mtodo ter sido finalizado. Vejamos um exemplo invlido: 1. public class TestOuter { 2. public static void main(String[] args) { 3. Outer o = new Outer(); 4. o.see(); 5. } 6. } 7. 8. class Outer { 9. private int x = 10; 10. public void see() { 11. int y = 5; 12. System.out.println("before "+x); 13. class Inner { 14. public String s = "string inner"; 15. public Inner() { 16. x = y; // nota 1 17. } 18. } 19. Inner i = new Inner(); 20. System.out.println("after "+x); 21. } 22. }

Nota 1: Note que a varivel local y no pode ser referenciada dentro da classe interna de mtodo, isso causaria um erro de compilao: local variable y is accessed from within inner class; needs to be declared final Mas para aumentar a complexidade e o nmero de regras da linguagem Java, existe uma exceo para esse caso: Se a varivel for final poder ser referenciada (sei que voc j tinha traduzido a mensagem de erro acima!), vejamos 1. public class TestOuter { 2. public static void main(String[] args) { 3. Outer o = new Outer(); 4. o.see(); 5. } 6. } 7. 8. class Outer { 9. private int x = 10; 10. public void see() { 11. final int y = 5; 12. System.out.println("before "+x);

13. class Inner { 14. public String s = "string inner"; 15. public Inner() { 16. x = y; 17. } 18. } 19. Inner i = new Inner(); 20. System.out.println("after "+x); 21. } 22. }

Resultado: before 10 after 5 8.5.3 - Modificadores de acesso As mesmas regras de variveis locais se aplicam as classes internas de mtodos. Com isso podemos lembrar facilmente quais so os nicos modificadores aplicveis s variveis locais ? a) public, private, protected, padro b) final, abstract, static c) static, final, protected d) abstract, final e) todos os modificadores [color=green:e4cc865dea]Resposta no final do captulo !!![/color:e4cc865dea] 8.6 - Classes internas annimas Preste bastante ateno nesse tpico, pois voc pode se confundir quando se deparar com questes que envolvem classes annimas. Vejamos sua sintaxe: 1. class Car { 2. public void run() { ... } 3. } 4. 5. class Gol { 6. 7. Car car = new Car() { 8. public void break() { ... } 9. }; 10. }

Observe que a classe Car foi criada sem nenhuma anormalidade, porm a classe Vehicle foi criada com uma instncia de Car, e se voc for uma camarada esperto, notou que no houve um (;) (ponto-e-vrgula) aps a declarao do membro car, ao contrrio, foi criada uma instncia de uma classe annima (pois no foi definido um nome - que uma subclasse de Car) com um novo mtodo chamado break. A priori, pode parecer complicado, mas isso tudo nadamais do que, uma herana em local exclusivo (ou pra complicar mesmo), ou seja, somente nesse ponto preciso de redefinir a classe X. Vejamos um outro exemplo para entender melhor: 1. class Empregado { 2. public void trabalhar() { 3. System.out.println("trabalhar"); 4. } 5. } 6. 7. class QuadroFuncionario { 8. Empregado mgr = new Empregado() { 9. public void trabalhar() { 10. System.out.println("mandar"); 11. } 12. }; 13. 14. Empregado peao = new Empregado() { 15. public void trabalhar() { 16. System.out.println("executar"); 17. } 18. }; 19. }

Note que estamos realizando uma criao de mtodos polimrficos para os objetos peao e mgr onde ambos estendem de Empregado. Voc capaz de descobrir qual o erro da seguinte listagem ? 1. class Empregado { 2. public void trabalhar() { 3. System.out.println("trabalhar"); 4. } 5. } 6. 7. class QuadroFuncionario { 8. Empregado mgr = new Empregado() { 9. public void trabalhar() { 10. System.out.println("mandar"); 11. } 12. 13. public void demite() { 14. System.out.println("demite");

15. } 16. }; 17. 18. public void work() { 19. mgr.trabalhar(); 20. mgr.demite(); 21. } 22. }

Observe que mgr uma instncia de Empregado, o qual define o mtodos trabalhar, porm h uma tentativa de execuo do mtodo (que realmente foi definido na classe annima) mgr.demite(), que o compilador acusa erro de ignorncia, ou seja, o compilador s ir conhecer os mtodos definidos na classe pai - qualquer tentativa de execuo ou chamada de um mtodo no existente, causar um erro de compilao: cannot resolve symbol No podemos esquecer... 1. public class Test { 2. static public void enclosingMethod(final String arg1, int arg2) { 3. final String local = "A local final variable"; 4. String nonfinal = "A local non-final variable"; 5. Object obj = new Object() { 6. public String toString() { 7. return local + "," + arg1; 8. } 9. }; 10. 11. System.out.println(obj.toString()); 12. } 13. 14. public static void main(String[] args) { 15. enclosingMethod("fim", 0); 16. } 17. }

Esse cdigo perfeitamente compilado pois a classe annima que est sendo criada dentro do mtodo enclosingMethod referencia a varivel local que definida como final e arg1 que tambm um argumento com modificador final. Qualquer tentativa de referencia arg2 ou nonfinal dentro do mtodo acima, causar erro de compilao, se estiver duvidando por tentar. Se voc realmente precisar de referenciar uma varivel local dentro de uma classe annima podemos dar uma dica, provavelmente voc nunca precisar mas, s pra no perder a viagem: use array. Vejamos um exemplo:

1. public class Ex02 { 2. public static void main(String[] args) { 3. final int[] age = new int[1]; 4. System.out.println("Before: "+age[0]); 5. Pessoa p = new Pessoa() { 6. public void getAge() { 7. age[0] = 25; 8. } 9. }; 10. p.getAge(); 11. System.out.println("After: "+age[0]); 12. } 13. } 14. abstract class Pessoa { 15. abstract void getAge(); 16. }

Se voc est lembrado do que estudamos nos captulos iniciais, vai lembrar que o array final seus elementos no. Portanto o resultado desse cdigo ser: Before: 0 After: 25 8.6.2 - Implementando uma interface anonimamente Voc tambm poder se deparar com o cdigo a seguir: 1. public class Ex04 { 2. public static void main(String[] args) { 3. acao( new Evento() { 4. public void clicar() { 5. System.out.println("clicou"); 6. } 7. public void arrastar() { 8. System.out.println("arrastou"); 9. } 10. }); 11. } 12. public static void acao(Evento e) { 13. e.clicar(); 14. e.arrastar(); 15. } 16. } 17. interface Evento { 18. public abstract void clicar(); 19. public abstract void arrastar(); 20. }

Voc deve estar se peguntando, como pode passar para um mtodo uma instncia de uma interface ? Por mais que possa parecer isso, no o que est acontecendo, na verdade estamos criando uma classe annima que implementa a interface Evento, tanto que a nova classe teve que implementar todos os mtodos de Eventos (clicar e arrastar), se um desses dois mtodos no forem implementados na classe annima um erro de compilao seria exibido. Pode parecer estranho, mas no ! O que criamos aqui foi um implementador de classe como algumas literaturas assim o definem. Mesmo que esse assunto de classes annimas possa parecer diferentes as regras de herana, polimorfismo se aplicam, ou seja, uma tentativa de criar uma classe annima que herda de uma classe abstrata deve obrigatriamente implementar todos os seus mtodos, isso porque voc no pode definir uma classe annima abstrata. 1. public class Ex04 { 2. public static void main(String[] args) { 3. acao( new Evento() { 4. public void clicar() { 5. System.out.println("clicou"); 6. } 7. public void arrastar() { 8. System.out.println("arrastou"); 9. } 10. }); 11. } 12. public static void acao(Evento e) { 13. e.clicar(); 14. e.arrastar(); 15. } 16. } 17. interface Evento { 18. public abstract void clicar(); 19. public abstract void arrastar(); 20. }

Vamos mudar um pouco o cdigo acima: 1. public class Ex05 { 2. public static void main(String[] args) { 3. acao( new Evento() { 4. public void clicar() { 5. System.out.println("clicou"); 6. } 7. }); 8. } 9. public static void acao(Evento e) { 10. e.clicar();

11. e.arrastar(); 12. } 13. } 14. abstract class Evento { 15. public abstract void clicar(); 16. public abstract void arrastar(); 17. }

O cdigo acima gerar um erro de compilao, pois o mtodo arrastar no foi implementado na nova classe (isso seria perfeitamente possvel se a nova classe fosse abstrata) porm como uma classe concreta deve implement-lo. 8.6.3 - Classes finais no podem ser annimas O ttulo anterior j falou tudo o que precisava ser falado, mas vamos ser menos suscinto. Aprendemos algum dia de nossa vida que uma classe marcada com o modificador final nunca poderia ser estendida, consequentemente nunca poderamos ter uma classe annimas a partir de uma classe final, pois uma classe annima nada mais do que uma herana de uma outra classe onde a subclasse no tem nome. Vejamos isso na prtica: 1. public class Ex06 { 2. public static void main(String[] args) { 3. acao( new Boy() { 4. public String get() { 5. System.out.println("boy anonymous"); 6. } 7. }); 8. } 9. public static void acao(Boy e) { 10. System.out.println(e.get()); 11. } 12. } 13. final class Boy { 14. public String get() { 15. return "boy"; 16. } 17. }

O cdigo acima gerar o seguinte erro de compilao: [color=red:e4cc865dea]Erro de compilao: cannot inherit from final Boy[/color:e4cc865dea] Bom no podemos esquecer das demais regras envolvendo classes e herana, como a visibilidade para com classes de outros pacotes, enfim, se tiver alguma dvida quanto a isso volte ao captulo 2.

8.6.4 - Um cdigo real para esse caso... Vamos ver um uso prtico desse tipo de classe, inclusive vamos utilizar o mesmo exemplo do incio do captulo quando falvamos de classes estticas, modificaremos um pouco o cdigo exibido anteriormente: 1. import java.util.*; 2. public class WeekAnonymous { 3. private int weeknr; 4. private int year; 5. public WeekAnonymous(int weeknr, int year) { 6. this.weeknr = weeknr; 7. this.year = year; 8. } 9. public Iterator getDays() { 10. return new Iterator() { 11. private int index = 0; 12. private Calendar cal = null; 13. private Calendar getCalendar () { 14. if (cal == null) { 15. cal = new GregorianCalendar(); 16. cal.clear(); 17. cal.set(Calendar.YEAR, year); 18. cal.set(Calendar.WEEK_OF_YEAR, weeknr); 19. } 20. return cal; 21. } 22. public boolean hasNext() { 23. return index < 7; 24. } 25. public Object next() { 26. getCalendar().set(Calendar.DAY_OF_WEEK, index++); 27. return getCalendar().getTime(); 28. } 29. public void remove() { 30. // not implemented 31. } 32. }; 33. } 34. public static void main(String[] args) { 35. // list the days of the week 36. if (args.length < 2) { 37. System.err.println("Usage: java Week <weeknr> year>"); 38. System.exit(1); 39. } else { 40. try { 41. int weeknr = Integer.parseInt(args[0]); 42. int year = Integer.parseInt(args[1]); 43. Week wk = new Week(weeknr, year);

44. for (Iterator i=wk.getDays();i.hasNext();) { 45. System.err.println(i.next()); 46. } 47. } catch (NumberFormatException x) { 48. System.err.println("Illegal week or year"); 49. } 50. } 51. } 52. }

Note que o cdigo acima no criou uma classe esttica como no incio do captulo, nesse caso foi criada uma classe annima para resolver o mesmo problema, com isso podemos inferior que a utilizao de classes internas um assuntos extremamente relativo, podemos ser utilizado de diversas maneiras. Esses exemplos foram tirados do guia de certificao da Sun ! Para encerrar esse assunto de classes annimas, gostaramos de explanar que o uso de classes annimas so freqentemente utilizadas em desenvolvimento de ambientes grficos quando se usa AWT ou Swing principalmente para tratamento de eventos.

Вам также может понравиться