LPGII - Java
Orientação a Objetos em Java
Roberto Vedoato [email protected]
Orientação a Objetos em Java 2
Orientação a Objetos em Java
Definição de classes Criação de objetos Herança
Polimorfismo Ligação Dinâmica
Uso de Bibliotecas (packages)
Compatibilidade entre classes (casting) Operador instance of
Modificadores: final, static e abstract Interfaces
Orientação a Objetos em Java 3
Definição de classes
Classe é o único meio de criar novos tipos de dados Formato geral de classe:
class nome {
// declaração de atributos (campos do objeto) //definição de métodos (funções/comportamento) }
Orientação a Objetos em Java 4
Membros de Classe
Variáveis de instância
definem a estrutura dos objetos derivados da classe podem ser de tipo simples ou derivado de outra classe
Variáveis de classe (static)
compartilhada por todos os objetos da classe são alocadas quando a classe é carregada
Constantes (final) Métodos
funções/procedimentos que implementam o comportamento dos objetos da classe;
Construtor
Orientação a Objetos em Java 5
Exemplo
class Circulo {float xpos, ypos, raio; // variáveis de instância
static int numCirc; // variável de classe
void defOrigem (float x, float y) // métodos { xpos = x; ypos = y ; }
void defRaio ( float r) { raio = r ; }
float calcArea ( )
{ return 3.1416 * raio * raio ; } }
Orientação a Objetos em Java 6
Modificadores de Acesso
membros de classe podem ter restrição de acesso
private, protected, public
estabelecida por atributos de visibilidade
public -
sem restriçõesacessível em qualquer classe
protected
acessível na própria classe e nas classes filhas
private
acessível apenas na própria classe
classes devem ser declaradas public ou protected
Exemplo
class Circulo {private float xpos, ypos, raio; // variáveis de instância public void defOrigem (float x, float y) // métodos
{ xpos = x; ypos = y ; }
public void defRaio ( float r)
{ raio = r ; }
public float calcArea ( )
{ return 3.1416 * raio * raio ; } }
Criação de Objetos
Objetos são instâncias de classe, alocados
dinamicamente
Saõ criados através do operador new que chama o
construtor da classe
Construtor aloca espaço de memória para objeto Variáveis do tipo classe são ponteiros para objetos da
classe
Exemplo
class Circulo { … }; // declara classe
Circulo circ ; // declara variável do tipo da classe circ = new Circulo( ); // cria objeto
Orientação a Objetos em Java 9
Construtores
Servem para criar e iniciar novos objetos
Construtor aloca memória (e inicia), não retorna valor Valores para iniciar são passados como parâmetros Uma classe pode ter um ou mais construtores de
objetos
São declarados com o mesmo nome da classe Construtores devem ser definidos como public
Caso não haja um construtor explícito Java executa o
construtor pai por padrão
Orientação a Objetos em Java 10
Exemplo
class Circulo {
// atributos de instância private float xpos,ypos,raio;
// construtores public Circulo ( )
{ xpos = 0; ypos = 0; radius = 0 ; }
public Circulo (float x, float y, float r) {xpos = x; ypos = y; radius = r ; }
// método
public float calcArea ( )
{ return 3.1416 * raio * raio ; } }
Orientação a Objetos em Java 11
Exercício – Sobrecarga de Construtor
Considere a classe abaixo, teste a criação de objetos
com os três construtores, imprima na tela os valores dos atributos e explique os resultados
class Exemplo04 { int x, y;
public Exemplo04(int num1) { x = num1;
y = num1 * 2; }
public Exemplo04(int num1, num2) { x = num1;
y = num2; }
public static void main (String args[ ]) { Exemplo04 obj1 = new Exemplo04(); System.out.println(“x = “ + obj1.x); System.out.println(“y = “ + obj1.y); Exemplo04 obj2 = new Exemplo04(2); System.out.println(“x = “ + obj2.x); System.out.println(“y = “ + obj2.y); Exemplo04 obj3 = new Exemplo04(2,5); System.out.println(“x = “ + obj2.x); System.out.println(“y = “ + obj2.y); }
}
Orientação a Objetos em Java 12
Herança
Java implementa herança simples
Object é a classe raiz de todas as classes, fornece o
comportamento básico de todas as classes
Todas as classes do usuário são obtidas por especialização de
classes do ambiente Java
Subclasse herda os componentes da superclasse pode adicionar novos componentes;
não pode remover definições da superclasse pode redefinir métodos
Object classes de
Orientação a Objetos em Java 13
Definição de Subclasses
Superclasse deve ser indicada na declaração da classe
Exemplo: class Frame extends Window { . . . }
Superclasse omitida na declaração da classe significa
que a classe é subclasse direta de Object
Exemplo: class Circulo {. . . }
Método redefinido em subclasse
redeclaração esconde componente herdado
super traz o componente herdado de volta ao escopo
Orientação a Objetos em Java 14
Redefinindo Métodos
public class Square { double lado;
public double area ( )
{ return lado*lado ; } }
public class Rectangle extends Square { double altura;
public double area ( ) { return lado*altura ; } } Rectangle Square lado area() altura area()
Chamada a Métodos
chamada de método (envio de mensagem)
<nome_objeto> . <nome_método> ( <params> )
Exemplo de chamada a método de instância:
class Janela extends Frame {. . . } // define classe
Janela tela1 = new Janela( ); // declara e cria objeto tela1.show( ); // envia mensagem
Chamada a Métodos da Superclasse
Quando método é prefixado com super, a procura
inicia na superclasse imediata à classe que contém o método
class Janela extends Frame { void paint( ); { . . . super.paint( ); . . . } } Frame Janela paint() paint()
Orientação a Objetos em Java 17
Chamada a Métodos da Superclasse
Dentro de um método,
this
identifica o próprioobjeto para o qual a mensagem foi enviada
class Cilindro {
float xpos, ypos, raio, altura;
public float calcArea ( )
{ return 3.1416 * raio * raio ; }
public float calcVolume ( )
{ return this.calcArea() * altura ; }
Orientação a Objetos em Java 18
Sobrecarga
class Base{ int i = 1; String teste() { return "Base"; } }class Derivada extendsBase{ int i = 2; String teste() { return "Derivada"; } } Base int i=1; String teste() Derivada int i=2; String teste()
Orientação a Objetos em Java 19
Exercício
Crie a aplicação TesteHerança. Quais serão os resultados? class TesteHeranca {
public static void main (String arg[]) { Base base = new Base();
Derivada derivada = new Derivada(); Base baseDerivada = new Derivada(); int x = base.i;
int y = derivada.i; int z = baseDerivada.i; String xfun = base.teste(); String yfun = derivada.teste(); String zfun = baseDerivada.teste(); System.out.println("Teste de Herança");
System.out.println(“Atributos = "+x+" - "+y+" - "+z); System.out.println("Metodos = "+xfun+" - "+yfun+" - "+zfun); }
Teste de Herança Atributos = 1 - 2 - 1
Metodos = Base - Derivada - Derivada
Orientação a Objetos em Java 20
Encadeamento de Construtores
Um construtor pode chamar outro construtor, isto se
chama “encadeamento de métodos construtores”
Caso não haja um construtor explícito Java prove um
construtor padrão
Primeiro comando de construtor é uma chamada a
outro construtor
da mesma classe por this ( ) da superclasse por super ( )
Construtor que não contém tal chamada, inclui
implicitamente chamada super ( )
uma cadeia completa de construtores é chamada até a raiz
Orientação a Objetos em Java 21
Exercício
class SuperClasse { SuperClasse() { System.out.println("Construtor SuperClasse"); } void teste() { System.out.println("Metodo SuperClasse");} }class SubClasse extends SuperClasse { SubClasse() {
System.out.println("Construtor SubClasse"); } void teste() {
System.out.println("Metodo SubClasse"); } }
Orientação a Objetos em Java 22
Exercício
Crie a aplicação TesteHerança2. Qual é o resultado?
class TesteHeranca2 {
public static void main (String arg[]) {
System.out.println(“Teste de Heranca 2”); Subclasse sub = new Subclasse();
sub.teste(); }
}
Curiosidades sobre Construção de Objetos
Seqüência de execução na chamada de um construtor
1. Inicialização default de campos de dados (0, null, false)
2. Chamada recursiva ao construtor da superclasse (até Object)
2.1 Inicialização default dos campos de dados da superclasse
(recursivo, subindo a hierarquia)
2.2 Inicialização explicita dos campos de dados
2.3 Execução do conteúdo do construtor (a partir de Object,
descendo a hierarquia)
3. Inicialização explícita dos campos de dados 4. Execução do conteúdo do construtor
Curiosidades sobre Construção de Objetos
Evite chamar métodos locais dentro de construtores
Construtor (qualquer um da hierarquia) sempre usa versão sobreposta do método
Isto pode trazer resultados inesperados se alguém
estender a sua classe com uma nova implementação do método que
Dependa de variáveis da classe estendida
Chame métodos em objetos que ainda serão criados (provoca NullPointerException)
Dependa de outros métodos sobrepostos
Use apenas métodos finais em construtores
Métodos declarados com modificador final não podem ser sobrepostos em subclasses
Orientação a Objetos em Java 25
Destruição de Objetos
Java desaloca objetos através do garbage collector Referência a objeto pode ser removida atribuindo a
null
memória alocada para objeto não é liberada de
imediato
Garbage colletor executa em baixa prioridade Desejando-se realizar outras ações associadas à
destruição de objetos (exemplo: fechar arquivos): método finalize
finalize chamado pelogarbage collector antes do
objeto ser destruído
void finalize ( ) { . . . }
Orientação a Objetos em Java 26 Curiosidades sobre Destruição de Objetos
Objetos são destruídos automaticamente pelo garbage
colector quando perdem sua referência, porém, o sistema garbage colector não faz finalização
Método finalize(), herdado de Object, teoricamente permite ao programador controlar a finalização de qualquer objeto
finalize() não funciona 95% das vezes - não use! Se precisar de finalização, coloque seu código em um bloco try {...} finally {...}
Orientação a Objetos em Java 27
O Uso de Bibliotecas
As classes Java são agrupadas em pacotes O pacote padrão é: java.lang
Classes que pertencem a outros pacotes devem ser
importadas
O comando import carrega arquivos .class Exemplos de importação
import java.awt.Rectangle; import java.awt.*;
Orientação a Objetos em Java 28
Modificadores de Acesso
Acesso dentro do package onde a classe foi declarada
não não private sim sim protected sim sim public sim sim default
Acessível (atributos e métodos) Herança (métodos)
Modificador
Acesso fora do package onde a classe foi declarada
não não private sim sim protected sim sim public não não default
Acessível (atributos e métodos) Herança (métodos)
Orientação a Objetos em Java 29
Modificadores de Acesso - Exercício
Crie uma classe pai, ClassePai, com atributos (a,b) e
métodos (alteraA, alteraB), privados (a, alteraA) e
públicos (b, alteraB). Crie uma classe filha,
ClasseFilha, que possua métodos para tentar:
Ler o atributo a e o atributo b Alterar o atributo a e o atributo b
Chamar o método alteraA e o método alteraB
Verifique se é verdadeira a afirmação de que métodos
e atributos privados não são herdados.
Observação: não utilize super
Orientação a Objetos em Java 30
Compatibilidade de Classes
um objeto pode ser atribuído a qualquer objeto da
mesma classe ou de superclasse
Figura f1, f2; f1 = new Figura(); f2 = f1 ;
Retangulo r = new Retangulo (); f1 = r ; // é possível? r = f2; // é possível? Object Figura Retangulo RoundRet Elipse
Compatibilidade de Classes - Exemplo
Retangulo ret = new Retangulo( ); Figura fig = new Figura ( ); Object obj = new Object ( );
RoundRet round = new RoundRet ( ); Elipse eli = new Elipse ( );
fig = eli; obj = round;
ret = fig; // erro de compilação fig = new Retangulo( );
ret = (Retangulo) fig; // casting torna atribuição correta Object Figura Retangulo RoundRet Elipse
Operador
instanceof
Operador para investigar a classe de um objeto Resulta true se o objeto é da classe ou de subclasse
<objeto> instanceof <classe>
Exemplo:
Figura[] fig = new Figura[3]; fig[0] = new Retangulo( ); fig[1] = new Elipse( ); fig[2] = new RoundRect( );
fig[0] instanceof Figura // retorna true fig[2] instanceof Retangulo //retorna true fig[1] instanceof Retangulo //retorna false
Orientação a Objetos em Java 33
Exercício
1. Escreva uma classe Ponto
contém x e y que podem ser definidos em construtor métodos getX() e getY() que retornam x e y
métodos setX(int) e setY(int) que mudam x e y
2. Escreva uma classe Circulo, que contenha
raio inteiro e origem Ponto
construtor que define origem e raio método que retorna a área
método que retorna a circunferência use java.lang.Math.PI (Math.PI)
3. Crie um segundo construtor para Circulo que aceite
um raio do tipo int e coordenadas x e y
Orientação a Objetos em Java 34
Modificadores
Modificadores funcionam como delimitadores de
características
Final Static Abstract
Orientação a Objetos em Java 35
Modificador Final
Variáveis final
são constantes, não podem ser modificadas Exemplo: final double PI = 3.14159265;
Métodos final
não podem ser redefinidos nas subclasses
Classes final
não podem ser especializadas
todos os métodos são considerados final Exemplo:
final float Consulta(String num) { ...}
Orientação a Objetos em Java 36
Modificador Static
Uma classe pode conter membros de classe (atributos
e métodos), sendo
compartilhados por todos os objetos daquela classe alocados quando a classe é carregada
Podem ser acessados diretamente, sem necessidade
da existência de um objeto. Exemplos:
NomedaClasse.variavelestatica = 12; NomedaClasse.metodoestatico;
Métodos estáticos podem referenciar apenas métodos
estáticos e não podem referenciar operadores this e
Orientação a Objetos em Java 37
Modificador Static
Exemplo:
class Pessoa {
static int numpessoas = 0; int id; Pessoa () { id = numpessoas; numpessoas++; } ... } Pessoa p1 = new(Pesssoa);
p1.numpessoas++; // mesmo efeito que abaixo Pessoa.numpessoas++;
Orientação a Objetos em Java 38
Static Initializer
Para iniciar variáveis de classe, inicializers são
executados automaticamente na carga da classe
Exemplo:
static double[] sin256 = new double [256]; static {
for (int i=0; i <256; i ++)
sin256[i] = Math.sin ( i/256*2Math.PI); }
Não é função, não tem argumentos
Uma classe pode ter vários static initializers, sendo
executados na ordem em que aparecem
Perguntas
Porque um método estático não pode referenciar
elementos que não sejam estáticos ?
Em que situação um método final pode ser útil ?
Modificador Abstract
Indica classe ou método abstrato, com o objetivo de
definir generalizacões especializar em subclasses
classe abstrata: pelo menos um método abstrato método abstrato: sem corpo, apenas assinatura
Exemplos:
public abstract class Number
(superclasse de Integer, Double, Float) public abstract int intValue()
public abstract float floatValue() public abstract double doubleValue()
Orientação a Objetos em Java 41
Modificador Abstract
Classes abstratas
definem protocolos para hierarquia, fornecendo apenas modelos de comportamento
representam generalizações
contém pelo menos um método abstrato
Métodos abstratos
método sem corpo (sem implementação, apenas assinatura)
representa comportamento comum a todas subclasses, mas com distinta implementação em cada subclasse métodos abstratos são implementados em subclasses
Orientação a Objetos em Java 42
Modificador Abstract
Classe contendo método abstrato não pode ser instanciada Construtores e métodos private ou static não podem ser
declarados como abstract
Declaração de classes e métodos abstratos:
abstract public class <nome_classe>
{ // pelo menos um método abstrato . . .
}
abstract public <tipo_retorno > <nome_método >( ) ;
Orientação a Objetos em Java 43
Interfaces
Classe na qual todos os métodos são abstratos coleção de métodos abstratos
Simula herança múltipla
Constituem-se, estritamente, em modelos de comportamento Não podem ser instaciadas
Variáveis não podem ser herdadas de uma Interface
Todos os métodos de interface devem ser publicos e abstratos Uma classe implementa uma interface quando indicada pela
palavra implements
Uma classe pode implementar várias interfaces
Hierarquia de interface não é relacionada com a hierarquia de
classes
Orientação a Objetos em Java 44
Interfaces
Exemplo
public class Printer// classe concreta { . . . }
public interface Copier
{ public void copyDoc (Doc d ) ; }
public interface Fax
{ public void transmitDoc (Doc d ) ; }
Public class MultiFunctionPrinter extends Printer
implements Copier, Fax { public void copyDoc (Doc d) { // implemta concreta }
public void transmitDoc (Doc d) {//implemta concreta } }
Orientação a Objetos em Java 45
Interfaces
Uma classe que implementa uma interface não herda,
apenas promete implementar os métodos definidos na interface (implements)
O modificador abstract não deve ser usado na
declaração dos métodos
Vantagem do uso de interfaces:
definição de protocolos para classes abstratas sem se preocupar com detalhes de implementação
compartilhar uma mesma interface com várias classes simular herança múltipla
Orientação a Objetos em Java 46
Perguntas
Interfaces podem ser especializadas?
Interfaces formam hierarquias independentes? São derivadas da classe Object?
Classes Abstratas X Interfaces
Questões semânticas
Quando usar uma ou outra
Exemplo:
Célula de uma planilha
Deve manipular tipos como String, Float, Data, etc... Possíveis soluções:
Definir métodos no ancestral comum
Criar um novo ancestral e redefinir tipos presentes na célula da
planilha.