Você está na página 1de 15

Programação Orientada a Objetos em Java

Encapsulamento
Os três pilares da POO Herança
Polimorfismo

Herança => Reaproveitando código


Vimos que o Encapsulamento permite:
- escrever objetos bem definidos e independentes
- que um objeto use outro objeto, através de mensagem

A herança é a segunda maneira de relacionamento entre objetos

Permite que você baseie a definição de uma nova


classe a partir de uma classe previamente existente.
Classe Ponto

y double x;
double y;
SuperClasse
o Ponto ( )
rai Ponto (double x, double y)
y
void setPonto (double x, double y)
String emPalavras ( )

Classe Circulo
x x
double r;
Circulo ( )
Circulo (int double, double y,double r) SubClasse
void setRaio(double r)
String emPalavras ( )

POOemJava-Herança[anibal@directnet.com.br] 1
public class Ponto{
protected double x, y;

public Ponto(){
setPonto( 0, 0 );
}
public Ponto( double a, double b ){
setPonto( a, b );
}
public void setPonto( double a, double b ){
x = a;
y = b;
}
public String emPalavras( ){
return "[" + x + ", " + y + "]";
}
}
public class Circulo extends Ponto{
protected double r;

public Circulo(){
setRaio( 0 );
}
public Circulo( double a, double b, double r ){
super( a, b );
setRaio( r );
}
public void setRaio( double r ){
this.r = r;
}
public String emPalavras( ){
return super.emPalavras( ) + "[" + r + "]";
}
} POOemJava-Herança[anibal@directnet.com.br] 2
Herança: é o meio pelo qual um objeto herda comportamento e
atributos de outros objetos similares

através da herança pode-se criar uma nova classe de


objetos definindo apenas as diferenças

class Dog extends Mamifero {

// aqui entra o código

subclasse superclasse
superclasse subclasse
public class Mamifero { public class Dog extends Mamifero {
String name;
public void speak ( ) {
public void sleep ( ) { System.out.println(“Arf! Arf!”);
System.out.println(“ZZ ZZZ ZZ”);
} }
} }

public class Pluto extends Mamifero {

public void speak( ) {


System.out.println(“Cadê a minha Medalha?”);
}
}

POOemJava-Herança[anibal@directnet.com.br] 3
Testando a Hierarquia
Speak.java
class Speak {
public static void main( String arguments[ ] ) {
Dog lessie = new Dog( ); // objeto lessie da classe Dog
Pluto mutly = new Pluto(); // objeto mutly da classe Pluto

lessie.name = “Boby”;
mutly.name = “Baco”;

System.out.println (“Primeiro vamos ouvir a Lessie: ”);


lessie.speak();

System.out.println (“Agora é a vez do Mutly: ”);


mutly.speak();

System.out.println (“Já é hora de ambos dormirem: ”);


lessie.sleep();
mutly.sleep();
}
}

Saída:
Primeiro vamos ouvir a Lessie:
Arf! Arf!
Agora é a vez do Mutly
Cadê a minha Medalha?
Já é hora de ambos dormirem:
ZZ ZZZ ZZ
ZZ ZZZ ZZ

Java NÃO suporta Herança Múltipla

classes que herdam de mais de uma classe

Programas Orientados a Objetos são mais fáceis de serem depurados

permite a concentração em um Objeto específico


POOemJava-Herança[anibal@directnet.com.br] 4
Vamos modelar a classe Employee (empregado) que é uma pessoa
public class Employee {
private String first_name;
private String last_name;
private double wage;

public Employee (String first_name, String last_name, double wage) {


this.first_name = first_name;
this.last_name = last_name;
this.wage = wage;
}
public double getWage ( ) {
return wage;
}
public String getFirstName ( ) {
return first_name;
}
public String getLastName ( ) {
return last_name;
}
}

Instâncias da classe Employee podem aparecer em um aplicativo


de banco de dados de folha de pagamento.

Supor: Modelar um funcionário comissionado que possui um


salário-base + comissão por venda

A classe CommissionedEmployee é exatamente igual à


classe Employee. Um objeto CommissionedEmployee
é um objeto Employee.

POOemJava-Herança[anibal@directnet.com.br] 5
public class CommissionedEmployee extends Employee {
private double commission; // custo por unidade
private int units; // controle do # de unidades vendidas

public CommissionedEmployee (String first_name, String last_name,


double wage, double commission ) {
super (first_name, last_name, wage);
this.commission = commission;
}
public double calculatePay ( ) {
return getWage( ) + (commission * units);
}
public void addSales (int units ) {
this.units = this.units + units;
}
public void resetSales( ) {
units = 0;
}
}

A classe CommissionedEmployee baseia sua definição


na classe Employee já existente.

Como CommissionedEmployee herda de Employee:


- getFirstName( )
- getLastName( )
- getWage( )

Os atributos first_name, last_name e wage se tornarão


todos parte de sua definição.

POOemJava-Herança[anibal@directnet.com.br] 6
Como a interface pública de Employee se torna parte da interface
de CommissionedEmployee, você pode enviar para
CommissionedEmployee qualquer mensagem que poderia
enviar para Employee.

public class EmployeeExample {


public static void main(String []args) {
CommissionedEmployee c =
new CommissionedEmployee (“Mr.”,”Sales”,5.50,1.00);

c.addSales(5);
System.out.println(“First Name: ” + c.getFirstName( ) );
System.out.println(“Last Name: ” + c.getLastName( ) );
System.out.println(“Base pay: $ ” + c.getWage( ) );
System.out.println(“Total Pay: ” + c.calculatePay( ) );
}
}

C:\aulas\java> javac EmployeeExample.java


C:\aulas\java> java EmployeeExample
First Name: Mr.
Last Name: Sales
Base Pay: $5.5
Total Pay: $10.5

POOemJava-Herança[anibal@directnet.com.br] 7
Classes Abstratas

Ao implementar essa public class Animal


hierarquia, percebemos {
que o código da classe private String nome;
animal é muito genérico:
public Animal(String n) {
nome = n;
}
public void imp( ) {
System.out.println("Nome: "+nome);
}
public String getName( ) {
return(nome);
}
public void talk( ) {
System.out.println("Eu nao falo");
}
}

Na prática, nunca iremos instanciar um animal, pois ele serve apenas


para a criação de pássaros e mamíferos. Seguindo a mesma lógica,
essas duas classes também não serão instanciadas. Ou seja, somente
as classes derivadas de Passaro (BemTeVi, Papagaio) e Mamifero
(Cachorro, Vaca) é que serão usadas efetivamente.
POOemJava-Herança[anibal@directnet.com.br] 8
Para esse tipo de situação, Java suporta a criação de uma
classe abstrata. Esse tipo de classe não pode ser instanciado,
e serve apenas para derivarmos novas classes.

Veja como a classe animal pode ser implementada dessa forma:

public abstract class Animal


{
private String nome;

public Animal(String n) {
nome = n;
}

public void imp() {


System.out.println("Nome: "+nome);
}

public String getName() { return(nome); }

public abstract void talk();


}

Observe que o método talk( ) também foi declarado como abstract:


isso significa que esse método não foi implementado nesta classe
e deverá, obrigatoriamente, ser implementado nas classes derivadas.
Conseqüentemente, as classes Passaro e Mamifero também serão
Classes abstratas:

POOemJava-Herança[anibal@directnet.com.br] 9
public abstract class Passaro extends Animal
{
public Passaro(String n) {
super(n);
}
public void talk( ) {
System.out.println("Piu piu");
}
}
Repare que o método talk( ) em Mamifero é abstract, pois
não possui implementação. Já em Passaro, há implementação.

public abstract class Mamifero extends Animal


{
public Mamifero(String n) {
super(n);
}
public abstract void talk( );
}
Além de fornecer uma modelagem mais robusta ao programador,
as classes abstratas também são representadas de forma mais
eficiente, pois nunca precisarão ser instanciadas.

Finalize os exercícios:
1- Super classe Ponto e Subclasse Círculo.
2- Criar a classe Retangulo utilizando a Ponto como base.
3- Classe de animais => utilizando classes abstratas.
POOemJava-Herança[anibal@directnet.com.br] 10
Orientação a Objetos (OO)
O termo Orientação a Objetos (OO) significa organizar o
mundo real como uma coleção de objetos que incorporam
Estrutura de Dados e Comportamento.

Objetos são pacotes de software compostos de dados e procedimentos


que atuam sobre estes dados. Os procedimentos são também conhecidos
como Métodos e determinam o comportamento do objeto.

Objeto = Dado + Método

Objeto = Estado + Comportamento

Um Objeto Comportamento/Métodos/Procedimentos

Propriedades/Dados/ Variáveis

andar tamanho
ar
O Objeto Carro in
pa

z
bu
ra

capacidade
r
girar

velocidade

Quilometragem

Todo o acesso aos dados ou propriedades


andar
do objeto é realizado através de sua interface
ar
in
pa

z
bu
ra
r
girar

POOemJava-Herança[anibal@directnet.com.br] 11
Encapsulamento
O Encapsulamento é definido como uma técnica para minimizar
interdependências entre módulos através da definição de interfaces
externas.
Interface
andar
in
ar Mudanças na implementação de uma classe
pa

z
bu
ra

que preserve a interface externa não afeta


r
girar

outras definições de classes.

Exemplo: o método parar sofreu alteração em seu algoritmo


mas, sua interface permanece a mesma.

Mensagens
Objetos interagem e se comunicam através de Mensagens

Emissor Andar(...)
Receptor

Mensagem para um Carro

As Mensagens identificam os Métodos a serem executados


no objeto Receptor.

POOemJava-Herança[anibal@directnet.com.br] 12
Métodos
O que um determinado Método pode fazer com os Dados do Objeto?
Construtor
Destrutor
Tipos de Métodos
Transformador
Acesso
Exercícios:
1- Dê três exemplos de Objetos
2- Para cada um deles, sugira alguns Métodos pertinentes
3- Vamos implementar esses exemplos em Java
class bibliX { metodoB
int m, o A m

bi
od

bl
et

iX
int z; m
z

bibliX
float n; n
float s;
s
bibliX( ) { m=0; z=0; n=0.0; s=0.0; }
bibliX(int a; int b; float c; float d) {
m=a; z = b; n = c; s = d;
}
int metodoA ( ){
return (m + n);
}
void metodoB ( ) {
System.out.println(“Valor de m: ” + m + “valor de s: ”+ s);
}
}
class usaX ( ) {
public static void main (String arg []) {
bibliX aux = new bibliX(10,20, 12.5, 22.8 ) // método Construtor
aux.metodoA( ); javac bibliX.java
aux.metodoB( ); javac usaX.java
} java usaX
} POOemJava-Herança[anibal@directnet.com.br] 13
Projeto: Implementar uma classe CDPlayer cuja interface é apresentada
na Figura abaixo.
Lembre-se: a cada interface, disponível ao usuário,
haverá um método correspondente.

Stop ( )
)

Pa
y(

us
a
Pl

e(
)
Eject ( )
Pense nos Atributos e Métodos necessários para implementar o projeto

class CDPlayer {
// atributos

// métodos
CDPlayer( ){ } // construtor
Play ( ) {

}
Eject ( ) {

}
Pause ( ) {
}
MetodoX ( ) { }
}
POOemJava-Herança[anibal@directnet.com.br] 14
POOemJava-Herança[anibal@directnet.com.br] 15