orientação a objetos usando java

57
Orientação a Objetos usando Java Orientação a Objetos usando Java Patricia A. Jaques Contribuições: Luiz Gonzaga Jr

Upload: kristian-vidar

Post on 30-Dec-2015

55 views

Category:

Documents


1 download

DESCRIPTION

Orientação a Objetos usando Java. Patricia A. Jaques Contribuições: Luiz Gonzaga Jr. Classes e Objetos. - PowerPoint PPT Presentation

TRANSCRIPT

Orientação a Objetos usando JavaOrientação a Objetos usando Java

Patricia A. Jaques

Contribuições: Luiz Gonzaga Jr

Classes e ObjetosClasses e Objetos

• Para entendermos os conceitos de orientação a objetos é necessário entendermos o que é um objeto. Por exemplo, consideremos objetos do mundo real: seu cachorro, seu computador, sua bicicleta.

• Os objetos do mundo real tem duas características: eles tem estado e comportamento. Por exemplo, cachorros tem estados (nome, cor, tamanho) e comportamentos (latir, andar, correr).

• Objetos de software, assim como, objetos do mundo real possuem estado (variáveis) e comportamento (métodos). Podemos representar objetos do mundo real através de objetos de software (por exemplo, um livro), assim como, também podemos modelar conceitos abstratos (por exemplo, uma ação do usuário em uma interface gráfica).

• Classes: descrevem as informações armazenadas e os serviços providos por um objeto– especificação de objetos

• Objetos: cada uma das instâncias de uma classe. – Por exemplo: cada uma das contas vai ser um objeto

– existe apenas em tempo de execução?!

Correntista

#Nome:string#Saldo: float

+verificaSaldo ( );+depositaValor ( );+retiraValor ( );

Definindo uma classe em JavaDefinindo uma classe em Java

class ContaCorrente{ }

class ContaCorrente{ }

Definindo uma classe em JavaDefinindo uma classe em Java

class ContaCorrente{ static float montanteTotal; float saldo; String nome;

// Definição dos métodos

}

class ContaCorrente{ static float montanteTotal; float saldo; String nome;

// Definição dos métodos

}

Variáveis de Instância

Variável de Classe

Variáveis: definem o comportamento estático do objeto.

Definindo uma classe em JavaDefinindo uma classe em Java

Classe ContaCorrente

montanteTotal: 600

Maria

100

João

200

Joana

300

Definindo uma classe em JavaDefinindo uma classe em Java

• Métodos: definem os serviços que podem ser solicitados a uma instância (objeto), ou seja, o comportamento dinâmico de um objeto.

• Por exemplo, na classe ContaCorrente podem ser definidos os métodos:

verificaSaldo: retorna o saldo da conta corrente;

depositaValor: deposita um valor especificado x na conta;

retiraValor: retira um valor especificado x da conta;

• Os métodos determinam o comportamento dos objetos de uma classe.

• Quando um método é invocado, se diz que o objeto está recebendo uma mensagem (para executar uma ação).

• No jargão da OO, um objeto chamar um método de outro é:– um objeto cliente enviar uma mensagem a um objeto

servidor.

• Um objeto pode nunca manipular os dados internos de outros objetos.– A manipulação pode ocorrer através de chamada de

métodos do objeto que está tendo os valores de seus dados modificados.

Definição de MétodosDefinição de Métodos

<modificador> <tipo de retorno> <nome> (lista de argumentos)

{

<bloco de código>

}

Mutator Methods

public void setData (int d, int m, int a) { ... }

Acessor Methods

public int getDay () { ...}

public void exibeData ( )

{

System.out.println (d+”/”+m+”/”+a);

}

Definindo uma classe em JavaDefinindo uma classe em Java

class ContaCorrente{ static float montanteTotal; float saldo; String nome; float verificaSaldo ( ) { return saldo; } void depositaValor (float valor) { saldo = saldo + valor; montanteTotal += valor; } void retiraValor (float valor) { if (saldo>=valor) { saldo = saldo – valor; montanteTotal -= valor; } } }

Criando um objetoCriando um objeto

• Objeto é uma instância de uma classe;

• Usamos o operador new para criar um objeto.

ContaCorrente minhaConta;minhaConta = new ContaCorrente ( );

ContaCorrente minhaConta;minhaConta = new ContaCorrente ( );

Variável que conterá umareferência a um objeto

Criação do objeto

ContaCorrente minhaConta = new ContaCorrente ( );

Acessando variáveis e métodos de um objetoAcessando variáveis e métodos de um objetoOperador ponto (.)Operador ponto (.)

class AcessaContaCorrente { public static void main (String args [ ]) {

ContaCorrente minhaConta = new ContaCorrente ( ); minhaConta.nome = “Maria”; float saldo; saldo = minhaConta.verificaSaldo ( );

minhaConta.depositaValor (200); saldo = minhaConta.verificaSaldo ( );

ContaCorrente outraConta = new ContaCorrente ( ); outraConta.nome = “Joao”; saldo = outraConta.verificaSaldo ( ); } }

Nome: MariaSaldo: 0 Saldo: 200

Nome: JoaoSaldo: 0

Exercício 1 – Criando Objeto ContaCorrenteExercício 1 – Criando Objeto ContaCorrente

• Implemente a classe ContaCorrente da seção 3.1.2• Implemente um método print() que exiba na tela os

dados do dono da conta corrente.• Crie uma outra classse que se chama

AcessaContaJoao– No método main(), crie uma conta para o “João da Silva”

com saldo = 1000.– Exiba os dados da conta chamando o método print( ).– Faça um saque de 135.– Exiba novamente os dados.

Método ConstrutorMétodo Construtor

• Método que é automaticamente executado ao ser criado o objeto;

• É usado para inicialização de variáveis ou para a chamada de outros métodos;

• Os métodos construtores tem o mesmo nome que a classe;

• Não é obrigatório criar um construtor. Caso não exista a declaração de um construtor, o compilador gera automaticamente um construtor default.

• Pode haver mais de um método construtor mas eles tem que ter número de parâmetros diferentes ou tipos de parâmetros diferentes.

Método ConstrutorMétodo Construtor

class ContaCorrente{ static float montanteTotal; float saldo; String nome; public ContaCorrente (String nomeDono) { nome = nomeDono; saldo = 0; } float verificaSaldo ( ) { return saldo; } // restante do código}

Acessando variáveis e métodos de um objetoAcessando variáveis e métodos de um objetoOperador ponto (.)Operador ponto (.)

class AcessaContaCorrente { public static void main (String args [ ]) {

ContaCorrente minhaConta = new ContaCorrente (“Maria”); minhaConta.nome = “Maria”; float saldo; saldo = minhaConta.verificaSaldo ( );

minhaConta.depositaValor (200); saldo = minhaConta.verificaSaldo ( );

ContaCorrente outraConta = new ContaCorrente (“Joao”); outraConta.nome = “Joao”; saldo = outraConta.verificaSaldo ( ); } }

Nome: MariaSaldo: 0 Saldo: 200

Nome: JoaoSaldo: 0

Operador thisOperador this

• Java inclui um valor de referência especial, chamado this, que é usado dentro de qualquer método para referir-se ao objeto corrente.

• O valor de this refere-se ao objeto do qual o método corrente foi chamado.

Operador thisOperador this

class TestaThis{

int var1 = 4;public void metodo (){

int var1 = 8;System.out.println

(var1);}

}

class TestaThis{

int var1 = 4;public void metodo

(){

int var1 = 8;

System.out.println (this.var1);

}}

var1=8; var1=4;

Operador thisOperador this

class ContaCorrente{ static float montanteTotal; float saldo; String nome;

public ContaCorrente (String nome) { this.nome = nome; saldo = 0; }... // restante do código

}

EstruturaEstrutura

{

}

class ContaCorrente

static float montanteTotal; float saldo; String nome;public ContaCorrente (String nome){ this.nome = nome; saldo = 0;} public static void main (String args [ ])

{ ContaCorrente minhaConta = new ContaCorrente ("Maria"); minhaConta.depositaValor (200); float saldo = minhaConta.verificaSaldo ( ); System.out.println (saldo);}

float verificaSaldo ( ){ return saldo;}void depositaValor (float valor){ saldo = saldo + valor; montanteTotal += valor;}

void retiraValor (float valor){ if (saldo>=valor) { saldo = saldo – valor; montanteTotal -= valor; }}

Variáveis membro

MétodoConstrutor

Métodos

Método Main

Exercício 2 – Classe PessoaExercício 2 – Classe Pessoa

• Implemente a classe Pessoa• Uma pessoa possui:

– um nome;– uma data de nascimento;– um endereço;– implemente o método print ( ) : exibe na tela os dados da

Pessoa.

• No método public static void main :– crie dois objetos do tipo Pessoa: um que represente você e

outro que represente o colega do lado.

Sobrecarga de MétodosSobrecarga de Métodos

• É possível criar métodos com mesmo nome, mas lista de parâmetros diferentes.

• Isto é chamado de sobrecarga de métodos (ou overloading).

• É reconhecido em tempo de compilação. • É devido a esta propriedade que podemos ter dois

métodos construtores com parâmetros diferentes.

Sobrecarga de MétodosSobrecarga de Métodos

class ContaCorrente{ static float montanteTotal; float saldo; String nome; public ContaCorrente (String nome) { this.nome = nome; saldo = 0; } public ContaCorrente (String nome, float

saldo) { this.nome = nome; this.saldo = saldo; }... // restante do código

}

class ContaCorrente{ static float montanteTotal; float saldo; String nome; public ContaCorrente (String nome) { this.nome = nome; saldo = 0; } public ContaCorrente (String nome, float

saldo) { this.nome = nome; this.saldo = saldo; }... // restante do código

}

Exercício 2 – Classe PessoaExercício 2 – Classe Pessoa

• Na classe Pessoa• Crie um método construtor que crie um objeto

Pessoa recebendo como parâmetro o nome da Pessoa e outro que não receba nada como parâmetro.

• No método public static void main :– crie dois objetos do tipo Pessoa: – um que represente você, não passando nada para o método

construtor;– outro que represente o colega do lado: passando o nome do

colega como parâmetro.

Passagem de Parâmetros por ValorPassagem de Parâmetros por Valor

• Passagem de Argumentos para Métodos em Java:– Java passa somente argumentos por Valor– O argumento passado para outro método não

pode ser alterado• Não há passagem de argumentos por referência

– Se um argumento passado for um objeto (instância de uma classe):

• as variáveis membros deste objeto poderão ser alteradas;

• Mas a referência do próprio objeto não pode ser alterada.

Passagem de Parâmetros por ValorPassagem de Parâmetros por Valor

class TestaPassagemParametros{public static void trocaValorPrimitivo (int num){

num = num +6;}public static void trocaValorObjeto (ContaCorrente c) {

c.saldo = 300;}public static void trocaReferenciaObjeto (ContaCorrente c){

c = new ContaCorrente ("Mulher Maravilha", 200);}

public static void main (String args [ ]) {

int val = 11;trocaValorPrimitivo (val);System.out.println ("val = "+val);

ContaCorrente minhaConta = new ContaCorrente ("SuperHomem");

System.out.println (minhaConta.saldo);

trocaValorObjeto (minhaConta);System.out.println (minhaConta.saldo);

trocaReferenciaObjeto (minhaConta);System.out.println (minhaConta.nome);

} }

val=11

saldo=0

saldo=300

nome=SuperHomem

ExercicioExercicio

• Implemente o exercício anterior, porém tentando passar como parâmetro para um novo método uma String.

• Neste método faça a variável String receber a referência para um outro parâmetro.

public static void trocaReferenciaString (String str){

str = “azul”;

}

O que acontece?

Por quê?

Modificadores de AcessoModificadores de Acesso

Modificador Visibilidade

private Podem ser acessados somente por métodos damesma classe.

semmodificador

Por qualquer classe do mesmo pacote(inclusive subclasses).

protected Por qualquer classe do mesmo pacote e pelassubclasses (que podem estar no mesmo pacoteou em outro pacote).

public Podem ser acessados de qualquer classe.

class ContaCorrente{ private static float

montanteTotal; private float saldo; private String nome; public ContaCorrente (String

nomeDono) { nome = nomeDono; saldo = 0; } public float verificaSaldo ( ) { return saldo; }

public void depositaValor (float valor){ saldo = saldo + valor; montanteTotal += valor;}

public void retiraValor (float valor){ if (saldo >= valor) saldo = saldo – valor; montanteTotal -= valor;}public static float obtemTotalBanco ( ){ return montanteTotal;}

}

EncapsulamentoEncapsulamento

EncapsulamentoEncapsulamento

• Vantagem: Quando alterar os tipos dos dados de uma classe não é necessário alterar as classes que acessam essa classe.

class Pessoa {

public String nome;

}

class AcessaPessoa {

public static void main (String args [ ]) {

Pessoa p = new Pessoa ( );

p.nome = "Patty";

}

}

public String data;

p.data = "4/4/1976";

class Pessoa {

public String nome;

}

class AcessaPessoa {

public static void main (String args [ ]) {

Pessoa p = new Pessoa ( );

p.nome = "Patty";

}

}

public int dia;public int mes;public int ano;

p.dia = 4;p.mes = 4;p.ano = 4;

class Pessoa {private String nome;private String data;

public setNome (String nome) {this.nome = nome;

}public setData (String data) {

this.data = data;}public String getNome () {

return nome;}public String getData () {

return data;}

}

class AcessaPessoa { public static void main (String args [ ]) { Pessoa p = new Pessoa ( ); p.setNome ("Joao"); p.setData ("3/4/1967"); }}

class Pessoa {private String nome;private int dia;private int mes;private int ano;

public setNome (String nome) {this.nome = nome;

}public setData (String data) {

int v [] = separaData (data);dia = v[0];mes = v[1];ano = v[2];

}public String getNome () {

return nome;}public String getData () {

String data = dia + "/" + mes + "/" + ano;return data;

}}

class AcessaPessoa { public static void main (String args [ ]) { Pessoa p = new Pessoa ( ); p.setNome ("Joao"); p.setData ("3/4/1967"); }}

Exercício 3 - EncapsulamentoExercício 3 - Encapsulamento

• Agora que você aprendeu o conceito de encapsulamento, encapsule os atributos da classe Pessoa:– Os dados são private e seus valores podem ser acessados e

modificado pelos métodos mutator (set...) e acessor (get...);

HerançaHerança

• Chamamos de herança quando novas classes herdam propriedades (dados e métodos) de outras classes existentes.

• Esse é um importante recurso da orientação a objetos que permite a reutilização de código.

• As classes que herdam as propriedades são chamadas subclasses;

• A classe pai é chamada superclasse.

class Ponto {int x, y;

public Ponto (int x, int y) { this.x = x; this.y = y;}

public Ponto ( ) { this (-1, -1); // o this também pode ser usado para

chamar // construtores

}

public void print ( ) { System.out.print (“\n”+x +", "+ y);

}}

class Ponto3D extends Ponto {

int z;

public Ponto3D (int x, int y, int z) {

this.x = x;

this.y = y;

this.z = z;

}

public Ponto3D ( ) {

this (-1, -1, -1);

}

}

Código igual na classe pai e filhosuper (x, y);Chamando construtor

da classe pai

supersuper

class Ponto3D extends Ponto {int z;public Ponto3D (int x, int y, int z) { super (x, y); // chama o construtor Ponto (x, y)

this.z = z;}public Ponto3D ( ) { this (-1, -1, -1);}public void printPonto3D ( ) { print ( ); System.out.print (", "+z);}

}

Chama método print( ) da classe pai

class Herança {public static void main (String args [ ]) {

Ponto p1 = new Ponto (1,1); Ponto3D p2 = new Ponto3D (2,2,2);

p1.print ( ); p2.printPonto3D ( );

}

}

2, 2, 2

1, 1

Exercício 4 - HerançaExercício 4 - Herança

• Implemente a classe Aluno– A classe Aluno é subclasse da classe Pessoa– A classe Aluno, além de conter os dados de uma pessoa,

vai ter uma nota e uma turma.– Crie métodos acessor e mutator para os atributos nota e

turma.– Escreva um método print2() que chame o método print() da

classe pai (Pessoa) que irá exibir nome, data de nasc e endreço do aluno e exiba na tela a nota e a turma do aluno.

• No método public static void main:– crie 1 objeto aluno que represente voce como aluno do

curso Java. Que nota você se dá? :o)

Sobreposição (Overloading)Sobreposição (Overloading)

class Ponto3D extends Ponto {int z;public Ponto3D (int x, int y, int z) { super (x, y); // chama o construtor Ponto (x, y)

this.z = z;}public Ponto3D ( ) { this (-1, -1, -1);}public void printPonto3D ( ) { print ( ); System.out.print (", "+z);}

}

Chama método print( ) da classe paisuper.

print

PolimorfismoPolimorfismo

class Polimorfismo {

public static void main (String args [ ]) {

Ponto p1 = new Ponto (1,1); Ponto3D p2 = new Ponto3D (2,2,2); Ponto p3 = new Ponto3D (3,3,3);

p1.print ( ); p2.print ( );

p3.print ( );}

}

2, 2, 2

1, 1

3, 3, 3

A capacidade de um objeto decidir qual método aplicará para si na hierarquia de heranças é chamada de polimorfismo. A idéia do polimorfismo é que embora a mensagem seja a mesma, os objetos poderão ter comportamentos diferentes.

Ponto3D p1 = new Ponto3D ( );

Ponto p2 = new Ponto3D ( );

Dinamic BindingDinamic Binding

Ponto3D p3 = new Ponto ( );

Ponto p2 = new Ponto3D ( );Ponto3D p4 = (Ponto3D) p2;

Se não usar casting é gerado erro em tempo de compilação

• Um método não pode ser menos acessível que o método que ele sobrescreve (na classe pai).

class Ponto {private void print ( ) { ...}

}

class Ponto3D extends Ponto {public void print ( ) {

...}

}

Exercício 5 – sobreposiçãoExercício 5 – sobreposição

• Na classe Aluno (criada no exercício anterior) faça a sobreposição do método print da classe pai (classe Pessoa) , substituindo o método print2( ) .

Classes AbstratasClasses Abstratas

• Problema:– Queremos construir um array de Polígonos.– Um polígono pode ser um Retângulo, um Quadrado, uma

Elipse ou um Triângulo. E terão dois métodos básicos: area ( ) e circunferencia ( ).

– Mas um array só guarda objetos do mesmo tipo?– Solução: criar uma classe abstrata que declare os métodos

area() e circunferencia(), mas não os implementando, pois a área de um Triângulo é diferente da área de um Quadrado.

Classes AbstratasClasses Abstratas

abstract class Shape {

String cor;

public abstract double area ( );

public abstract double circunference ( );

public String getType () {

Class c = this.getClass();

return c.getName();

}

}

Enquanto o programa executa, Java mantém o que é chamado de identificação

do tipo em tempo de execução (RTTI). Permite

saber a qual classe um objeto pertence. Podemos acessar essa informação usando a

classe Class.

Classes AbstratasClasses Abstratas

class Circle extends Shape {public static final double PI = 3.141592656358979323846;protected double r;

public Circle (double r) { this.r = r;

}public double getRadius () {

return r;}public double area () { return PI*r*r;}public double circunference () {

return 2*PI*r;}

} // da class Circle

class Rectangle extends Shape {protected double w, h;public Rectangle (double w, double

h) {this.w = w;this.h = h;

}public double getWidth () {

return w;}public double getHeight () {

return h;}public double area () {

return w*h;}public double circunference () {

return 2*(w+h);} } // da class Rectangle

Classes AbstratasClasses Abstratas

• Apenas métodos podem ser abstratos;• Se uma classe contiver pelo menos um método

abstract, ela deve ser declarada como abstract;• Uma classe abstrata não pode ser instanciada. Só

podem ser instanciadas as classes filhas que implementarem os métodos abstracts;

• Se uma subclasse não implementar os métodos abstracts da classe abstract, ela também será abstract.

• Classes abstratas podem ter variáveis e métodos não abstratos, ou seja, implementados.

• Métodos abstract não podem ser private, static e final.

Classes AbstratasClasses Abstratas

class ClassesAbstratas {public static void main (String args [ ]) {

Shape [ ] shapes = new Shape [2];shapes [0] = new Circle (2);shapes [1] = new Rectangle (1, 3);double totalArea = 0;for (int i=0; i<shapes.length; i++) {

System.out.println ("O objeto "+i+ " é um "+shapes [i].getType());

// ou utilizo instanceof

//if (shapes [i] instanceof Circle) System.out.println ("É um Circle"); totalArea += shapes[i].area();}System.out.println ("Área total de todos os objetos é "+totalArea);

}

}

Exercício 7 – Classes AbstratasExercício 7 – Classes Abstratas

• Implemente uma classe Hexagono. Essa classe tambem herda propriedades da classe abstrata Shape. O hexagono possui apenas um atributo que o compimento do lado s (Todos os lados tem comprimentos iguais).

• Implemente os métodos area e circunference do hexagono:– A area de um hexagono é: 3/2*Math.sqrt(3)*s*s– A circunferência de um hexagono é: 6*s.

• Implemente o método main e crie um hexagono de lado s=5.

• Qual é a area e circunferência deste hexagono?• Mostre estas informações na tela.

s

InterfacesInterfaces

• Uma interface não pode possuir nenhuma implementação;

• Todos os métodos são abstratos, mesmo que o programador omita o modificador abstract;

• Todos os métodos são públicos, mesmo que o modificador public seja omitido;

• Todas as variáveis em uma interface são constantes, mesmo que não sejam declaradas como static final;

InterfacesInterfaces

interface MinhaInterface { int getSize ( ); void setSize (int param);}

class MinhaClasse implements MinhaInterface{ int size; public int getSize ( ) { return size; } public void setSize (int tam) { size = tam; }}

Não é possível criar uma instância de uma interface.

Para criar uma instância é preciso implementar a

interface.

InterfacesInterfaces

• Java não permite herança múltipla, por isso uma classe pode ser subclasse(extends) apenas de uma superclasse mas implementar (implements) várias interfaces.

• Podemos declarar classe abstrata Shape como interface:– retirar implementação do método Type();– as classes que implementam Shape podem herdar

propriedades de outra classes.

Garbage CollectionGarbage Collection

String str = “Primeiro espaço”;System.out.println (“Usando memória original: “+str);str = “Outro espaço”;System.out.println (“Usando outro espaço de memória: “+str);

10 100str

Primeiro espaço

Outro espaço

10

100

Área de memória liberada pelo Garbage

Collection

Exercício 6 - AgregaçãoExercício 6 - Agregação

• Implemente a classe Ponto.• Um ponto tem dois atributos do tipo inteiro:

– As coordenadas x e y.• Além disso, um ponto também tem os métodos:

– Método construtor:• Inicializa as coordenadas x e y com os valores passados como parametro para o

método.– setaCoordenadas (int x, int y):

• que recebe como parametro os novos valores das coordenadas.– exibe ():

• Que exibe os valores dos atributos x e y.

• Implemente a classe Reta. • Uma Reta possui 2 atributos do tipo Ponto:

– O ponto inicial e o ponto final da Reta.• Uma Reta possui os métodos:

– Método Construtor: recebe 4 valores inteiros e inicializa as coordenadas x e y de cada ponto.

– exibe( ): exibe as coordenadas x e y de cada ponto.• Implemente a classe TestaReta:

– que possui apenas o método main. Dentro do método main:• crie uma reta e inicialize o Ponto Inicial com x=2, y = 3 e o Ponto Final com x=5,

y=6.• chame o método exobe da classe Reta.

Ponto

Reta

Test

aR

eta