Sunteți pe pagina 1din 36

Programao orientada a

objetos
com Java
1.0
Sobrecarga, Herana e
Polimorfismo
Prof.: Jean Cristian
2
2004 by Pearson Education
Sobrecarga
Sobrecarga de Mtodos
A forma mais simples de polimorfismo oferecido pela
linguagem Java a sobrecarga de mtodos (method
overload) ou seja a possibilidade de existirem numa
mesma classe vrios mtodos com o mesmo nome. Para que
estes mtodos de mesmo nome possam ser distinguidos eles
devem possuir uma assinatura diferente. A assinatura
(signature) de um mtodo uma lista que indica os tipos de
todos os seus argumentos, sendo assim mtodos com mesmo
nome so considerados diferentes se recebem um diferente
nmero ou tipo de argumentos e tem, portanto, uma
assinatura diferente.
3
2004 by Pearson Education
Sobrecarga
4
2004 by Pearson Education
Sobrecarga
5
2004 by Pearson Education
Sobrecarga
Sobrecarga de Construtores
Da mesma forma que podemos sobrecarregar
mtodos de uma classe, o mesmo pode ser feito
com seus construtores, ou seja, uma classe pode
possuir mais de um construtor onde cada um deles
diferenciado por sua assinatura. O compilador
determina qual dos construtores utilizar atravs
dos argumentos utilizados na chamada do
construtor.
6
2004 by Pearson Education
Sobrecarga
7
2004 by Pearson Education
Sobrecarga
Sobrecarga3 s = new Sobrecarga3();
s.prim = 10;
Pode ser substitudo por apenas:
Sobrecarga3 s = new Sobrecarga3(10);
Outro caso possvel:
Sobrecarga3 s = new Sobrecarga3();
s.prim = 5;
s.sec = -2;
Pode ser substitudo por:
Sobrecarga3 s = new Sobrecarga3(5, -2);
8
2004 by Pearson Education
Herana
Herana
uma tcnica onde uma classe passa a utilizar atributos e
operaes definidas em uma outra classe especificada como seu
ancestral. Rigorosamente falando, a herana o compartilhamento
de atributos e operaes entre classes baseado num relacionamento
hierrquico do tipo pai e filho, ou seja, a classe pai contm
definies que podem ser utilizadas nas classes definidas como filho.
A classe pai o que se denomina classe base (base class) ou
superclasse (superclass) e as classes filho so chamadas de classes
derivadas (derived classes) ou subclasses (subclasses). Este
mecanismos sugere que uma classe poderia ser definida em termos
mais genricos ou amplos e depois refinada sucessivamente em uma
ou mais subclasses especficas. Da o origem do termo tcnico que
descreve a herana: especializao (specialization).
Em Java indicamos que uma classe derivada de uma outra
classe utilizando a palavra reservada extends conforme o trecho
simplificado de cdigo dado a seguir: A superclasse no recebe
qualquer indicao especial.
9
2004 by Pearson Education
Herana
10
2004 by Pearson Education
Herana
Num diagrama UML teramos a seguinte
representao para classes hierarquicamente
relacionadas:
11
2004 by Pearson Education
Herana
Em princpio, todos atributos e operaes
definidos para uma certa classe base so aplicveis
para seus descendentes que, por sua vez, no podem
omitir ou suprimir tais caractersticas pois no seriam
verdadeiros descendentes se fizessem isto. Por outro
lado uma subclasse (um descendente de uma classe
base) pode modificar a implementao de alguma
operao (reimplementar) por questes de eficincia
sem modificar a interface externa da classe.
As subclasses podem adicionar novos mtodos e
atributos no existentes na classe base, criando uma
verso mais especfica da classe base, isto ,
especializando-a.
12
2004 by Pearson Education
Herana
13
2004 by Pearson Education
Herana
// LiquidificadorGenerico.java
public class LiquidificadorGenerico {
// atributos
protected int velocidade;
protected int velocidadeMaxima;
// construtores
public LiquidificadorGenerico() {
velocidade = 0;
velocidadeMaxima = 2;
}
public LiquidificadorGenerico(int v) {
this()
ajustarVelocidadeMaxima(v);
}
// metodos
protected void
ajustarVelocidadeMaxima(int v) {
if (v>0)
velocidadeMaxima = v;
}
protected void ajustarVelocidade(int
v) {
if (v>=0 && v<=velocidadeMaxima)
velocidade = v;
}
public int obterVelocidadeMaxima() {
return velocidadeMaxima;
}
}
public int obterVelocidade() {
return velocidade;
}
}
14
2004 by Pearson Education
Herana
// LiquidificadorAnalogico.java
public class LiquidificadorAnalogico
extends
LiquidificadorGenerico {
// construtor
public LiquidificadorAnalogico() {
velocidade = 0;
}
// metodos
public void aumentarVelocidade() {
ajustarVelocidade(velocidade + 1);
}
public void diminuirVelocidade() {
diminuirVelocidade(velocidade - 1);
}
}
// LiquidificadorDigital.java
public class LiquidificadorDigital
extends
LiquidificadorGenerico{
// construtor
public LiquidificadorDigital() {
velocidade = 0;
}
// metodo
public void trocarVelocidade(int v) {
// aciona mtodo protegido para
troca de velocidade
ajustarVelocidade(v);
}
}
15
2004 by Pearson Education
Polimorfismo
Enquanto a herana oferece um poderoso
mecanismo de especializao, o polimorfismo
oferece um igualmente poderoso mecanismo de
generalizao, constituindo uma outra dimenso
da separao da interface de uma classe de sua
efetiva implementao.
Imaginemos que seja necessrio implementar
numa classe LiquidificadorInfo um mtodo que
seja capaz de imprimir a velocidade atual de
objetos liquidificador os quais podem ser tanto do
tipo digital como analgico. Poderamos,
utilizando a sobrecarga, criar um mtodo de
mesmo nome que recebesse ou um
LiquidificadorAnalogico ou um
LiquidificadorDigital:
16
2004 by Pearson Education
Polimorfismo
17
2004 by Pearson Education
Polimorfismo
Embora correto, existem duas grandes desvantagens nesta aproximao:
(1) para cada tipo de Liquidificador existente teramos um mtodo
sobrecarregado avolumando o cdigo que deveria ser escrito (e depois
mantido) alm disso (2) a adio de novas subclasse que representassem
outros tipos de liquidificador exigiria a implementao adicional de
outros mtodos semelhantes.
18
2004 by Pearson Education
Atravs do polimorfismo pode-se chegar ao mesmo resultado mas
de forma mais simples pois a classe LiquidificadorGenerico
permite o tratamento generalizado de todas as suas subclasses.
Polimorfismo
19
2004 by Pearson Education
Outra situao possvel a seguinte: como qualquer mtodo de
uma superclasse pode ser sobreposto (overhided) em uma
subclasse, temos que o comportamento deste mtodo pode ser
diferente em cada uma das subclasses, no entanto atravs da
superclasse podemos genericamente usar tal mtodo, que produz
um resultado distinto para cada classe utilizada. Assim o
polimorfismo tambm significa que uma mesma operao pode se
comportar de forma diferente em classes diferentes. Para a
orientao objetos uma operao uma ao ou transformao
que um objeto pode realizar ou est sujeito e, desta forma, os
mtodos so implementaes especficas das operaes desejadas
para uma certa classe.
Polimorfismo
20
2004 by Pearson Education
Classes Abstratas
Em algumas circunstncias desejamos orientar como uma classe
deve ser implementada, ou melhor, como deve ser a interface
de uma certa classe. Em outros casos, o modelo representado
to amplo que certas classes tornam-se por demais gerais, no
sendo possvel ou razovel que possuam instncias. Para estes
casos dispomos das classes abstratas (abtract classes).
Tais classes so assim denominadas por no permitirem a
instanciao, isto , por no permitirem a criao de objetos do
seu tipo. Sendo assim seu uso dirigido para a construo de
classes modelo, ou seja, de especificaes bsicas de classes
atravs do mecanismo de herana.
Uma classe abstrata deve ser estendida, ou seja, deve ser a
classe base de outra, mais especfica que contenha os detalhes
que no puderam ser includos na superclasse (abstrata). Outra
possvel aplicao das classes abstratas a criao de um
ancestral comum para um conjunto de classes que, se originados
desta classe abstrata, podero ser tratados genericamente
atravs do polimorfismo.
21
2004 by Pearson Education
Classes Abstratas
22
2004 by Pearson Education
Classes Abstratas
//Sendo uma classe abstrata, nunca poderemos fazer new Veiculo
public abstract class Veiculo {
//Modificador protected permite que as classes filhas tenham acesso direto
protected int rodas;
//Construtor de Veiculo recebe um inteiro que define o nmero de rodas do mesmo.
protected Veiculo(int rodas) {
this.rodas = rodas;
}
//mtodo abstrato dever ser implementado obrigatoriamente pelas subclasses
public abstract void acelerar();
//mtodo ser herdado pelas classes filhas e poder ou no ser sobrescrito
public void rodar() {
System.out.println("Este veculo possui " + rodas + " rodas.");
}
}
23
2004 by Pearson Education
Classes Abstratas
//Classe Carro herda de Veiculo. Logo dever
//obrigatoriamente implementar seus mtodos abstratos
public class Carro extends Veiculo {
//Construtor de Carro chama explicitamente o cons-
//trutor de Veiculo que recebe um inteiro e que por
//sua vez o atribui variavel rodas
public Carro() {
super(4);
}
//implementao obrigatria do mtodo abstrato acelerar()
public void acelerar() {
System.out.println("Para acelerar um carro basta pisar no pedal
mais direita.");
}
}
24
2004 by Pearson Education
Interfaces
O Java permite a definio de um tipo especial de classe denominada
interface. Uma interface uma classe que permite obter resultados
semelhantes ao obtidos com a herana mltipla, isto , permite o
compartilhamento das interfaces das classes envolvidas sem o
compartilhamento de suas implementaes, levando ao extremo o
conceito da orientao objetos.
Isto significa que, embora o Java no oferece os mecanismos de herana
mltipla (quando uma classe compartilha a interface e implementao
de vrias classes base simultaneamente), possvel obter-se a melhor
parte da herana mltipla (ao compartilhamento apenas da interface da
classe) atravs deste novo mecanismo. O nome interface se origina
exatamente do fato que o que se pretende uma definio
compartilhvel da interface propriamente dita de uma classe mas no de
sua implementao efetiva.
25
2004 by Pearson Education
Classes Abstratas
public interface Carga {
public void setPesoMax(double pesoMax);
public double getPesoMax();
public void carregar();
}
26
2004 by Pearson Education
Classes Abstratas
public class Caminhao extends Veiculo implements Carga {
private double pesoMax;
//Construtores
public Caminhao(double pesoMax) {
super(28);
this.pesoMax = pesoMax;
}
public Caminhao() {
this(0);
}
//Mtodos set e get pblicos
public void setPesoMax(double pesoMax) {
this.pesoMax = pesoMax;
}
public double getPesoMax() {
return pesoMax;
}
//Mtodos pblicos
public void carregar() {
//linha alterada para Lab 08.B
System.out.println("Este caminho carrega " + super.getPesoMax() + " kg.");
}
public void acelerar() {
System.out.println("Se estiver carregado vai ficar difcil acelerar...");
}
}
27
2004 by Pearson Education
Classes Abstratas
public class Trator extends Veiculo implements Carga {
private double pesoMax;
public Trator() {
super(4); // Esta linha deve estar aqui
}
public void setPesoMax(double pesoMax) {
this.pesoMax = pesoMax;
}
public double getPesoMax() {
return pesoMax;
}
public void carregar() {
System.out.println("Qualquer coisa... podem carregar qualquer coisa...");
}
public void rodar() {
System.out.println("Rodam pelos campos ou pelas obras.., depende do tipo");
}
public void acelerar () {
System.out.println("Ser que um trator chega aos 100 Km???.");
}
}
28
2004 by Pearson Education
Classes Abstratas
public abstract class VeiculodeCarga extends Veiculo implements
Carga {
//Varivel de instncia
private double pesoMax;
//Construtor obrigatorio pois Veiculo no tem um const padrao
public VeiculodeCarga ( int r ){
super( r );
}
//Mtodos set e get pblicos
public void setPesoMax(double pesoMax) {
this.pesoMax = pesoMax;
}
public String getPesoMax() {
return pesoMax;
}
}
29
2004 by Pearson Education
Classes Abstratas
30
2004 by Pearson Education
Classes Abstratas
public class TestaVeiculos {
public static void main(String[] args) {
Trator t = new Trator();
Caminhao c = new Caminhao(100000);
Veiculo v1 = new Trator();
Veiculo v2 = new Carro();
Carga ca = new Caminhao();
// Demonstra implementaes diferentes de uma interface
t.acelerar();
c.acelerar();
// Demonstra invocao de mtodo virtual
v2.acelerar();
v2.rodar();
// Demonstra chamada aos mtodos super
v1.rodar();
}
}
31
2004 by Pearson Education
Classes Abstratas
public class TestaVeiculosCompleto {
public static void main(String[] args) {
Trator t = new Trator();
Caminhao c = new Caminhao(100000);
Veiculo v1 = new Trator();
Veiculo v2 = new Carro();
Carga e = new Caminhao();
System.out.println("Demonstra implementacoes diferentes
de uma interface:");
System.out.print("t.brincar() = ");t.carregar();
System.out.print("c.brincar() = ");c.carregar();
32
2004 by Pearson Education
Classes Abstratas
//v1.carregar(); //Veiculo nao tem o mtodo carregar().
System.out.println("v1 eh um " + oqueEh(v1));
//Para usar o metodo carregar de v1 deve-se executar um casting
explicito
System.out.print("( (Trator) v1).carregar() = ");( (Trator)
v1).carregar();
System.out.println("\nCastings podem provocar perda de
informacao:");
Veiculo v3 = new Caminhao (5000);
System.out.print("( (Caminhao) v3).getPesoMax() = ");( (Caminhao)
v3).getPesoMax();
System.out.println("\n\nDemonstra invocacao de metodo virtual:");
System.out.print("v2.acelerar() = ");v2.acelerar();
System.out.print("v2.rodar() = ");v2.rodar();
System.out.println("\nDemonstra chamada aos metodos super:");
System.out.print("v1.rodar() = ");v1.rodar();
}
33
2004 by Pearson Education
Classes Abstratas
public static String oqueEh (Veiculo a){
if ( a instanceof Trator )
return (" - Veiculo tipo Trator - ");
else if ( a instanceof Caminhao )
return (" - Veiculo tipo Caminhao - ");
else if ( a instanceof Carro )
return (" - Veiculo tipo Carro - ");
else
return (" - Veiculo puro - ");
}
public static String oqueEh (Caminhao c){
return (" - Caminhao - ");
}
public static String oqueEh (Trator t){
return (" - Trator - ");
}
public static String oqueEh (Carro c){
return (" - Carro - ");
}
}
34
2004 by Pearson Education
Interfaces
35
2004 by Pearson Education
Interfaces
public abstract class Animal {
public abstract void fazerBarulho();
}
public interface Pesado
{
double obterPeso();
}
public interface Colorido {
String obterCor();
}
public class Porco extends Animal
implements Pesado, Colorido {
public void fazerBarulho() {
System.out.println("inc!");
}
//Implementao da interface
Pesado
public double obterPeso() {
return 50.00; }
//Implementao da interface
Colorido
public String obterCor() {
return "Black"; }
//Um mtodo s do porco
public boolean enlameado() {
return true; }
}
36
2004 by Pearson Education
Exerccios
Vamos praticar resolvendo os exerccios:

S-ar putea să vă placă și