Sie sind auf Seite 1von 94

MDULO 4

Classes & Objetos

Prof. Alexandre Siqueira Dias


alexandresd@prof.una.br

Classe & Objeto


Classe

Descreve uma categoria genrica

Objeto

Instncia de uma classe


Estrutura de dados que representa
um membro especfico da categoria

Exemplo
public class Data {
public int dia, mes, ano;
public void iniciaData(int d, int m, int a){
if ((d > 0) && (d <= 31)) dia = d;
if ((m > 0) && (m <= 12)) mes = m;
if (a > 0) ano = a;
}
public String exibe(){
return dia + "/" + mes + "/" + ano;
}
}

Exemplo
public class TestData{
public static void main(String args[]){
Data d1 = new Data();
// Por que chamar o mtodo iniciaData, se podemos fazer
d1.dia = 1;
d1.mes = 12;
d1.ano = 2010;
System.out.println(d1.exibe()); // 1/12/2010
// Porque podemos fazer
d1.dia = -11;
d1.mes = 13;
d1.ano = -4500;
System.out.println(d1.exibe()); // -11/13/-4500 no uma data vlida
// como impedir que isso acontea?
}

Ocultao de informao (information


hiding)
Processo de manter detalhes de implementaes
ocultas do usurio
Isso pode ser conseguido atravs de especificadores
de acesso:

public: membros pblicos podem ser acessados em


qualquer lugar do programa
private: membros privados so acessveis somente na
prpria classe
protected: membros protegidos so acessveis na prpria
classe e suas subclasses
sem especificador: so acessveis somente nas classes do
mesmo pacote

Ocultao de informao (information


hiding)
class Data {
private int dia, mes, ano;
public void iniciaData(int d, int m, int a){
if ((d > 0) && (d <= 31)) dia = d;
else dia = 1;
if ((m > 0) && (m <= 12)) mes = m;
else mes = 1;
if (a > 0) ano = a;
else ano = 1900;
}
public String exibe(){
return dia + "/" + mes + "/" + ano;
}
}

Ocultao de informao (information


hiding)
public class TestData{
public static void main(String args[]){
Data d1 = new Data();
d1.dia = 1; // Erro de acesso
d1.mes = 12; // Erro de acesso
d1.ano = 2010; // Erro de acesso
d1.iniciaData(1, 12, 2010); // Correto
System.out.println(d1.exibe()); // 1/12/2010
d1.iniciaData(-11, 13, -4500);
System.out.println(d1.exibe()); // 1/1/1900
}

Ocultao de informao (information


hiding)

Como podemos, nesta nova


implementao, acessar informaes
como dia, ms e ano?
Atravs dos membros pblicos da
classe

Ocultao de informao (information


hiding)
class Data {
private int dia, mes, ano;
public void setDia(int d){
if ((d > 0) && (d <= 31)) dia = d;
else dia = 1;
}

public void setAno(int a){


if (a > 0) ano = a;
else ano = 1900;
}
public void iniciaData(int d, int m, int a){
setDia(d);
setMes(m);
setAno(a);
}

public int getDia(){


return dia;
}
public void setMes(int m){
if ((m > 0) && (m <= 12)) mes = m;
else mes = 1;
}
public int getMes(){
return mes;
}

public String exibe(){


return dia + "/" + mes + "/" + ano;
}
}

Ocultao de informao (information


hiding)
public class TestData{
public static void main(String args[]){
Data d1 = new Data();
d1.iniciaData(20,1,2011); // Correto
System.out.println(d1.exibe()); // 23/2/2011
d1.setDia(23);
d1.setMes(2);
System.out.println("Hoje dia: " + d1.exibe()); // 23/2/2011
}

Construtores
Quando um objeto instanciado (alocado
na memria atravs do operador new)
um mtodo especial chamado
construtor automaticamente chamado
pelo interpretador.
Deve ter o mesmo da classe e no
retornar valor
Objetivo:

assegurar que os valores das variveis de


instncia tero valores consistentes (corretos)

No obrigatrio

Construtores
Na classe ContaCorrente tnhamos o mtodo
inicializarContaCorrente:
public class ContaCorrente {
private int numero, agencia;
private double saldo;
public void inicializarContaCorrente(int n, int ag) {
numero = n;
agencia = ag;
saldo = 0;
}

Construtores
Ao instanciar um objeto da classe,
tnhamos que executar esse mtodo:
ContaCorrente minhaConta;
minhaConta = new ContaCorrente();
minhaConta.inicializarContaCorrente(200,
202020);

Construtores
Poderamos considerar esse mtodo como sendo o
construtor da classe:
public class ContaCorrente {
private int numero, agencia;
private double saldo;
public ContaCorrente(int n, int ag) {
numero = n;
agencia = ag;
saldo = 0;
}

Construtores
Ao instanciar o objeto da classe, o mtodo
ser executado automaticamente:
ContaCorrente minhaConta;
minhaConta = new ContaCorrente(200,
202020);

Construtores
Construtor da classe Retangulo:
public class Retangulo {
private float altura, largura;
public Retangulo() {
altura = 0; largura = 0;
}

Sobrecarga de Construtores
comum a construo de mais de um
construtor da classe.
Isso se chama sobrecarga de
construtor.
Objetivo:

assegurar outras maneiras de inicializar as


variveis de um objeto que foi instanciado.

Sobrecarga de Construtores
public class Retangulo{

private float altura, largura;


public Retangulo(){
//construtor sem argumentos
largura=0; altura=0;
}
public Retangulo(float larg, float alt){
//construtor sobrecarregado com argumentos
largura=larg; altura=alt;
}
.
.
}

Sobrecarga de Construtores
public class TestRetangulo{
public static void main(String args[]){
Retangulo r1, r2;
r1=new Retangulo();
r2=new Retangulo(20, 30);
...
}

Exerccio
Criar a classe Time para armazenar internamente Hora, Minutos e Segundos.
No permita atribuio direta e s aceitar valores vlidos (0-23 ou 0-59)
Criar 5 construtores:

Sem nenhuma informao passada

Passando somente a hora inicial

Passando somente a hora e minutos iniciais

Passando a hora, minutos e segundos iniciais

Passando um outro objeto Time como horrio inicial


Criar um mtodo setTime para passar a hora, minuto e segundos de uma s
vez
Implementar um mtodo set e um get para cada atributo
Criar um mtodo que retorne uma string contendo uma hora no formato 24
horas
Criar um mtodo que retorne uma string contendo uma hora no formato
AM/PM

Exerccio
Criar a classe Circulo que possua:

Atributos inteiros x e y, que indicam as coordenadas do crculo na tela


Atributo raio, que representa o tamanho do raio do crculo
Mtodo para calcular a rea (rea = Pi * raio2) utilize a constante Math.PI e a funo Math.pow(base,
expoente), da classe Math (import java.util.*)
Mtodo para calcular o permetro do crculo (Permetro = 2 * Pi * raio)
Mtodos (moveX e moveY) que recebam como parmetro um inteiro, e que mova o crculo
horizontalmente e verticalmente
Mtodo aumenta, que recebe como parmetro um inteiro e aumenta o raio em funo deste inteiro
Mtodo exibe, que retorna as seguintes informaes do crculo

Centro: (x, y)
Raio: raio
rea: area
Permetro: perimetro

Crie um construtor que receba como parmetro as coordenadas e o raio do crculo.


Crie um construtor vazio, que inicialize os valores das coordenadas e do raio com o valor 0
Para testar a sua classe, solicite inicialmente ao usurio que informe as coordenadas e o raio do crculo
Em seguida, exiba um menu com as seguintes opes:

1
2
3
4

Mover
Aumentar
Imprimir
Sair

this
this: referncia implcita passada para os mtodos, para
referenciar o objeto corrente.
Usada principalmente em dois contextos:

Diferenciar atributos de objetos de parmetros ou variveis locais


de mesmo nome:
public class Retangulo {
private double largura, altura;
public Retangulo(double largura, double altura) {
this.largura = largura;
this.altura = altura;
}

Acessar o mtodo construtor a partir de outros construtores:


public Retangulo( ) {
this (10, 10) // invoca o construtor com 2 argumentos
}

Membros estticos
Quando criamos objetos de uma
determinada classe, cada objeto possui sua
cpia separada com os valores dos atributos
definidos para a classe.
Existem situaes em que necessrio que
todos os objetos de uma classe
compartilhem um mesmo atributo,
semelhante ao que ocorre com variveis
globais em linguagens de programao
tradicional
Neste caso, devemos definir o atributo
como esttico.

Membros estticos
O atributo esttico funciona como
uma varivel global da classe
Todos os objetos da classe
compartilham o mesmo valor do
atributo esttico
Qualquer mudana vista por
todos os objetos da classe

Exemplo
Vamos contar o nmero de instncias
criadas para uma classe
public class Data {
private int contador = 0;
private int dia, mes, ano;
public Data(){
contador++;
dia = mes = ano = 1;
}
public int exibeContador(){
return contador;
}

...

Exemplo
public class Main {
public static void main(String[] args) {
Data d1 = new Data();
System.out.println(d1.exibeContador());
Data d2 = new Data();
System.out.println(d2.exibeContador());
}
}
No funciona!!

Membros estticos
No funcionou porque contador
uma varivel de objeto
Cada objeto possui um atributo
prprio contador
Para que possamos contar a
quantidade de objetos instanciados,
devemos definir contador como uma
varivel de classe
Para isso, contador deve ser definido
como esttico (static)

Membros estticos
public class Data {
private static int contador = 0;
private int dia, mes, ano;
public Data(){
contador++;
dia = mes = ano = 1;
}
public int exibeContador(){
return contador;
}

...

Membros estticos
public class Main {
public static void main(String[] args) {
Data d1 = new Data();
System.out.println(d1.exibeContador());
Data d2 = new Data();
System.out.println(d2.exibeContador());
}
}

Membros estticos
Um mtodo no esttico pode
acessar um atributo esttico (ex.:
mtodo exibeContador())
Se podemos definir um atributo
esttico, podemos definir tambm
um mtodo esttico

Membros estticos
public class Data {
private static int contador = 0;
private int dia, mes, ano;
public Data(){
contador++;
dia = mes = ano = 1;
}
public static int exibeContador(){
return contador;
}

...

Membros estticos
public class Main {
public static void main(String[] args) {
Data d1 = new Data();
System.out.println(d1.exibeContador());
Data d2 = new Data();
System.out.println(d2.exibeContador());
System.out.println(Data.exibeContador()); // para mtodos estticos,
podemos acessar o mtodo tambm atravs da classe, sem a necessidade
de instanciar um objeto
}
}

Membros estticos
Exemplo de mtodo esttico:

Math.pow

J vimos que um mtodo no esttico


pode acessar um atributo esttico
Porm, um mtodo esttico no pode
acessar um atributo no esttico
Cada objeto da classe possui seu
prprio atributo no esttico
Por isso, esse atributo somente poder
ser utilizado por mtodo no esttico

Membros estticos
public class Data {
private static int contador = 0;
private int dia, mes, ano, hora, minuto, segundo;
public Data(){
contador++;
dia = mes = ano = 1;
}
public static int exibeContador(){
dia = 1; // ERRO!! Mtodo esttico no pode acessar atributo no esttico
return contador;
}

Exerccios
Crie uma classe Produto com as seguintes caractersticas:
Atributos id, nome e preo
Um atributo ultimo_id, que ir armazenar o identificador do ltimo produto criado.
Ao criar um novo produto, atribua o valor deste atributo ao id do objeto criado, e
incremente este contador em seguida. Este atributo dever ser somente de leitura
fora da classe.
Mtodos get e set para acesso aos atributos da classe (para o atributo id, crie
somente o mtodo get. O valor deste atributo ser alterado somente ao se criar um
objeto da classe. Para o mtodo setPreco, valide o valor do preo. Caso seja negativo,
atribua o valor 0 ao mesmo)
Construtor sem parmetros, que atribua o id ao produto criado e que incremente o
ltimo id gerado, e que inicialize o preo do produto com 0 e o seu nome como
Nome no informado
Construtor que receba o nome e preo do produto, e que execute o primeiro para
atribuir o valor do id produto
Mtodo exibe(), que exiba as informaes do produto da seguinte forma:

Produto: nome do produto


Id: identificador do produto
Nome: nome do produto

Mtodo reajustaPreco, que receba um percentual, e que atualize o preo do


produto de acordo com o percentual
Para testar a sua classe, crie dois objetos desta classe. Para a criao desses
objetos, solicite ao usurio que informe o nome e preo do produto. Em seguida,
solicite o valor de reajuste e imprima as informaes do produto, juntamente com a
informao do ltimo id gerado.

Exerccios
Crie uma classe Inteiro para manipulao de valores inteiros. Esta
classe dever possuir os seguintes mtodos:
- int multiplicacao(int a, int b): retorna a multiplicao de a por b (utilize
somente a operao de soma para este clculo)
- int potencia(int a, int b): retorna a elevado a b (utilize o mtodo
multiplicacao para este clculo)
- int divisao(int a, int b): retorna o valor inteiro da diviso de a por b
(utilize somente a operao de subtrao para este clculo)
- int resto(int a, int b): retorna o resto da diviso de a por b (utilize os
mtodos multiplicacao e divisao para este clculo)
- boolean par(int a): retorna true se a for par; e false, caso contrrio
(utilize o mtodo resto para este clculo)
Para testar a sua classe, exiba o seguinte menu para o usurio:
1 Potncia
2 Multiplicao
3 Diviso
3 Resto
4 Par
5 Sair
De acordo com a opo, solicite ao usurio os valores para o clculo

Atributos, mtodos e classes


final
FINAL define atributos ou mtodos que
no podem ser modificados

Atributos final funcionam como constantes


Mtodos final no podem ser redefinidos
pelas classes estendidas

possvel definir uma classe como final

Nenhuma classe poder herdar desta classe

Atributos, mtodos e classes


final
public classTeste{
public final double PI = 3.141592;
...

}
Neste caso, como o atributo PI ser o mesmo para todos os objetos da classe,
podemos declarar o atributo como esttico:
public classTeste{
public statict final double PI = 3.141592;
...

}
}

Atributos, mtodos e classes


final
public class Abastecimento {
// valores constantes
private static final int GASOLINA_COMUM = 0;
private static final int GASOLINA_ESPECIAL = 1;
private static final int ALCOOL = 3;
// valores variveis
private float custoLitro;
private float litros;
private float custo;
...
}
public class ContaCorrente {
private static final double TAXA_JUROS = 5;
...
}

Atributos, mtodos e classes


final
Caso cada objeto possua um valor especfico para o seu atributo final, devemos inicializar o seu
valor em todos os construtores da classe:
public class Incremento {
private static int total = 0;
private final int INC;
public Incremento(int incrementValue){
INC = incrementValue;
System.out.println("O valor do incremento : " + INC);
}
public void addIncToTotal(){
total += INC;
}
public String toString(){
return "Total = " + total;
}
}

Atributos, mtodos e classes


final
Caso cada objeto possua um valor especfico para o seu atributo final, devemos inicializar
o seu valor em todos os construtores da classe:
public static void main(String[] args) {
Incremento inc1 = new Incremento(10);
inc1.addIncToTotal();
Incremento inc2 = new Incremento(20);
inc2.addIncToTotal();
Incremento inc3 = new Incremento(11);
inc3.addIncToTotal();
Incremento inc4 = new Incremento(12);
inc4.addIncToTotal();
System.out.println(inc4); // Total = 53
}
}

Herana
Muitas vezes, classes diferentes tm caractersticas
comuns
Por exemplo:

Imagine uma classe Pessoa com as seguintes caractersticas:

Se imaginarmos uma pessoa fsica, esta possui as seguintes caractersticas:

nome, endereo, telefone

nome, endereo, telefone, CPF, RG

Se imaginarmos uma pessoa jurdica, esta possui as seguintes caractersticas:

nome, endereo, telefone, CNPJ, IE

Ento, ao invs de criarmos uma nova classe para


pessoa fsica e uma nova para pessoa jurdica, com todas
essas caractersticas, podemos usar as caractersticas da
classe Pessoa j existente.

Herana
Herana um dos conceitos fundamentais de POO
Definio

Recurso que permite que novas classes sejam definidas a partir de


uma classe j definida

Na prtica, significa a possibilidade de construir classes


especializadas que herdam as caractersticas de classes
mais generalistas, podendo adicionar novas caractersticas
Permite o reuso do comportamento de uma classe na
definio de outra
Em Java, qualquer classe herda da classe Object

Herana
Implementao

Superclasses (ou ascendente): so as ascendentes


de um classe
Tambm chamada de classe pai (me)

Subclasses (ou descendente): so as descendentes


de um classe
Tambm chamada de classe filho (filha)

Pessoa

superclasse

subclasses

PessoaFisica

PessoaJuridica

Herana em Java
Para que uma classe herde as caractersticas de uma
outra, usamos a palavra reservadaextendslogo aps a
definio do nome da classe:
classNomeDaSubClasseextendsNomeDaSuperClasse
Como estamos tratando de herana de classes, toda classe possui
seu mtodo construtor.
Portanto, se estamos trabalhando com duas classes, temos dois
mtodos construtores. Para acessarmos o mtodo construtor da
classe que est sendo herdada usamos osuper().
Podemos usar osuperpara qualquer construtor da classe pai,
pois o Java consegue diferenciar os construtores por causa
dasobrecarga de mtodos.

Herana Exemplo 1

Herana
public class Eletrodomestico {
private boolean ligado;
private int voltagem;
private int consumo;
public Eletrodomestico(boolean ligado, int voltagem, int consumo) {
this.ligado = ligado;
this.voltagem = voltagem;
this.consumo = consumo;
}
public boolean isLigado() {
return ligado;
}
public void setLigado(boolean ligado) {
this.ligado = ligado;
}
public int getVoltagem() {
return voltagem;
}
public void setVoltagem(int voltagem) {
this.voltagem = voltagem;
}
public int getConsumo() {
return consumo;
}
public void setConsumo(int consumo) {
this.consumo = consumo;
}
}
Fonte: http://www.tiexpert.net/programacao/java/heranca.php

Herana
public class TV extends EletroDomestico {
private int canal;
private int volume;
private int tamanho;
public TV(int voltagem, int consumo, int canal, int volume, int tamanho) {
super(false, voltagem, consumo);
this.canal = canal;
this.volume = volume;
this.tamanho = tamanho;
}
public int getCanal() {
return canal;
}
public void setCanal(int canal) {
this.canal = canal;
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) {
this.volume = volume;
}
public int getTamanho() {
return tamanho;
}
public void setTamanho(int tamanho) {
this.tamanho = tamanho;
}

public String mostrarCaracteristicas() {


String result = "Esta TV tem as seguintes
caractersticas:\n"
+ "Tamanho: " + getTamanho()
+ "\"\n" + "Voltagem Atual: "
+ getVoltagem() + "V\n" +
"Consumo/h: " + getConsumo()
+ "W\n";
if (isLigado())
result += "Ligado: Sim\n" +
"Canal: " + getCanal()
+
"\n" + "Volume: " + getVolume()+"\n";
else
result += "Ligado: No\n";
return result;
}
}

Herana
public class Main {
public static void main(String[] args) {
TV tv1 = new TV(110, 95, 0, 0, 21);
TV tv2 = new TV(220, 127, 0, 0, 29);
tv2.setLigado(true);
tv2.setCanal(3);
tv2.setVolume(25);
System.out.println(tv1.mostrarCaracteristicas());
System.out.println(tv2.mostrarCaracteristicas());
}
}

Herana Exemplo 2
Exemplo 2

Fonte: http://terramel.org/java-quarta-aula-heranca/

Herana Exemplo 2

Herana
public class Pessoa {
private String nome;
private String telefone;
private String endereco;
public Pessoa() {
nome = "";
telefone = "";
endereco = "";
}
public Pessoa(String nome, String telefone, String endereco) {
this.nome = nome;
this.telefone = telefone;
this.endereco = endereco;
}
}

Herana
public class PF extends Pessoa {
private String RG;
private String CPF;
public PF() {
super();
RG = "";
CPF = "";
}
public PF(String nome, String telefone, String endereco, String RG, String CPF) {
super (nome, telefone, endereco);
this.RG = RG;
this.CPF = CPF;
}
}

Herana
public class Amigo extends PF {
private String blog;
public Amigo() {
super();
blog = "";
}
public Amigo(String nome, String telefone, String endereco, String RG, String CPF,
String blog) {
super(nome,telefone,endereco,RG,CPF);
this.blog = blog;
}
}

Herana
public class Parente extends PF {
private String email;
public Parente() {
super();
email = "";
}
public Parente(String nome, String telefone, String endereco, String RG, String
CPF, String email) {
super(nome,telefone,endereco,RG,CPF);
this.email = email;
}
}

Herana
public class PJ extends Pessoa {
private String CNPJ;
private String IE;
public PJ() {
super();
CNPJ = "";
IE = "";
}
public PJ(String nome, String telefone, String endereco, String CNPJ, String IE) {
super (nome, telefone, endereco);
this.CNPJ = CNPJ;
this.IE = IE;
}
}

Herana
opcao =
Integer.parseInt(JOptionPane.showInputDialog("Digite a
opo:\n\n1. Amigos\n2. Parentes"));
if (opcao == 1) {
String blog = JOptionPane.showInputDialog("Digite o
blog");

import javax.swing.JOptionPane; //import necessrio para usar o JOptionPane


public class CadastraPessoa {
public static void main(String[] args) {
Pessoa objPessoa = new Pessoa(); //Declarao e instanciao do objeto
da classe Pessoa.

Amigo objAmigo = new


Amigo(nome,telefone,endereco,RG,CPF,blog);
}
if (opcao == 2) {
String email = JOptionPane.showInputDialog("Digite o email");
Parente objParente = new
Parente(nome,telefone,endereco,RG,CPF,email);
}
}

int opcao = Integer.parseInt(JOptionPane.showInputDialog("Digite a opo:


\n\n1. Pessoa fsica\n2. Pessoa Jurdica"));
String nome = JOptionPane.showInputDialog("Digite o nome");
String telefone = JOptionPane.showInputDialog("Digite o telefone");
String endereco = JOptionPane.showInputDialog("Digite o endereo");
if (opcao == 1) {
PF objPF = new PF();
String RG = JOptionPane.showInputDialog("Digite o RG");
String CPF = JOptionPane.showInputDialog("Digite o CPF");

if (opcao == 2) {
String CNPJ = JOptionPane.showInputDialog("Digite o CNPJ");
String IE = JOptionPane.showInputDialog("Digite a Inscrio
Estadual");
PJ objPJ = new PJ(nome,telefone,endereco,CNPJ,IE);
}
}
}

Construo de Objetos
Derivados
Processo de execuo dos mtodos construtores
envolvendo herana:

Durante a construo de um objeto de uma classe derivada, o


construtor de sua superclasse executado (implicitamente ou
explicitamente) antes de executar o corpo de seu construtor.
Assim, ao se construir um objeto de uma classe derivada, o
mtodo construtor da superclasse ser inicialmente invocado.
Este por sua vez, invocar o construtor de sua superclasse, at
que o construtor da classe raiz de toda a hierarquia de objetos
- a classe Object - seja invocado.
Como Object no possui uma superclasse, seu construtor
executado e a execuo retorna para o construtor de sua
classe derivada.

Construo de Objetos
Derivados
public class Pessoa {
private int idade;
private String nome;
public Pessoa(){
idade = 0;
nome = "";
}

Implicitamente, o construtor
Object() executado.

public Pessoa(int idade, String nome){


this.idade = idade;
this.nome = nome;
}
}

Implicitamente, o construtor
Object() executado.

Construo de Objetos
Derivados
public class Funcionario extends Pessoa{
private double salario;
public Funcionario(){
this.salario = 0;
}

Implicitamente, o construtor
Pessoa() executado. Se o construtor
Pessoa() no existir, ERRO!!
public Funcionario(int idade, String nome, double salario){
super(idade, nome);
this.salario = salario;
}
}

O construtor Pessoa(int, String)


executado explicitamente.

Construo de Objetos
Derivados
Observao:

Quando no especificamos nenhum


construtor, a linguagem Java declara,
implicitamente, um construtor
padro, vazio, que no recebe
parmetros.
Se declararmos algum construtor,
esse construtor padro no ser
mais declarado.

Construo de Objetos
Derivados
public class Main {
public static void main(String[] args) {

Funcionario()

Funcionario f1 = new Funcionario();

Pessoa()
Object()

Funcionario f2 = new Funcionario(30,


"Alexandre", 1000);
}
}

Funcionario(int, String,
double)
Pessoa(int, String)
Object()

Classe Object
Object uma classe em Java da
qual todas as outras derivam
Quando uma classe criada e
no h nenhuma referncia a sua
superclasse, implicitamente a
classe criada derivada
diretamente da classe Object.

Classe Object
Todos os objetos podem invocar os mtodos da
classe Object.
Object
Alguns mtodos da classe Object:

boolean equals (Object obj)


Testa se os objetos so iguais

Class getClass ()
Retorna a classe do objeto.

Object clone ()
copia o contedo de um objeto para outro.

String toString()
Retorna um texto descritivo do objeto

Classe Object
public class Retangulo {
private float altura, largura;
public Retangulo(float altura, float largura){
this.altura = altura; this.largura = largura;
}
public float calculaArea(){
return altura * largura;
}
public float calculaPerimetro(){
return 2 * altura + 2 * largura;
}
public String exibe(){
return "Altura: " + altura +
"\nLargura: " + largura +
"\nArea: " + calculaArea() +
"\nPerimetro: " + calculaPerimetro();
}
}

public class Main {


public static void main(String[] args) {

Retangulo r1 = new Retangulo(10, 20);


System.out.println(r1.exibe());
}

Altura: 10.0
Largura: 20.0
Area: 200.0
Perimetro: 60.0

Classe Object
public class Retangulo {
private float altura, largura;
public Retangulo(float altura, float largura){
this.altura = altura; this.largura = largura;
}
public float calculaArea(){
return altura * largura;
}
public float calculaPerimetro(){
return 2 * altura + 2 * largura;
}
public String toString(){
return "Altura: " + altura +
"\nLargura: " + largura +
"\nArea: " + calculaArea() +
"\nPerimetro: " + calculaPerimetro();
}
}

public class Main {


public static void main(String[] args) {

Retangulo r1 = new Retangulo(10, 20);


System.out.println(r1);
}

Altura: 10.0
Largura: 20.0
Area: 200.0
Perimetro: 60.0

Exerccio 1
Crie um novo projeto, e copie as implementaes das
classes Pessoa, PF, PJ, Amigos e Parentes para o
mesmo
Copie tambm a classe que testa a implementao
destas classes
Implemente, para as classes Pessoa, PF, PJ, Amigos
e Parentes, um mtodo exibe() que retorne todas
as informaes de cada classe
Nas classes herdadas, execute o mtodo exibe() da
classe ancestral para retornar suas informaes, e em
seguida retorne as informaes da classe herdada
concatenada com as informaes da classe base.

Exerccio 2
Desenvolva uma classe chamada Pessoa com os seguintes atributos: nome,
idade, altura e peso.
Considere, como subclasse da classe Pessoa, a classe Empregado. Considere
que cada instncia da classe Empregado tem, para alm dos atributos que
caracterizam a classe Pessoa, os atributos numeroSecao,
salarioBase(vencimento base) e INSS (percentagem a ser retida do salrio para
pagar o INSS). Implemente a classe Empregado com um mtodo calcularSalario.
Considere, como subclasse da classe Pessoa a classe Cliente. Considere que
cada instncia da classe Cliente tem, para alm dos atributos que caracterizam
a classe Pessoa, os atributos credMax (correspondente ao crdito mximo
concedido ao cliente) e valorEmDivida. Implemente na classe Cliente um
mtodo obterSaldo que devolve a diferena entre os valores dos atributos
credMax e valorEmDivida.

Exerccios
Implemente a classe Administrador como subclasse da classe Empregado. Um determinado administrador tem
como atributos, para alm dos atributos da classe Pessoa e da classe Empregado, o atributo ajudaDeCusto
(ajudas referentes a viagens, estadias, ...). Note que dever redefinir na classe Administrador o mtodo herdado
calcularSalario (o salrio de um administrador equivalente ao salrio de um empregado usual acrescido das
ajudas de custo).
Implemente a classe Operario como subclasse da classe Empregado. Um determinado operrio tem como
atributos, para alm dos atributos da classe Pessoa e da classe Empregado, o atributo valorProducao (que
corresponde ao valor monetrio dos artigos efetivamente produzidos pelo operrio) e comisso (que corresponde
percentagem do valorProducao que ser adicionado ao salrio base do operrio). Note que dever redefinir
nesta subclasse o mtodo herdado calcularSalario (o salrio de um operrio equivalente ao salrio de um
empregado usual acrescido da referida comisso).

Exerccios
Implemente a classe Vendedor como subclasse da classe Empregado. Um determinado
vendedor tem como atributos, para alm dos atributos da classe Pessoa e da classe Empregado,
o atributo valorVendas (correspondente ao valor monetrio dos artigos vendidos) e o atributo
comisso (percentagem do valorVendas que ser adicionado ao salarioBase do Vendedor). Note
que dever redefinir nesta subclasse o mtodo herdado calcularSalario (o salrio de um
vendedor equivalente ao salrio de um empregado usual acrescido da referida comisso).
Para cada uma das classes implementadas, crie tambm um mtodo get e set para seus
atributos, bem como um mtodo que retorne as informaes da classe.
Escreva um programa de teste adequado para as classes implementadas.

Polimorfismo
Do grego poli + morphos = mltiplas
formas
Em termos de programao, significa que
um nico nome de classe ou de mtodo
pode ser usado para representar
comportamentos diferentes
A deciso sobre qual comportamento
utilizar tomada em tempo de execuo.

Polimorfismo
Clientes podem ser implementados
genericamente para chamar uma operao
de um objeto sem saber o tipo do objeto.
Se so criados novos objetos que suportam
uma mesma operao, o cliente no precisa
ser modificado para suportar o novo objeto.
O polimorfismo torna a programao
orientada por objetos eficaz, permitindo a
escrita de cdigo genrico, fcil de manter e
de estender.

Polimorfismo
Exemplos

Mtodos com a mesma assinatura podem


ser implementados de formas distintas
(sobrecarga - overloading). Dependendo do
contexto, determinado mtodo ser
executado
Sobrescrita (overriding) de mtodos em
uma hierarquia de classes
O uso de interfaces tambm permite que
um mtodo seja definido em diferentes
contextos

Polimorfismo
public class Empregado {
private String nome;
private double salario;
private int anoContratacao;
public final int ANO_BASE = 2010;
public Empregado(String nome, double salario, int anoContratacao){
this.nome = nome;
this.salario = salario;
this.anoContratacao = anoContratacao;
}
public void ReajustaSalario(double porcentagem){
setSalario(getSalario() + (porcentagem / 100 * getSalario()));
}
public String toString(){
return "\n" + nome + " - " + getSalario() + " - " + getAnoContratacao();
}

...
}

Polimorfismo
public class Gerente extends Empregado {
private String nomeSecretaria;
public Gerente(String nome, double salario, int anoContratacao){
super(nome, salario, anoContratacao);
nomeSecretaria = "";
}
public void ReajustaSalario(double porcentagem){
// Adiciona 1% de bnus para cada ano de servico
double bonus = (ANO_BASE - getAnoContratacao());
super.ReajustaSalario(porcentagem + bonus);
}
...
}

Polimorfismo
public class GerenteTeste {
public static void main(String[] args) {
Gerente chefe = new Gerente("Joo da Silva", 3000, 2005);
chefe.setNomeSecretaria("Maria");
Empregado emps[] = new Empregado[4];
emps[0] = chefe;
emps[1] = new Empregado("Jose da Slva", 1000, 2000);
emps[2] = new Empregado("Maria dos Santos", 1550, 2001);
emps[3] = new Empregado("Antonio Pereira", 2000, 2004);
for (int i = 0; i < 4; i++){
emps[i].ReajustaSalario(10);
System.out.println(emps[i]);
}
}

POLIMORFISMO!

Polimorfismo
Polimorfismo no exemplo anterior
O objeto emps do tipo Empregado[]. Portanto,
uma posio do vetor pode receber um objeto do
tipo Empregado ou do tipo Gerente (ou do tipo de
qualquer subclasse de Empregado que venha existir)
O mtodo reajustaSalario() existe tanto na classe
Empregado quanto na classe Gerente. No cdigo

for (int i = 0; i < 4; i++){


emps[i].reajustaSalario(10);

O compilador executa o cdigo de reajustaSalario()


da classe Empregado se o objeto da posio emps[i]
for do tipo Empregado, ou o cdigo da classe
Gerente se o objeto emps[i] for do tipo Gerente

Polimorfismo
Se no houvesse polimorfismo:
O vetor emps s receberia objetos do tipo Empregado e
portanto, em tempo de compilao, j se saberia qual
cdigo de reajustaSalario() seria executado. A classe
GerenteTeste mudaria para:

...
emps[0] = new Empregado("Jose da Slva", 1000, 2000);
emps[1] = new Empregado("Maria dos Santos", 1550, 2001);
emps[2] = new Empregado("Antonio Pereira", 2000, 2004);
for (int i = 0; i < 3; i++){
emps[i].reajustaSalario(10);
System.out.println(emps[i]);
}
chefe.reajustaSalario(10);
System.out.println(chefe);

Polimorfismo
public class Empresa {
private static final int MAX_EMPS = 1000;
private int numEmps;

public void reajustaSalarios(double


perc) {
for (int i=0; i<numEmps; i++)
emps[i].reajustaSalario(perc);
}

private Empregado[] emps;


public Empresa(){
emps = new Empregado[MAX_EMPS];
numEmps = 0; // nmero de empregados na lista
}
public void adicionaEmpregado (Empregado emp) {
if (numEmps == MAX_EMPS)
return; // lista cheia
emps[numEmps] = emp;
numEmps++;
}

public String mostrEmpregados(){


String result = "\n";
for (int i = 0; i < numEmps; i++)
result = result + emps[i];
return result;
}
}

Polimorfismo
Polimorfismo no exemplo anterior
Com o uso de polimorfismo, o cdigo da classe
Empresa genrico:

O mtodo adicionaEmpregado() pode receber como

parmetro tanto um objeto do tipo Empregado quanto do


tipo Gerente e adicion-lo lista emps que do tipo
Empregado[].
O mtodo reajustaSalarios() chama o mtodo
reajustaSalario() da classe Empregado ou da classe
Gerente dependendo do tipo do objeto na posio emps[i].
Se for criada uma nova subclasse de Empregado, por
exemplo, a classe Diretor, o cdigo da classe Empresa no
precisaria ser modificado para inserir e reajustar salrios
dos objetos do tipo Diretor.

Polimorfismo
Se no houvesse polimorfismo, a classe Empresa seria
algo do tipo:
public class Empresa {
private Empregado[] emps = new Empregado[1000];
private Gerente[] gers = new Gerente[50];
...
public void adicionaEmpregado (Empregado emp) { . . . }
public void adicionaGerente (Gerente ger) { . . . }
public void reajustaSalariosEmps(double perc) { . . . }
public void reajustaSalariosGers(double perc) { . . . }

Se fosse criada a classe Diretor, a classe Empresa


tambm deveria ser alterada, incluindo uma lista de
diretores e mtodos para adicionar e reajustar salrios de
diretores.

Exerccio
Altere a classe principal do projeto da
hierarquia de classes de
pessoas(Pessoa, PF, PJ, Amigos e
Parentes) para passar a utilizar os
conceitos de polimorfismo

Classes abstratas
Classe Abstrata uma classe que no pode ser
instanciada, ou seja, no se pode criar objetos
diretamente de uma classe abstrata.
abstract public class Exemplo {
public static void main (String[] args) {
Exemplo obj = new Exemplo();
// ERRO
}
}

abstract a palavra-chave em Java que indica que


uma classe ou um mtodo no possui definio
concreta.
Classes abstratas servem como modelo para classes
concretas (classes que comumente usamos)

Classes abstratas

Classes abstratas devem possuir pelo


menos uma subclasse para serem utilizveis.
No exemplo acima, FormaGeometrica uma
classe abstrata. Todos os objetos ou so
crculos ou tringulos
No existem instncias diretas de
FormaGeometrica.

Classes abstratas
Um mtodo abstrato cria apenas uma
declarao de um mtodo que dever ser
implementado em uma classe derivada
um mtodo que s faz sentido para as
subclasses

Exemplo, o mtodo obtemArea() da classe


FormaGeometrica um mtodo abstrato.
S faz sentido obter rea de uma forma
geomtrica concreta como um crculo ou um
tringulo.

Classes abstratas
Uma classe abstrata pode conter ou
no mtodos abstratos
Classe com pelo menos um mtodo
abstrato uma classe abstrata.
Uma subclasse de uma classe abstrata
permanece abstrata, mesmo no sendo
declarada explicitamente, at que
redefina e implemente todos os
mtodos abstratos.

Classes abstratas Exemplo


1

Classes abstratas
abstract public class FormaGeometrica {
abstract public double obtemArea();
}
public class Circulo extends FormaGeometrica {
private double raio;
...
public double obtemArea() {
return Math.PI * Math.pow(raio,2);
}}
public class Triangulo extends FormaGeometrica {
private double base, altura;
...
public double obtemArea() {
return (base * altura)/2;
}}

Classes abstratas Exemplo 2

Classes abstratas Exemplo 2


// mtodos concretos
/*
* Uma classe abstrata pode possuir mtodos
no abstratos
*/
public void setVoltagem(int voltagem) {
this.voltagem = voltagem;
}

public abstract class Eletrodomestico {


private boolean ligado;
private int voltagem;
public abstract void ligar();
public abstract void desligar();
// mtodo construtor //
/*
* Classes Abstratas tambm podem ter
mtodos construtores,
* porm, no podem ser usados para
instanciar um objeto diretamente
*/
public Eletrodomestico(boolean ligado, int
voltagem) {
this.ligado = ligado;
this.voltagem = voltagem;
}

public int getVoltagem() {


return this.voltagem;
}
public void setLigado(boolean ligado) {
this.ligado = ligado;
}
public boolean isLigado() {
return ligado;
}
}

Fonte: http://www.tiexpert.net/programacao/java/classes-abstratas.ph

Classes abstratas Exemplo 2


public class TV extends Eletrodomestico {
private int tamanho;
private int canal;
private int volume;
public TV(int tamanho, int voltagem) {
super (false, voltagem); // construtor classe abstrata
this.tamanho = tamanho;
this.canal = 0;
this.volume = 0;
}
/* implementao dos mtodos abstratos */
public void desligar() {
super.setLigado(false);
setCanal(0);
setVolume(0);
}
public void ligar() {
super.setLigado(true);
setCanal(3);
setVolume(25);
}
// abaixo teramos todos os mtodos construtores get e set...

Fonte: http://www.tiexpert.net/programacao/java/classes-abstratas.ph

Classes abstratas Exemplo 2


public class Radio extends Eletrodomestico {
public static final short AM = 1;
public static final short FM = 2;
private int banda;
private float sintonia;
private int volume;
public Radio(int voltagem) {
super(false, voltagem);
setBanda(Radio.FM);
setSintonia(0);
setVolume(0);
}
/* implementao dos mtodos abstratos */
public void desligar() {
super.setLigado(false);
setSintonia(0);
setVolume(0);
}
public void ligar() {
super.setLigado(true);
setSintonia(88.1f);
setVolume(25);
}
// abaixo teramos todos os mtodos construtores get e set...

Fonte: http://www.tiexpert.net/programacao/java/classes-abstratas.ph

Classes abstratas Exemplo 2


public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
TV tv1 = new TV(29, 110);
Radio radio1 = new Radio(110);
/*
* chamando os mtodos abstratos implementados
* dentro de cada classe (TV e Radio)
*/
tv1.ligar();
radio1.ligar();
System.out.print("Neste momento a TV est ");
if (tv1.isLigado())
System.out.println("ligada" );
else
System.out.println("desligada" );
System.out.print("e o Rdio est ");
if (radio1.isLigado())
System.out.println("ligado.");
else
System.out.println("desligado.");
}
}

Fonte: http://www.tiexpert.net/programacao/java/classes-abstratas.ph

Exerccio
Nos slides 52 e 53, altere as definies das classes
Pessoa e PF, de forma que as mesmas sejam abstratas
Corrija a classe CadastraPessoa (slide 57) do projeto de
forma que o mesmo compile sem erros
Crie um mtodo toString para cada uma dessas classes,
para retornar os dados referentes a cada uma das classes
Na classe CadastraPessoa, aps instanciar os objetos,
exiba as informaes dos objetos utilizando o mtodo
toString implementado (utilize o mtodo
JOptionPane.showMessageDialog(null, Mensagem) para
tal)

Das könnte Ihnen auch gefallen