introdução a linguagem java-2003

2,760 views

Published on

Published in: Technology, Travel
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,760
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
121
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • introdução a linguagem java-2003

    1. 1. INTRODUÇÃO À LINGUAGEM JAVA Verão/2003 Aula 03 Estruturação de classes em Java 08.01.2003 Prof. Luciano Silva e-mail: lucianos@ime.usp.br
    2. 2. Tópicos da Aula 03 <ul><li>Estrutura geral de uma classe </li></ul><ul><li>Construtores </li></ul><ul><li>Garbage collection </li></ul><ul><li>Operador de autoreferência this </li></ul><ul><li>Atributos e métodos estáticos </li></ul><ul><li>Implementação de herança </li></ul><ul><li>Operador super </li></ul><ul><li>Polimorfismo </li></ul><ul><li>Modificador final </li></ul>
    3. 3. Estrutura geral de uma classe <ul><li>class < nome da classe > </li></ul><ul><li>extends < nome da super classe > </li></ul><ul><li>implements interface1,...,interfaceN{ </li></ul><ul><li>< tipo1 > atributo1; </li></ul><ul><li>< tipo2 > atributo 2, atributo 3; </li></ul><ul><li>... </li></ul><ul><li>construtores </li></ul><ul><li>... </li></ul><ul><li>void método1(){...} </li></ul><ul><li>void método2(<parâmetros>){...} </li></ul><ul><li>< tipo > método3(){...} </li></ul><ul><li>< tipo > método4(<parâmetros>){...} </li></ul><ul><li>} </li></ul>
    4. 4. Instanciação de classes <ul><li>Instanciação uma operação que permite evidenciar elementos (objetos) de uma classe. </li></ul><ul><li>Instanciação é uma operação na classe, não uma operação da instância da classe (objeto). Por convenção em Java, a operação new cria instâncias de uma classe, responsável pela alocação dos objetos, mas não pela inicialização dos atributos. </li></ul>
    5. 5. Construtores <ul><li>Como um método de classe não pode acessar diretamente os atributos na nova instância, um método de instância( construtor ) precisa ser escrito para inicializar os atributos. </li></ul><ul><li>Em Java, o nome do construtor é o mesmo nome da classe. Numa mesma classe, podem existir construtores sobrecarregados. O nome do construtor(e possíveis parâmetros) aparece junto com a operação new. </li></ul>
    6. 6. Exemplo de construtor <ul><li>class Funcionario{ </li></ul><ul><li>String nome,RG; </li></ul><ul><li>float salario; </li></ul><ul><li> Funcionario(String nomef,String ident,float sal){ </li></ul><ul><li>nome=nomef; </li></ul><ul><li>RG=ident; </li></ul><ul><li>salario=sal; </li></ul><ul><li>} </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>class admissao{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>Funcionario ze=new Funcionario(“Zé”,”15.000”,150); </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    7. 7. Construtores implícitos <ul><li>class Funcionario{ </li></ul><ul><li>String nome,RG; </li></ul><ul><li>float salario; </li></ul><ul><li> void admite(String nomef,String ident,float sal){ </li></ul><ul><li>nome=nomef; </li></ul><ul><li>RG=ident; </li></ul><ul><li>salario=sal; </li></ul><ul><li>}... </li></ul><ul><li>} </li></ul><ul><li>class admissao{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>Funcionario ze=new Funcionario(); </li></ul><ul><li>ze.admite(“Zé”,”15.000”,150). </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    8. 8. Construtores sobrecarregados(I) <ul><li>class Funcionario{ </li></ul><ul><li>String nome,RG; </li></ul><ul><li>float salario; </li></ul><ul><li>Funcionario(){ </li></ul><ul><li>nome=“ “; </li></ul><ul><li>RG=“ “; </li></ul><ul><li>salario=0.0; </li></ul><ul><li>} </li></ul><ul><li> Funcionario(String nomef,String ident,float sal){ </li></ul><ul><li>nome=nomef; </li></ul><ul><li>RG=ident; </li></ul><ul><li>salario=sal; </li></ul><ul><li>} </li></ul><ul><li>void admite(String nomef,String ident,float sal){...}... </li></ul><ul><li>} </li></ul>
    9. 9. Construtores sobrecarregados(II) <ul><li>Usando a classe anterior, poderíamos inicializar as instâncias de dois modos: </li></ul><ul><li>class admissão{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>Funcionario ze=new Funcionario(); </li></ul><ul><li>Funcionario maria=new Funcionario(“Maria”,”0”,300); </li></ul><ul><li>ze.admite(“Zé”,”15.000”,150); </li></ul><ul><li>.... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    10. 10. Destrutores <ul><li>Java não tem destrutores explícitos. Por exemplo, considere-se a seguinte mudança de referência: </li></ul><ul><li>class admissão{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>Funcionario ze=new Funcionario(); </li></ul><ul><li>ze.admite(“Zé”,”15.000”,150); </li></ul><ul><li>.... </li></ul><ul><li>ze=new Funcionario(“Zé maria”,”15.001”,200); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>O que acontece com a primeira instância, alocada, porém não mais referenciada pela variável ze? </li></ul>
    11. 11. Garbage collection <ul><li>De tempos em tempos, o interpretador java dispara um processo de recuperação de áreas de memória alocadas, porém não mais referenciadas ( processo de garbage collection (“coleta de lixo”)). </li></ul><ul><li>Isto, eventualmente, pode afetar o desempenho da aplicação. </li></ul>
    12. 12. Operador de autoreferência this <ul><li>this é um “apontador” para o objeto em questão. Usando este apontador, um método pode acessar todas os atributos das classe a que pertence. </li></ul><ul><li>Ele é criado automaticamente quando um objeto chama um método e “aponta”para o próprio objeto que chamou o método. </li></ul>
    13. 13. Exemplo de uso do this <ul><li>class Funcionario{ </li></ul><ul><li>String nome,RG; </li></ul><ul><li>float salario; </li></ul><ul><li>Funcionario(String nome,String RG,float salario){ </li></ul><ul><li>this.nome=nome; // Acesso aos atributos </li></ul><ul><li>this.RG=RG; </li></ul><ul><li>this.salario=salario; </li></ul><ul><li>} </li></ul><ul><li>Funcionario(){ </li></ul><ul><li>this(“ “,” “,0.0); // Construtor que chama construtor </li></ul><ul><li>} </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
    14. 14. Atributos estáticos <ul><li>Um atributo com o modificador static tem o seu valor compartilhado por todos os objetos da classe, ou seja, só haverá uma cópia dele para todos os objetos da classe. </li></ul><ul><li>Por exemplo: </li></ul><ul><li>static float valor_dolar; </li></ul>
    15. 15. Métodos estáticos <ul><li>Um método estático é um método que pode ser invocado, mesmo que não haja nenhuma instância da classe, isto é, pode ser referenciado independentemente de qualquer objeto. </li></ul><ul><li>Por exemplo: </li></ul><ul><li>static void cambio(float valor){...} </li></ul><ul><li>Como independe da instância, não tem autoreferência ( operador this ). Métodos estáticos podem referenciar somente atributos estáticos. </li></ul>
    16. 16. Exemplo de atributos e métodos estáticos <ul><li>class produtoexportacao{ </li></ul><ul><li>String nome; </li></ul><ul><li>float preco_venda,preco_compra; </li></ul><ul><li>static float valor_dolar; </li></ul><ul><li>produtoexportacao(String nome,float precov,float precoc){ </li></ul><ul><li>this.nome=nome; </li></ul><ul><li>this.preco_venda=precov; </li></ul><ul><li>this.preco_compra=precoc; </li></ul><ul><li>} </li></ul><ul><li>... </li></ul><ul><li>static void cambio(float valor){ </li></ul><ul><li>valor_dolar=valor; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    17. 17. Exemplo de atributos e métodos estáticos(continuação) <ul><li>class comercio_exterior{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>float cotacao; </li></ul><ul><li>cotacao=1.50; </li></ul><ul><li>produtoexportacao.cambio(cotacao);// Chamada de método estático </li></ul><ul><li> // sem instanciação </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    18. 18. Herança <ul><li>Herança é um relacionamento do tipo generalização/ especialização, onde uma classe pode ser derivada( subclasse) de outra mais geral (superclasse), absorvendo todas as características fundamentais e adicionando outras novas características, de tal modo a torná-la mais especializada. </li></ul>
    19. 19. Exemplo para implementação de herança Funcionario nome RG salario aumenta(valor) pagamento Chefe contas gastos_extra adicional_chefia pagamento
    20. 20. Implementação da superclasse Funcionario <ul><li>class Funcionario{ </li></ul><ul><li>String nome,RG; </li></ul><ul><li>float salario; </li></ul><ul><li> Funcionario(String nomef,String ident,float sal){ </li></ul><ul><li>nome=nomef; </li></ul><ul><li>RG=ident; </li></ul><ul><li>salario=sal; </li></ul><ul><li>} </li></ul><ul><li>void aumenta(float pouco){ </li></ul><ul><li>salario=salario+pouco; </li></ul><ul><li>} </li></ul><ul><li>float pagamento(){ </li></ul><ul><li>return (salario); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    21. 21. Implementação da subclasse Chefe <ul><li>class Chefe </li></ul><ul><li>extends Funcionario{ </li></ul><ul><li>float contas, gastos_extra,adicional_chefia; </li></ul><ul><li> Chefe(String nomef,String RG, float sal, float contas, </li></ul><ul><li>float gastos_extra, float adicional){ </li></ul><ul><li>super(nomef,RG,sal); // Construtor da superclasse (Funcionario) </li></ul><ul><li>this.contas=contas; </li></ul><ul><li>this.gastos_extra=gastos_extra; </li></ul><ul><li>this.adicional_chefia=adicional; </li></ul><ul><li>} </li></ul><ul><li>float pagamento(){ </li></ul><ul><li>float recebe; </li></ul><ul><li>recebe=this.salario; </li></ul><ul><li>recebe=recebe+contas+gastos_extra+adicional_chefia; </li></ul><ul><li>return(recebe); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    22. 22. Instanciação da subclasse <ul><li>class ganhando{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>Chefe joao=new Chefe(“João”,”320”,11150,1250,680, 5000); </li></ul><ul><li>joao.aumenta(300); </li></ul><ul><li>System.out.println(“João ganha”+joao.pagamento()); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    23. 23. Operador de referência super <ul><li>super é um operador para acessar atributos e métodos das superclasses, a partir das subclasses. </li></ul><ul><li>Este operador deve ser usado com bastante cuidado, principalmente na presença de modificadores de acesso. </li></ul>
    24. 24. Implementação da subclasse Chefe com super <ul><li>class Chefe </li></ul><ul><li>extends Funcionario{ </li></ul><ul><li>float contas, gastos_extra,adicional_chefia; </li></ul><ul><li> Chefe(String nomef,String RG, float sal, float contas, </li></ul><ul><li>float gastos_extra, float adicional){ </li></ul><ul><li>super(nomef,RG,sal); // Construtor da superclasse (Funcionario) </li></ul><ul><li>this.contas=contas; </li></ul><ul><li>this.gastos_extra=gastos_extra; </li></ul><ul><li>this.adicional_chefia=adicional; </li></ul><ul><li>} </li></ul><ul><li>float pagamento(){ </li></ul><ul><li>float recebe; </li></ul><ul><li>recebe=super.pagamento(); // Chamada de pagamento() da superclasse </li></ul><ul><li>recebe=recebe+contas+gastos_extra+adicional_chefia; </li></ul><ul><li>return(recebe); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    25. 25. POLIMORFISMO <ul><li>Habilidade de uma ou mais classes responder a uma mesma mensagem de forma diferente. </li></ul>Polimorfismo Universal Ad-Hoc Paramétrico Inclusão Sobrecarga Coerção ( Taxonomia de Cardelli e Wegner )
    26. 26. POLIMORFISMO UNIVERSAL <ul><li>Mecanismo de trabalho com um número infinito de tipos. </li></ul><ul><li>Pode ser de dois tipos: </li></ul><ul><li>paramétrico ( Ex.: templates do C++) </li></ul><ul><li>de inclusão </li></ul>
    27. 27. Polimorfismo universal paramétrico <ul><li>No polimorfismo paramétrico, um único método é codificado, e ele trabalhará uniformemente num intervalo de tipos. </li></ul><ul><li>Java não implementa polimorfismo universal paramétrico. </li></ul>
    28. 28. Exemplo de polimorfismo universal paramétrico ( em C++) <ul><li>template <class T> // Tipo T </li></ul><ul><li>class Vetor{ </li></ul><ul><li>T *dados; // Elementos do vetor </li></ul><ul><li>int tamanho; // Tamanho do vetor </li></ul><ul><li>public: Vector(int); // Construtor </li></ul><ul><li>~Vector() {delete [] dados;} // Destrutor </li></ul><ul><li>T& operator[](int i) { return dados[i];} // Retorna o elemento da posição i </li></ul><ul><li>}; </li></ul><ul><li>template <class T> Vetor<T>::Vetor(int n){ </li></ul><ul><li>dados=new T[n]; </li></ul><ul><li>tamanho=n; </li></ul><ul><li>} </li></ul><ul><li>main(){ </li></ul><ul><li>Vetor<int> x(5); // Gera um vetor para armazenar 5 números inteiros </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
    29. 29. Polimorfismo universal de inclusão <ul><li>O polimorfismo de inclusão está relacionado com a noção de supertipo e subtipo. Um subtipo pode ser usado no contexto do supertipo. </li></ul><ul><li>Em orientação a objetos, isto está relacionado com a noção de subclasse e superclasse. Isto significa que o tratamento da mensagem dependerá do contexto da classe. </li></ul>
    30. 30. Exemplo para polimorfismo universal de inclusão Funcionario nome RG salario aumenta(valor) pagamento Chefe contas gastos_extra adicional_chefia pagamento
    31. 31. Implementação da superclasse Funcionario <ul><li>class Funcionario{ </li></ul><ul><li>String nome,RG; </li></ul><ul><li>float salario; </li></ul><ul><li> Funcionario(String nomef,String ident,float sal){ </li></ul><ul><li>nome=nomef; </li></ul><ul><li>RG=ident; </li></ul><ul><li>salario=sal; </li></ul><ul><li>} </li></ul><ul><li>void aumenta(float pouco){ </li></ul><ul><li>salario=salario+pouco; </li></ul><ul><li>} </li></ul><ul><li>float pagamento(){ </li></ul><ul><li>return (salario); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    32. 32. Implementação da subclasse Chefe <ul><li>class Chefe </li></ul><ul><li>extends Funcionario{ </li></ul><ul><li>float contas, gastos_extra,adicional_chefia; </li></ul><ul><li> Chefe(String nomef,String RG, float sal, float contas, </li></ul><ul><li>float gastos_extra, float adicional){ </li></ul><ul><li>super(nomef,RG,sal); // Construtor da superclasse (Funcionario) </li></ul><ul><li>this.contas=contas; </li></ul><ul><li>this.gastos_extra=gastos_extra; </li></ul><ul><li>this.adicional_chefia=adicional; </li></ul><ul><li>} </li></ul><ul><li>float pagamento(){ </li></ul><ul><li>float recebe; </li></ul><ul><li>recebe=super.pagamento(); // Chamada no contexto da superclasse </li></ul><ul><li>recebe=recebe+contas+gastos_extra+adicional_chefia; </li></ul><ul><li>return(recebe); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    33. 33. Chamadas na superclasse e subclasse <ul><li>class ganhando{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>Chefe joao=new Chefe(“João”,”320”,11150,1250,680, 5000); </li></ul><ul><li>Funcionario maria=new Funcionario(“Maria”,”16.000”,2000); </li></ul><ul><li>System.out.println(“João ganha”+ joao.pagamento() ); </li></ul><ul><li>Chamada no contexto </li></ul><ul><li>da subclasse </li></ul><ul><li>System.out.println(“Maria ganha”+ maria.pagamento() ); </li></ul><ul><li> Chamada no contexto </li></ul><ul><li> da superclasse </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    34. 34. POLIMORFISMO ad-hoc <ul><li>Mecanismo de trabalho com um número finito de tipos. </li></ul><ul><li>O polimorfismo ad-hoc pode ser de dois tipos: </li></ul><ul><li>por coerção </li></ul><ul><li>por sobrecarga </li></ul>
    35. 35. POLIMORFISMO ad-hoc POR COERÇÃO <ul><li>Meio de contornar a rigidez de tipos monomórficos. </li></ul><ul><li>A linguagem dá suporte à coerção através de um mapeamento interno entre tipos. O tipo que está sendo mapeado é chamado coargido. </li></ul>
    36. 36. Exemplo de polimorfismo ad-hoc por coersão <ul><li>class numero{ </li></ul><ul><li>float num; </li></ul><ul><li>numero(float num){ // Construtor </li></ul><ul><li>this.num=num; </li></ul><ul><li>} </li></ul><ul><li>void soma(float num){ </li></ul><ul><li>this.num+=num; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class teste{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>numero n=new numero(1.3); </li></ul><ul><li>int valor=5; </li></ul><ul><li>n.soma(valor); // valor é coargido de int para float </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    37. 37. POLIMORFISMO ad-hoc POR SOBRECARGA <ul><li>Permite que um nome de método seja usado mais do que uma vez com diferentes quantidades ou tipos de parâmetros. </li></ul><ul><li>A seleção do método adequado é feita com base em comparação dos tipos ou quantidade dos parâmetros. </li></ul>
    38. 38. Exemplo de polimorfismo ad-hoc por sobrecarga <ul><li>class complexo{ // Números da forma a+bi </li></ul><ul><li>float real,imagin; </li></ul><ul><li> complexo(float r,float i){ </li></ul><ul><li>real=r; </li></ul><ul><li>imagin=i; </li></ul><ul><li>} </li></ul><ul><li> complexo soma(float r){ </li></ul><ul><li>// Soma r na parte real e devolve o complexo resultante </li></ul><ul><li>complexo s=new complexo(real+r,imagin); </li></ul><ul><li>return(s); </li></ul><ul><li>} </li></ul><ul><li>complexo soma(float r,float i){ </li></ul><ul><li>// Soma r na parte real e i na parte imaginária e devolve o resultado </li></ul><ul><li>complexo s=new complexo(real+r,imagin+i); </li></ul><ul><li>return(s); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    39. 39. Exemplo de polimorfismo ad-hoc por sobrecarga(continuação) <ul><li>class teste{ </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>complexo num=new complexo(1,1); // Cria 1+i </li></ul><ul><li>complexo num2=num.soma(1); // Cria 2+i </li></ul><ul><li>complexo num3=num.soma(1,1); // Cria 2+2i </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    40. 40. Modificador final <ul><li>O modificador final tem comportamentos diferentes, dependendo do local onde é aplicado: </li></ul><ul><li>atributo : uma vez que é inicializado, não pode mais sofrer alteração (~constante). </li></ul><ul><li>método : nas classes descendentes não pode mais haver polimorfismo com o método. </li></ul><ul><li>classes : não podem mais ser estendidas. </li></ul>
    41. 41. Exemplo de uso de final <ul><li>class classe1{ </li></ul><ul><li>final double pi=3.1415926535; // Inicialização de pi ( funciona como constante ) </li></ul><ul><li>final void calcula(){ </li></ul><ul><li>pi=2.718; // ERRO DE COMPILAÇÃO! pi já foi inicializado! </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>final class classe2 </li></ul><ul><li>extends classe1{ </li></ul><ul><li>... </li></ul><ul><li>void calcula(){...}; //ERRO! calcula() é final na superclasse. </li></ul><ul><li>} </li></ul><ul><li>class classe3 </li></ul><ul><li>extends classe2{ // ERRO! classe2 é final. </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>

    ×