SlideShare uma empresa Scribd logo
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
Tópicos da Aula 03 Estrutura geral de uma classe Construtores Garbage collection Operador de autoreferência this Atributos e métodos estáticos Implementação de herança Operador super Polimorfismo Modificador final
Estrutura geral de uma classe class < nome da classe > extends < nome da super classe > implements interface1,...,interfaceN{ < tipo1 > atributo1; < tipo2 > atributo 2, atributo 3; ... construtores ... void método1(){...} void método2(<parâmetros>){...} < tipo > método3(){...} < tipo > método4(<parâmetros>){...} }
Instanciação de classes Instanciação uma operação que permite evidenciar elementos (objetos) de uma classe. 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.
Construtores  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. 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.
Exemplo de construtor class Funcionario{ String nome,RG; float salario;   Funcionario(String nomef,String ident,float sal){ nome=nomef; RG=ident; salario=sal; } ... } class admissao{ public static void main(String args[]){ Funcionario ze=new Funcionario(“Zé”,”15.000”,150); ... } }
Construtores implícitos class Funcionario{ String nome,RG; float salario;   void admite(String nomef,String ident,float sal){ nome=nomef; RG=ident; salario=sal; }... } class admissao{ public static void main(String args[]){ Funcionario ze=new Funcionario(); ze.admite(“Zé”,”15.000”,150). ... } }
Construtores sobrecarregados(I) class Funcionario{ String nome,RG; float salario; Funcionario(){ nome=“ “; RG=“ “; salario=0.0; }   Funcionario(String nomef,String ident,float sal){ nome=nomef; RG=ident; salario=sal; } void admite(String nomef,String ident,float sal){...}... }
Construtores sobrecarregados(II) Usando a classe anterior, poderíamos inicializar as instâncias de dois modos: class admissão{ public static void main(String args[]){ Funcionario ze=new Funcionario(); Funcionario maria=new Funcionario(“Maria”,”0”,300); ze.admite(“Zé”,”15.000”,150); .... } }
Destrutores Java não tem destrutores explícitos. Por exemplo, considere-se a seguinte mudança de referência: class admissão{ public static void main(String args[]){ Funcionario ze=new Funcionario(); ze.admite(“Zé”,”15.000”,150); .... ze=new Funcionario(“Zé maria”,”15.001”,200); } } O que acontece com a primeira instância, alocada, porém não mais referenciada pela variável ze?
Garbage collection 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”)). Isto, eventualmente, pode afetar o desempenho da aplicação.
Operador de autoreferência  this 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. Ele é criado automaticamente quando um objeto chama um método e “aponta”para o próprio objeto que chamou o método.
Exemplo de uso do  this class Funcionario{ String nome,RG; float salario; Funcionario(String nome,String RG,float salario){ this.nome=nome;  // Acesso aos atributos this.RG=RG; this.salario=salario; } Funcionario(){ this(“ “,” “,0.0);  // Construtor que chama construtor } ... }
Atributos estáticos 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. Por exemplo: static float valor_dolar;
Métodos estáticos 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. Por exemplo: static void cambio(float valor){...} Como independe da instância, não tem autoreferência ( operador  this  ).  Métodos estáticos podem referenciar somente atributos estáticos.
Exemplo de atributos e métodos estáticos class  produtoexportacao{ String nome; float preco_venda,preco_compra; static float valor_dolar; produtoexportacao(String nome,float precov,float precoc){ this.nome=nome; this.preco_venda=precov; this.preco_compra=precoc; } ... static void cambio(float valor){ valor_dolar=valor; } }
Exemplo de atributos e métodos estáticos(continuação) class  comercio_exterior{ public  static void main(String args[]){ float cotacao; cotacao=1.50; produtoexportacao.cambio(cotacao);// Chamada de método estático   // sem instanciação } }
Herança 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.
Exemplo para implementação de herança Funcionario nome RG salario aumenta(valor) pagamento Chefe contas gastos_extra adicional_chefia pagamento
Implementação da superclasse Funcionario class Funcionario{ String nome,RG; float salario;   Funcionario(String nomef,String ident,float sal){ nome=nomef; RG=ident; salario=sal; } void aumenta(float pouco){ salario=salario+pouco; } float pagamento(){ return (salario); } }
Implementação da subclasse Chefe class Chefe extends Funcionario{ float contas, gastos_extra,adicional_chefia;   Chefe(String nomef,String RG, float sal, float contas,  float gastos_extra, float adicional){ super(nomef,RG,sal);  // Construtor da superclasse (Funcionario) this.contas=contas; this.gastos_extra=gastos_extra; this.adicional_chefia=adicional; } float pagamento(){ float recebe; recebe=this.salario; recebe=recebe+contas+gastos_extra+adicional_chefia; return(recebe);  } }
Instanciação da subclasse class ganhando{ public static void main(String args[]){ Chefe joao=new Chefe(“João”,”320”,11150,1250,680, 5000); joao.aumenta(300); System.out.println(“João ganha”+joao.pagamento()); } }
Operador de referência  super super  é um operador para acessar atributos e métodos das superclasses, a partir das subclasses.  Este operador deve ser usado com bastante cuidado, principalmente na presença de modificadores de acesso.
Implementação da subclasse Chefe com super class Chefe extends Funcionario{ float contas, gastos_extra,adicional_chefia;   Chefe(String nomef,String RG, float sal, float contas,  float gastos_extra, float adicional){ super(nomef,RG,sal);  // Construtor da superclasse (Funcionario) this.contas=contas; this.gastos_extra=gastos_extra; this.adicional_chefia=adicional; } float pagamento(){ float recebe; recebe=super.pagamento(); // Chamada de pagamento() da superclasse recebe=recebe+contas+gastos_extra+adicional_chefia; return(recebe); } }
POLIMORFISMO Habilidade de uma ou mais classes responder a uma mesma mensagem de forma diferente. Polimorfismo Universal Ad-Hoc Paramétrico  Inclusão  Sobrecarga  Coerção   (  Taxonomia de Cardelli e Wegner )
POLIMORFISMO UNIVERSAL Mecanismo de trabalho com um número infinito de tipos. Pode ser de dois tipos: paramétrico ( Ex.: templates do C++) de inclusão
Polimorfismo universal paramétrico No polimorfismo paramétrico, um único método é codificado, e ele trabalhará uniformemente num intervalo de tipos. Java não implementa polimorfismo universal paramétrico.
Exemplo de polimorfismo universal paramétrico ( em C++) template <class T>  // Tipo T class Vetor{ T *dados;  // Elementos do vetor int tamanho; // Tamanho do vetor public: Vector(int); // Construtor ~Vector() {delete [] dados;}  // Destrutor T& operator[](int i) { return dados[i];}  // Retorna o elemento da posição i }; template <class T> Vetor<T>::Vetor(int n){ dados=new T[n]; tamanho=n; } main(){ Vetor<int> x(5);  // Gera um vetor para armazenar 5 números inteiros ... }
Polimorfismo universal de inclusão O polimorfismo de inclusão está relacionado com a noção de supertipo e subtipo. Um subtipo pode ser usado no contexto do supertipo. 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.
Exemplo para polimorfismo universal de inclusão Funcionario nome RG salario aumenta(valor) pagamento Chefe contas gastos_extra adicional_chefia pagamento
Implementação da superclasse Funcionario class Funcionario{ String nome,RG; float salario;   Funcionario(String nomef,String ident,float sal){ nome=nomef; RG=ident; salario=sal; } void aumenta(float pouco){ salario=salario+pouco; } float pagamento(){ return (salario); } }
Implementação da subclasse Chefe class Chefe extends Funcionario{ float contas, gastos_extra,adicional_chefia;   Chefe(String nomef,String RG, float sal, float contas,  float gastos_extra, float adicional){ super(nomef,RG,sal);  // Construtor da superclasse (Funcionario) this.contas=contas; this.gastos_extra=gastos_extra; this.adicional_chefia=adicional; } float pagamento(){ float recebe; recebe=super.pagamento();  // Chamada no contexto da superclasse recebe=recebe+contas+gastos_extra+adicional_chefia; return(recebe);  } }
Chamadas na superclasse e subclasse class ganhando{ public static void main(String args[]){ Chefe joao=new Chefe(“João”,”320”,11150,1250,680, 5000); Funcionario maria=new Funcionario(“Maria”,”16.000”,2000); System.out.println(“João ganha”+ joao.pagamento()  ); Chamada no contexto da subclasse System.out.println(“Maria ganha”+ maria.pagamento()  );   Chamada no contexto   da superclasse } }
POLIMORFISMO ad-hoc Mecanismo de trabalho com um número finito de tipos. O polimorfismo ad-hoc pode ser de dois tipos: por coerção por sobrecarga
POLIMORFISMO ad-hoc POR COERÇÃO Meio de contornar a rigidez de tipos monomórficos.  A linguagem dá suporte à coerção através de um mapeamento interno entre tipos. O tipo que está sendo mapeado é chamado coargido.
Exemplo de polimorfismo ad-hoc por coersão class numero{ float num; numero(float num){ // Construtor this.num=num; } void soma(float num){ this.num+=num; } } class teste{ public static void main(String args[]){ numero n=new numero(1.3); int valor=5; n.soma(valor);  // valor é coargido de int para float } }
POLIMORFISMO ad-hoc POR SOBRECARGA Permite que um nome de método seja usado mais do que uma vez com diferentes quantidades ou tipos de parâmetros. A seleção do método adequado é feita com base em comparação dos tipos ou quantidade dos parâmetros.
Exemplo de polimorfismo ad-hoc por sobrecarga class complexo{  // Números da forma a+bi  float real,imagin;   complexo(float r,float i){ real=r; imagin=i; }   complexo soma(float r){ // Soma r na parte real e devolve o complexo resultante complexo s=new complexo(real+r,imagin); return(s); } complexo soma(float r,float i){ // Soma r na parte real e i na parte imaginária e devolve o resultado complexo s=new complexo(real+r,imagin+i); return(s); } }
Exemplo de polimorfismo ad-hoc por sobrecarga(continuação) class teste{ public static void main(String args[]){ complexo num=new complexo(1,1);  // Cria 1+i complexo num2=num.soma(1);  // Cria 2+i complexo num3=num.soma(1,1);  // Cria 2+2i } }
Modificador final O modificador final tem comportamentos diferentes, dependendo do local onde é aplicado: atributo : uma vez que é inicializado, não pode mais sofrer alteração (~constante). método : nas classes descendentes não pode mais haver polimorfismo  com o método. classes : não podem mais ser estendidas.
Exemplo de uso de  final class classe1{ final double pi=3.1415926535;  // Inicialização de pi ( funciona como constante ) final void calcula(){ pi=2.718;  // ERRO DE COMPILAÇÃO! pi já foi inicializado! ... } } final class classe2 extends classe1{ ... void calcula(){...};  //ERRO! calcula() é final na superclasse. } class classe3 extends classe2{  // ERRO! classe2 é final. ... }

Mais conteúdo relacionado

PPT
Genetic Mutations 1
North PIke High School
 
PPTX
Chromatin remodeling
Bahauddin Zakariya University lahore
 
PDF
Aula 03 generalização e especialização
Roitier Gonçalves
 
PDF
Introdução à programação em Android e iOS - OOP Java
Luís Gustavo Martins
 
ODP
Java 09 Heranca Reescrita Polimorfismo
Regis Magalhães
 
PPTX
Curso Java Básico - Aula 03
Natanael Fonseca
 
PPTX
Curso Básico de Java - Aula 2
PeslPinguim
 
PPT
Aula 02 implementação objeto
Danilo Alves
 
Genetic Mutations 1
North PIke High School
 
Aula 03 generalização e especialização
Roitier Gonçalves
 
Introdução à programação em Android e iOS - OOP Java
Luís Gustavo Martins
 
Java 09 Heranca Reescrita Polimorfismo
Regis Magalhães
 
Curso Java Básico - Aula 03
Natanael Fonseca
 
Curso Básico de Java - Aula 2
PeslPinguim
 
Aula 02 implementação objeto
Danilo Alves
 

Destaque (19)

PPTX
Curso Java Básico - Aula02
Natanael Fonseca
 
PPTX
Curso Básico de Java - Aula 4
PeslPinguim
 
PPTX
Poo1 aula 3 - java - comentários instruções e blocos-palavras chave
Denis Sobrenome
 
PDF
Mini Curso Java Day(Eliane Raquel)
raquelcarsi
 
PPT
ApresentaçãO De Java
Eduardo Bregaida
 
ODP
Apresentação java
munosai
 
PDF
POO - 18 - Sobrecarga e Sobreposição de Métodos
Ludimila Monjardim Casagrande
 
PPTX
Curso Java Básico - Aula 01
Natanael Fonseca
 
PPT
Collection Framework in java
CPD INDIA
 
PPT
Java modulo 01 - Introdução
Professor Samuel Ribeiro
 
PPTX
Curso de Java - Antonio Alves - Aula 03
Antonio Alves
 
PPT
Introdução ao JAVA (linguagem de programação WEB)
Luis Borges Gouveia
 
PPT
Classes Java , JDBC / Swing / Collections
Eduardo Carvalho
 
PPT
Curso Java Basico
Jamildo Feitosa
 
PPTX
Programação orientada a objetos
Cleyton Ferrari
 
PDF
Aula de Introdução - JAVA
Moises Omena
 
PDF
Linguagem Java - Conceitos e Técnicas
Breno Vitorino
 
PDF
Linguagem de Programação Java para Iniciantes
Oziel Moreira Neto
 
PPT
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
Microsoft
 
Curso Java Básico - Aula02
Natanael Fonseca
 
Curso Básico de Java - Aula 4
PeslPinguim
 
Poo1 aula 3 - java - comentários instruções e blocos-palavras chave
Denis Sobrenome
 
Mini Curso Java Day(Eliane Raquel)
raquelcarsi
 
ApresentaçãO De Java
Eduardo Bregaida
 
Apresentação java
munosai
 
POO - 18 - Sobrecarga e Sobreposição de Métodos
Ludimila Monjardim Casagrande
 
Curso Java Básico - Aula 01
Natanael Fonseca
 
Collection Framework in java
CPD INDIA
 
Java modulo 01 - Introdução
Professor Samuel Ribeiro
 
Curso de Java - Antonio Alves - Aula 03
Antonio Alves
 
Introdução ao JAVA (linguagem de programação WEB)
Luis Borges Gouveia
 
Classes Java , JDBC / Swing / Collections
Eduardo Carvalho
 
Curso Java Basico
Jamildo Feitosa
 
Programação orientada a objetos
Cleyton Ferrari
 
Aula de Introdução - JAVA
Moises Omena
 
Linguagem Java - Conceitos e Técnicas
Breno Vitorino
 
Linguagem de Programação Java para Iniciantes
Oziel Moreira Neto
 
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
Microsoft
 
Anúncio

Semelhante a introdução a linguagem java-2003 (20)

PPT
Introdução à análise orientada a objetos parte 2
irenescotolo
 
PPT
Aula5
fkimura
 
PDF
05 poo-ii
Ialis Cavalcante
 
PPTX
Final e aastract
Artur Todeschini
 
PPTX
Programação Orientada por Objectos - Aula 2
Manuel Menezes de Sequeira
 
PPT
Aula4
fkimura
 
PDF
Aula 3 - Java Prof.ª Cristiane Fidelix
Cris Fidelix
 
PPTX
Linguagem de programação implementação de classes
Carlos Melo
 
PPTX
Sistemas Distribuídos - Aula 04 - Revisão de Java
Arthur Emanuel
 
PPTX
Java - Visão geral e Exercícios
Arthur Emanuel
 
PDF
Classes Anônimas, Internas e Coleções Java
danrleywillian1
 
PDF
Sobrecarga operadores
Itália Camolesi
 
PPTX
Desenvolvendo para WEB com JAVA
Willian Magalhães
 
PPT
Aula5
softeam
 
PDF
Refactoring
Bruno Lui
 
PPT
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Professor Samuel Ribeiro
 
PDF
Java orientação a objetos (variaveis de instancia e metodos)
Armando Daniel
 
PDF
Curso java 03 - métodos e parâmetros
Maurício Linhares
 
PPTX
10 heranca
Artur Todeschini
 
PDF
POO-FundamentosPOO.pdf
Fausto Ayres
 
Introdução à análise orientada a objetos parte 2
irenescotolo
 
Aula5
fkimura
 
05 poo-ii
Ialis Cavalcante
 
Final e aastract
Artur Todeschini
 
Programação Orientada por Objectos - Aula 2
Manuel Menezes de Sequeira
 
Aula4
fkimura
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Cris Fidelix
 
Linguagem de programação implementação de classes
Carlos Melo
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Arthur Emanuel
 
Java - Visão geral e Exercícios
Arthur Emanuel
 
Classes Anônimas, Internas e Coleções Java
danrleywillian1
 
Sobrecarga operadores
Itália Camolesi
 
Desenvolvendo para WEB com JAVA
Willian Magalhães
 
Aula5
softeam
 
Refactoring
Bruno Lui
 
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Professor Samuel Ribeiro
 
Java orientação a objetos (variaveis de instancia e metodos)
Armando Daniel
 
Curso java 03 - métodos e parâmetros
Maurício Linhares
 
10 heranca
Artur Todeschini
 
POO-FundamentosPOO.pdf
Fausto Ayres
 
Anúncio

Mais de elliando dias (20)

PDF
Clojurescript slides
elliando dias
 
PDF
Why you should be excited about ClojureScript
elliando dias
 
PDF
Functional Programming with Immutable Data Structures
elliando dias
 
PPT
Nomenclatura e peças de container
elliando dias
 
PDF
Geometria Projetiva
elliando dias
 
PDF
Polyglot and Poly-paradigm Programming for Better Agility
elliando dias
 
PDF
Javascript Libraries
elliando dias
 
PDF
How to Make an Eight Bit Computer and Save the World!
elliando dias
 
PDF
Ragel talk
elliando dias
 
PDF
A Practical Guide to Connecting Hardware to the Web
elliando dias
 
PDF
Introdução ao Arduino
elliando dias
 
PDF
Minicurso arduino
elliando dias
 
PDF
Incanter Data Sorcery
elliando dias
 
PDF
Rango
elliando dias
 
PDF
Fab.in.a.box - Fab Academy: Machine Design
elliando dias
 
PDF
The Digital Revolution: Machines that makes
elliando dias
 
PDF
Hadoop + Clojure
elliando dias
 
PDF
Hadoop - Simple. Scalable.
elliando dias
 
PDF
Hadoop and Hive Development at Facebook
elliando dias
 
PDF
Multi-core Parallelization in Clojure - a Case Study
elliando dias
 
Clojurescript slides
elliando dias
 
Why you should be excited about ClojureScript
elliando dias
 
Functional Programming with Immutable Data Structures
elliando dias
 
Nomenclatura e peças de container
elliando dias
 
Geometria Projetiva
elliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
elliando dias
 
Javascript Libraries
elliando dias
 
How to Make an Eight Bit Computer and Save the World!
elliando dias
 
Ragel talk
elliando dias
 
A Practical Guide to Connecting Hardware to the Web
elliando dias
 
Introdução ao Arduino
elliando dias
 
Minicurso arduino
elliando dias
 
Incanter Data Sorcery
elliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
elliando dias
 
The Digital Revolution: Machines that makes
elliando dias
 
Hadoop + Clojure
elliando dias
 
Hadoop - Simple. Scalable.
elliando dias
 
Hadoop and Hive Development at Facebook
elliando dias
 
Multi-core Parallelization in Clojure - a Case Study
elliando dias
 

Último (7)

PDF
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
PPTX
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
PPTX
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
PPTX
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 
PPTX
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
PDF
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
PPTX
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 

introdução a linguagem java-2003

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