LPGII - Java Orientação a Objetos em Java Orientação a Objetos em

Propaganda
Orientação a Objetos em Java
„
„
„
LPGII - Java
Orientação a Objetos em Java
„
„
„
„
„
Roberto Vedoato
[email protected]
„
„
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
Definição de classes
„
„
2
Membros de Classe
Classe é o único meio de criar novos tipos de dados
Formato geral de classe:
„
Variáveis de instância
„
„
class nome {
// declaração de atributos (campos do objeto)
//definição de métodos (funções/comportamento)
}
„
Variáveis de classe (static)
„
„
„
„
3
funções/procedimentos que implementam o
comportamento dos objetos da classe;
Construtor
„
Orientação a Objetos em Java
compartilhada por todos os objetos da classe
são alocadas quando a classe é carregada
Constantes (final)
Métodos
„
„
definem a estrutura dos objetos derivados da classe
podem ser de tipo simples ou derivado de outra classe
método especial para criar objetos;
Orientação a Objetos em Java
4
Exemplo
Modificadores de Acesso
class Circulo {
„
float xpos, ypos, raio;
static int numCirc;
„
// variáveis de instância
// variável de classe
void defOrigem (float x, float
{ xpos = x; ypos = y ; }
y)
membros de classe podem ter restrição de acesso
„
estabelecida por atributos de visibilidade
„
// métodos
private, protected, public
public - sem restrições
„ acessível
„
void defRaio ( float r)
{ raio = r ; }
protected
„ acessível
„
„
}
Orientação a Objetos em Java
na própria classe e nas classes filhas
private
„ acessível
float calcArea ( )
{ return 3.1416 * raio * raio ; }
em qualquer classe
apenas na própria classe
classes devem ser declaradas public ou protected
5
Orientação a Objetos em Java
Exemplo
Criação de Objetos
class Circulo {
„
private float xpos, ypos, raio; // variáveis de instância
public void defOrigem (float x, float
{ xpos = x; ypos = y ; }
y)
„
// métodos
„
public void defRaio ( float r)
{ raio = r ; }
„
„
public float calcArea ( )
{ return 3.1416 * raio * raio ; }
6
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
circ.defOrigem (1.5, 2.0);
// envia mensagem
}
Orientação a Objetos em Java
7
Orientação a Objetos em Java
8
Construtores
„
„
„
„
„
„
„
Exemplo
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
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 ; }
}
9
Exercício – Sobrecarga de Construtor
„
„
„
public static void main (String args[ ]) {
„
Exemplo04 obj1 = new Exemplo04();
System.out.println(“x = “ + obj1.x);
System.out.println(“y = “ + obj1.y);
„
public Exemplo04(int num1) {
x = num1;
y = num1 * 2;
}
}
}
„
„
pode adicionar novos componentes;
não pode remover definições da superclasse
pode redefinir métodos
Object
Exemplo04 obj3 = new Exemplo04(2,5);
System.out.println(“x = “ + obj2.x);
System.out.println(“y = “ + obj2.y);
Orientação a Objetos em Java
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
„
Exemplo04 obj2 = new Exemplo04(2);
System.out.println(“x = “ + obj2.x);
System.out.println(“y = “ + obj2.y);
public Exemplo04(int num1, num2) {
x = num1;
y = num2;
}
10
Herança
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;
Orientação a Objetos em Java
classes de
biblioteca
11
classes de
usuário
Orientação a Objetos em Java
12
Definição de Subclasses
„
Redefinindo Métodos
Superclasse deve ser indicada na declaração da classe
public class Square {
double lado;
public double area ( )
Exemplo: class Frame extends Window { . . . }
„
Superclasse omitida na declaração da classe significa
que a classe é subclasse direta de Object
Square
lado
{ return lado*lado ; }
area()
}
Exemplo: class Circulo {. . . }
„
public class Rectangle extends Square {
double altura;
public double area ( )
Método redefinido em subclasse
„
„
redeclaração esconde componente herdado
super traz o componente herdado de volta ao escopo
altura
{ return lado*altura ; }
area()
}
Orientação a Objetos em Java
13
Chamada a Métodos
„
Rectangle
Orientação a Objetos em Java
14
Chamada a Métodos da Superclasse
chamada de método (envio de mensagem)
„
<nome_objeto> . <nome_método> ( <params> )
Quando método é prefixado com super, a procura
inicia na superclasse imediata à classe que contém o
método
Frame
„
class Janela extends Frame {
void paint( );
{ . . .
super.paint( );
. . .
}
}
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
paint()
Janela
paint()
Orientação a Objetos em Java
15
Orientação a Objetos em Java
16
Chamada a Métodos da Superclasse
„
Sobrecarga
class Base {
int i = 1;
String teste() {
return "Base";
}
}
Dentro de um método, this identifica o próprio
objeto para o qual a mensagem foi enviada
class Cilindro {
float
xpos,
ypos,
raio, altura;
class Derivada extends Base {
int i = 2;
String teste() {
return "Derivada";
}
}
public float calcArea ( )
{ return 3.1416 * raio * raio ; }
public float calcVolume ( )
{ return this.calcArea() * altura ; }
Orientação a Objetos em Java
17
Exercício
Base
int i=1;
String teste()
Derivada
int i=2;
String teste()
Orientação a Objetos em Java
18
Encadeamento de Construtores
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);
}
„
„
„
„
„
19
da mesma classe por this ( )
da superclasse por super ( )
Construtor que não contém tal chamada, inclui
implicitamente chamada super ( )
„
Teste de Herança
Atributos = 1 - 2 - 1
Metodos = Base - Derivada - Derivada
Orientação a Objetos em Java
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
uma cadeia completa de construtores é chamada até a
raiz
Orientação a Objetos em Java
20
Exercício
Exercício
class SuperClasse {
SuperClasse() {
System.out.println("Construtor SuperClasse"); }
„
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();
}
}
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
21
Curiosidades sobre Construção de Objetos
„
„
„
„
„
„
„
1. Inicialização default de campos de dados (0, null,
false)
2. Chamada recursiva ao construtor da superclasse (até
Object)
„
Evite chamar métodos locais dentro de construtores
„
„
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)
„
„
„
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
„
23
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
„
3. Inicialização explícita dos campos de dados
4. Execução do conteúdo do construtor
Orientação a Objetos em Java
22
Curiosidades sobre Construção de Objetos
Seqüência de execução na chamada de um construtor
„
Orientação a Objetos em Java
Métodos declarados com modificador final não podem
ser sobrepostos em subclasses
Orientação a Objetos em Java
24
Destruição de Objetos
„
„
„
„
„
Curiosidades sobre 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 pelo garbage collector antes do
objeto ser destruído
void finalize ( ) { . . . }
Orientação a Objetos em Java
„
„
„
„
„
„
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 {...}
25
O Uso de Bibliotecas
„
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
„
Orientação a Objetos em Java
26
Modificadores de Acesso
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
Acesso dentro do package onde a classe foi declarada
„
Modificador
Herança (métodos)
Acessível (atributos e métodos)
default
sim
sim
public
sim
sim
protected
sim
sim
private
não
não
„
import java.awt.Rectangle;
import java.awt.*;
Acesso fora do package onde a classe foi declarada
Modificador
Orientação a Objetos em Java
27
Herança (métodos)
Acessível (atributos e métodos)
default
não
não
public
sim
sim
protected
sim
sim
private
não
não
Orientação a Objetos em Java
28
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:
„
„
„
„
„
Compatibilidade de Classes
„
Figura f1, f2;
f1 = new Figura();
f2 = f1 ;
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
Retangulo r = new Retangulo ();
f1 = r ;
// é possível?
r = f2;
// é possível?
29
„
Figura
„
Elipse
fig = eli;
obj = round;
RoundRet
ret = fig;
// erro de compilação
fig = new Retangulo( );
ret = (Retangulo) fig; // casting torna atribuição correta
Orientação a Objetos em Java
Retangulo
Elipse
RoundRet
Orientação a Objetos em Java
„
Object
Retangulo
Figura
30
Operador instanceof
Compatibilidade de Classes - Exemplo
Retangulo ret = new Retangulo( );
Figura fig = new Figura ( );
Object obj = new Object ( );
RoundRet round = new RoundRet ( );
Elipse eli = new Elipse ( );
um objeto pode ser atribuído a qualquer objeto da
mesma classe ou de superclasse
Object
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
31
Orientação a Objetos em Java
32
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
„
„
„
„
„
„
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)
um raio do tipo int e coordenadas x e y
Orientação a Objetos em Java
33
Modificador Final
„
„
são constantes, não podem ser modificadas
Exemplo: final double PI = 3.14159265;
„
não podem ser redefinidos nas subclasses
„
Classes final
„
„
„
34
Uma classe pode conter membros de classe (atributos
e métodos), sendo
„
Métodos final
„
„
Orientação a Objetos em Java
Modificador Static
Variáveis final
„
„
Final
Static
Abstract
3. Crie um segundo construtor para Circulo que aceite
„
„
Modificadores funcionam como delimitadores de
características
„
2. Escreva uma classe Circulo, que contenha
„
„
Modificadores
„
„
final float Consulta(String num) {
...}
Orientação a Objetos em Java
Podem ser acessados diretamente, sem necessidade
da existência de um objeto. Exemplos:
„
não podem ser especializadas
todos os métodos são considerados final
Exemplo:
35
compartilhados por todos os objetos daquela classe
alocados quando a classe é carregada
NomedaClasse.variavelestatica = 12;
NomedaClasse.metodoestatico;
Métodos estáticos podem referenciar apenas métodos
estáticos e não podem referenciar operadores this e
super
Orientação a Objetos em Java
36
Modificador Static
„
Static Initializer
Exemplo:
„
class Pessoa {
static int numpessoas = 0;
int id;
Pessoa () {
id = numpessoas;
numpessoas++;
}
...
„
static double[] sin256 = new double [256];
static {
for (int i=0; i <256; i ++)
sin256[i] = Math.sin ( i/256*2Math.PI);
}
}
„
Pessoa p1 = new(Pesssoa);
p1.numpessoas++;
// mesmo efeito que abaixo
Pessoa.numpessoas++;
Orientação a Objetos em Java
„
„
Não é função, não tem argumentos
Uma classe pode ter vários static initializers, sendo
executados na ordem em que aparecem
37
Perguntas
„
Para iniciar variáveis de classe, inicializers são
executados automaticamente na carga da classe
Exemplo:
Orientação a Objetos em Java
38
Modificador Abstract
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 ?
„
Indica classe ou método abstrato, com o objetivo de
„
„
„
„
„
Exemplos:
„
„
„
„
Orientação a Objetos em Java
39
definir generalizacões
especializar em subclasses
classe abstrata: pelo menos um método abstrato
método abstrato: sem corpo, apenas assinatura
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
40
Modificador Abstract
„
Classes abstratas
„
„
„
„
Modificador Abstract
„
definem protocolos para hierarquia, fornecendo apenas
modelos de comportamento
representam generalizações
contém pelo menos um método abstrato
„
„
Métodos abstratos
„
„
„
abstract public class <nome_classe>
{ // pelo menos um método abstrato
. . .
}
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
abstract public <tipo_retorno > <nome_método > ( ) ;
41
Interfaces
„
„
„
„
„
„
„
„
„
Orientação a Objetos em Java
42
Interfaces
Classe na qual todos os métodos são abstratos
„
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:
„
Exemplo
coleção de métodos abstratos
public class Printer// classe concreta
{
. . . }
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
public interface Copier
{ public void copyDoc (Doc d ) ; }
public interface Fax
{ public void transmitDoc (Doc d ) ; }
Public class MultiFunctionPrinter
{
public void
public void
extends Printer
implements Copier, Fax
copyDoc (Doc d)
{ // implemta concreta }
transmitDoc (Doc d) {//implemta concreta }
}
43
Orientação a Objetos em Java
44
Interfaces
„
„
„
Perguntas
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
45
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:
„
„
„
Interfaces podem ser especializadas?
Interfaces formam hierarquias independentes?
São derivadas da classe Object?
Definir métodos no ancestral comum
Criar um novo ancestral e redefinir tipos presentes na célula da
planilha.
Interfaces: Melhor solução
Orientação a Objetos em Java
47
Orientação a Objetos em Java
46
Download