Académique Documents
Professionnel Documents
Culture Documents
Herana
capacidade de uma classe (subclasse) herdar,
adquirir atributos e funcionalidades de outra classe
(superclasse),
podendo
juntar
algumas
especificidades e/ou alterar outras. Existe uma
relao tipo -um... entre objectos da subclasse e
da superclasse
Ex: carro_desportivo poder ser uma subclasse de automvel
(carro_desportivo _um automvel)
2009/2010
Paradigmas de Programao
Paradigmas de Programao
Tipos de Herana
Herana simples a subclasse s tem uma
superclasse, isto s herda de uma classe
Herana mltipla a subclsse tem mais do
que uma superclasse, herda de mais do que
uma classe
Paradigmas de Programao
Herana em Java
extends palavra chave que indica que uma
classe subclasse de outra
protected modificador de acesso que
permite que componentes com este
modificador sejam acessveis na classe
derivada e nas classes definidas no mesmo
package
2009/2010
Paradigmas de Programao
Exemplo de herana em Java
public classe Pai { ... ... }
public class Filho extends Pai {... ... }
public class Filha extends Pai {... ... }
public class Neto extends Filho {... ...}
Paradigmas de Programao
Construtores na hierarquia de derivao em Java
Quando se cria um objecto de uma subclasse o construtor chama
imediatamente o construtor da superclasse (explicitamente atravs
de super(...) ou implicitamente, por omisso).
A execuo do construtor implica a inicializao das v. de instncia
da superclasse que so parte do objecto da subclasse e s depois
que o construtor da subclasse inicializa as variveis de instncia da
subclasse.
Mesmo que o construtor no as inicialize explicitamente so
inicializadas do seguinte modo:
Tipo numrico primitivo a 0
Tipo boolean a false
Tipo referncia a null
2009/2010
Paradigmas de Programao
Notas sobre herana em Java
Ao reescrever um mtodo na subclasse o seu acesso no pode ser
restringido, isto , se public na super classe no pode ser protected
ou private na subclasse.
Um objecto da subclasse um objecto da superclasse, isto posso
atribuir classe Pai um objecto da classe Filho (o contrrio falso).
A classe Object superclasse de todas as classes construdas em
Java.
Para se aceder na subclasse a um mtodo da superclasse, que est
reescrito na subclasse, usa-se a palavra super.nome_do_mtodo(...).
2009/2010
Paradigmas de Programao
Principais mtodos da classe Object
boolean equals ( Object obj) deve ser reescrito em cada classe
para comparar estado dos objectos e no verificar se referenciam o
mesmo objecto.
Object clone( ) throws CloneNotSupportedException para classes
que implementam Cloneable.
String toString( ) deve ser reescrito para todas as classes, devolve
uma representao textual do objecto.
Class getClass( ) devolve um objecto que representa a classe de
runtime do objecto this.
void finalize( ) throws Throwable executado antes do garbage
collector, quando o objecto no possui referncias associadas.
2009/2010
Paradigmas de Programao
Construtores na hierarquia de derivao (a superclasse)
public class SuperClasse {
protected int x;
protected int z=20;
{
System.out.println("Bloco inicial da super");
}
public SuperClasse() {
System.out.println("Construtor da super");
setX(10);
}
public String toString() {
return "x= "+x+"
";
}... ...
2009/2010
Paradigmas de Programao
Construtores na hierarquia de derivao (a subclasse)
public class SubClasse extends SuperClasse{
private int y;
{
System.out.println("Bloco inicial da sub");
}
public SubClasse() {
super();
System.out.println("Construtor da sub");
y=11;
}
public String toString() {
10
Paradigmas de Programao
Construtores na hierarquia de derivao ( teste)
Sada:
public class Teste {
public static void main(String [] args){
SubClasse ep1=new SubClasse();
Construtor da super
System.out.println(ep1);
x= 10
2009/2010
z= 20
y= 11
11
Paradigmas de Programao
CLASSE ABSTRACTA
uma classe que no pode ser instanciada, geralmente usada para
derivar subclasses.
Se tiver pelo menos um mtodo abstracto (sem cdigo) ter que ser
forosamente abstracta.
possvel ser abstracta e ter todos os mtodos com implementao
Os mtodos abstractos sero implementados nas subclasses, se o no
forem, as subclasses sero tambm abstractas.
Nenhum mtodo abstracto de uma classe abstracta pode ser final, static
ou private.
2009/2010
12
Paradigmas de Programao
2009/2010
13
Paradigmas de Programao
Polimorfismo
Significa existir em muitas formas.
Traduz a capacidade de uma referncia poder referenciar
objectos de diversos tipos ( da mesma linha hierrquica)
Exemplo:
SuperClasse x=new SubClasse1( );
x=new SubClasse2( );
Nota: um tipo primitivo no pode armazenar informao de
outro tipo, diz-se tipo monomrfico.
2009/2010
14
Paradigmas de Programao
Polimorfismo e Ligao Dinmica
Exemplo:
class Forma
{
void desenhar( ...){ }
}
class Quadrado extends Forma{
void desenhar( ...){ ---- }
}
class Triangulo extends Forma{
void desenhar( ...){ ---- ---}
}
class Outra {
void mostraDesenhos( Forma f) {
f.desenhar(...); }
}
2009/2010
15
Paradigmas da Programao
Polimorfismo e Ligao Dinmica
No exemplo anterior o mtodo mostraDesenhos tem um
parmetro f do tipo Forma.
Esta referncia pode referenciar quer o tipo Quadrado
quer o tipo Tringulo e na compilao no se sabe qual o
mtodo desenhar que vai ser executado, s na execuo
que o sistema reconhece qual o tipo de objecto que f
referencia e portanto s durante a execuo que sabe
qual o mtodo desenhar que vai ser executado. Esta
capacidade chama-se Ligao Dinmica (dynamic
binding).
2009/2010
16
Paradigmas de Programao
Ligao Esttica
Na Ligao Esttica no momento da compilao est
definido qual o mtodo a ser executado.
Em linguagens como C, Pascal no existe ligao
dinmica, s existe ligao esttica.
2009/2010
17
Paradigmas de Programao
Upcasting
Caracterstica da herana em que um objecto da subclasse
pode ser usado como um objecto da superclasse.
Esta converso sempre segura.
Exemplo:
Forma f1;
Quadrado q1=new Quadrado();
f1=q1; // upcasting
2009/2010
18
Paradigmas de Programao
Downcasting
Caracterstica da herana em que uma referncia
(esttica) da superclasse atribuda a uma referncia da
subclasse . Esta converso s possvel se a referncia
da superclasse tiver um tipo dinmico do tipo da
subclasse.
Exemplo:
Forma f1= new Quadrado();
//tipo esttico de f1-- Forma
//tipo dinmico de f1-- Quadrado
Quadrado q2;
q2= (Quadrado) f1; // downcasting
2009/2010
19
Paradigmas de Programao
Tipo esttico e dinmico de uma referncia
Forma f1= new Quadrado();
20
Paradigmas de Programao
Na classe Quadrado:
public void metodoX(){
System.out.println(Forma);
}
f1.mtodoX();
2009/2010
System.out.println(Quadrado);
}
21
Paradigmas de Programao
Na classe Quadrado:
public static void metodoX(){
System.out.println(Forma);
}
f1.mtodoX();
2009/2010
System.out.println(Quadrado);
}
Forma
22
Paradigmas de Programao
Na classe Quadrado:
public class Quadrado extends Forma{
System.out.println(f1.lado);
2009/2010
23
Paradigmas de Programao
O operador instanceof
Este operador permite verificar se o tipo dinmico de um
objecto de uma dada classe ou no. Devolve falso caso
o objecto no pertena classe ou seja nulo.
Exemplo:
Forma f1= new Quadrado();
Quadrado q2=new Quadrado();
Quadrado q3=null;
System.out.println( q2 instanceof Quadrado);
System.out.println( q2 instanceof Forma);
System.out.println( f1 instanceof Quadrado);
System.out.println( q3 instanceof Quadrado);
2009/2010
Resultado:
true
true
true
false
24
Paradigmas de Programao
Responda s seguintes questes:
1. Qual o tipo de relao semntica entre objectos em que
existe composio. Exemplifique.
2. Considere as seguintes classes:
public class Ponto {
private int x,y;
.... .... ....
25
Paradigmas de Programao
2009/2010
26
Paradigmas de Programao
Responda s seguintes questes:
1. Qual o tipo de relao semntica entre objectos em que
existe herana. Exemplifique.
2. Qual a palavra reservada em Java para indicar que uma
classe subclasse de outra.
3. Em Java qual a super classe de todas as classes.
4. Como classificaria o tipo de herana em Java (simples ou
mltipla), justifique.
5. Distinga entre sobrecarga e reescrita de mtodos numa linha
hierrquica de classes
2009/2010
27
Paradigmas de Programao
6. Qual a palavra chave para que um construtor da subclasse
possa invocar um construtor da superclasse?
7. Indique os nveis de acesso dos membros da superclasse a
que a subclasse acede.
8. Se uma subclasse herda todos os atributos e mtodos da
superclasse indique em que situao se obriga a utilizar
super.membro_superclasse
9. Diga o que entende por polimorfismo.
10. O que uma classe abstracta?
11. Para que uma subclasse, de uma superclasse abstracta, no
seja tambm abstracta tem que ...............
2009/2010
28
Paradigmas de Programao
Considere a classe Animal e as subclasses Cao e Pato
conforme se indica abaixo
public class Animal {
private String nome;
private int n_patas;
//Construtores
public Animal(){... ...
public Animal(String nome, int patas) {...
//Selectores
public String getNome() {...
public int getN_patas() {...
//Modificadores
public void setNome(String nome) {...
public void setN_patas(int n_patas) {...
public String toString() {...
}
2009/2010
29
Paradigmas de Programao
public class Cao extends Animal{
30
Paradigmas de Programao
Exerccio
1. Construir a superclasse Animal com os atributos nome, n de patas
Os mtodos a considerar so construtores, selectores, modificadores
e toString().
2. Desenvolver tambm as subclasses Co e Pato. Co, alm dos
atributos de Animal caracteriza-se pela raa e Pato pela cor. Estas
subclasses devem implementar o mtodo falar() que devolve um
string representativo dos sons emitidos por cada animal (cao faz
Au..Au e pato faz Qu..Qu)
3. A implementao das classes anteriores sugere que a classe
Animal podia ser abstracta. Faa as alteraes necessrias para
considerar Animal como abstracta.
4. Crie a classe Zoo que uma coleco de animais. Desenvolva
mtodos que liste como fala cada um dos animais do zoo, que conta
o nmeros de patos do zoo e liste as raas(sem repetio) dos ces
do zoo.
2009/2010
31
Paradigmas de Programao
Exerccio
1.
2.
package supermercado;
import java.util.ArrayList;
public class Teste {
public static void main (String [] args) {
Cliente c1 = new Cliente("Joao");
c1.compra(new ItemPrecoPeso("Bananas",1.5, 1));
c1.compra(new ItemPrecoPeso("Queijo",1.1, 10));
c1.compra( new ItemPrecoUnidades("Ananas",2, 2.5));
c1.compra( new ItemPrecoUnico("Livro", 10) );
ArrayList compras = c1.getCompras();
for (int i=0; i<compras.size(); ++i)
System.out.println(compras.get(i)); }
}
2009/2010
32
Paradigmas de Programao
Exemplo consolidao da matria
2009/2010
(exerccio de exame)
33
Paradigmas de Programao
package supermercado;
import java.util.ArrayList;
public class Cliente {
private String nome;
private ArrayList compras;
public Cliente(String n) {
nome = n;
compras = new ArrayList();
}
public void compra(ItemDeCompra c) {
compras.add(c);
}
public ArrayList getCompras() {
return compras;
}
}
2009/2010
34
Paradigmas de Programao
package supermercado;
public abstract class ItemDeCompra {
private static int proxNumId = 0;
private int numId;
private String nome;
public ItemDeCompra() {
numId = proxNumId++;
}
public ItemDeCompra( String n ) {
this();
nome = n;
}
public String toString() {
return "\t" + nome;
}
public abstract double custo();
}
2009/2010
35
Paradigmas de Programao
package supermercado;
public class ItemPrecoUnidades extends ItemDeCompra {
private int quantidade;
private double precoUnitario;
public ItemPrecoUnidades(String nome, int q, double pU){
super(nome);
quantidade = q;
precoUnitario = pU;
}
public double custo() {
return quantidade * precoUnitario;
}
public String toString() {
return super.toString() + "\t\t" + quantidade + "
Unidades @ " + "\t" + precoUnitario + " Euros\t\t" +
custo() + " Euros.";
}
}
2009/2010
36
Paradigmas de Programao
package supermercado;
public class ItemPrecoPeso extends ItemDeCompra {
private double peso;
private double precoUnidadePeso;
public ItemPrecoPeso(String nome, double p, double pUP) {
super(nome);
peso = p;
precoUnidadePeso = pUP;
}
public double custo() {
return peso * precoUnidadePeso;
}
public String toString() {
return super.toString()+"\t\t"+peso+" Kg @ "+"\t" +
precoUnidadePeso + " Euros\t\t" + custo() + " Euros.";
}
}
2009/2010
37
Paradigmas de Programao
package supermercado;
public class ItemPrecoUnico extends ItemDeCompra {
private double precoUnico;
public ItemPrecoUnico(String nome, double pU) {
super(nome);
precoUnico = pU;
}
public double custo() {
return precoUnico;
}
public String toString() {
return super.toString() + "\t\t\t\t\t\t\t" +
custo() + " Euros.";
}
}
2009/2010
38