OOP Java

35
Programação Orientada a Objectos (OOP) - Part 1: Java Jorge C. S. Cardoso, Luís Gustavo Martins [email protected], [email protected] Cursos de Verão na Católica 2010

description

Slides do segundo dia do Workshop (intensivo :) ) sobre Introdução à Programação de Dispositivos Móveis (Google Android, Apple iPhone, iPod Touch e iPad)

Transcript of OOP Java

Page 1: OOP Java

Programação Orientada a Objectos (OOP) - Part 1: Java

Jorge C. S. Cardoso, Luís Gustavo [email protected], [email protected]

Cursos de Verão na Católica 2010

Page 2: OOP Java

Conteúdo

• Objectos• Classes• Construtores• Destrutores• Encapsulamento• Herança• Method overriding• Strings

Page 3: OOP Java

Objectos no mundo realObjectos no mundo real podem ser descritos através de duas características essenciais: estado e comportamento. 

Por exemplo, o cão do João tem: •  estado (atributos):

o Cor:  castanhoo Tamanho pêlo: curtoo Raça: Rafeiroo Idade: 3 anoso Nome: Bobi

• comportamentoo correo ladrao senta-seo comeo dorme

Page 4: OOP Java

Objectos no mundo realOutro exemplo: o automóvel do Jorge 

• Atributos:o Cor: azul escuroo Marca: Opelo Modelo: Corsao Velocidade: paradoo Combustível: 30%

• Comportamento:o arrancaro aceleraro travar

(O comportamento não se refere necessariamente a comportamento autónomo, mas simplesmente a acções que o objecto pode realizar.)

Page 5: OOP Java

Classes no mundo realOs dois exemplos anteriores, cão e automóvel, referiam-se a objectos concretos (o cão do João e o automóvel do Jorge).

No entanto, existem milhares de automóveis diferentes, com o mesmo comportamento e com os mesmos atributos (cor, marca, modelo, etc - embora não com os mesmos valores)

A este conjunto genérico de comportamentos e atributos dá-se o nome de classe.

Page 6: OOP Java

Classes em OOP

• Uma classe é, basicamente, um molde para a criação de objectos. 

• Em OOP, ao processo de criar um objecto a partir de uma classe dá-se o nome de instanciação.o Usando o exemplo anterior, o objecto "Automóvel do Jorge" seria uma

instância da classe "Automóvel".• Os atributos são representados através de variáveis e o

comportamento através de métodos.

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2010-winter

Page 7: OOP Java

Um exemplo concreto: Classe Veículo

Atributos:- Cor- Marca- Modelo- Peso- Vel. Máx.- Vel. Actual- Num. Rodas- Num. lugares- Kilómetros- Litros de Combustvel

Comportamento:- Arrancar- Travar- Acelerar- Buzinar- Encher Depósito- *Parado?- *Mostrar Estado

* Em OOP não temos de nos cingir à realidade :)

Page 8: OOP Java

Um exemplo concreto: Classe Veículo

Atributos:- Cor- Marca- Modelo- Peso- Vel. Máx.- Vel. Actual- Num. Rodas- Num. lugares- Kilómetros- Litros de Combustível

Comportamento:- Arrancar- Travar- Acelerar- Buzinar- Encher Depósito- *Parado?- *Mostrar Estado

Design Phase• Criar uma classe

o Veículo• Determinar a "superclass" (classe pai)

o ObjC => NSObjecto Java => Object (implicitamente)

• Que propriedades deve ter a classe?• Que acções deve ela implementar?

Page 9: OOP Java

OOP Concepts

Encapsulationkeep implementation private and separate from interface• Polymorphismdifferent objects, same interface• Inheritancehierarchical organization, share code, customize or extend behaviors

Page 10: OOP Java

Classe Veículo em Java

public class Veiculo { // ficheiro Veiculo.java

int velMax = 120; // em Km/hint velActual = 0;int numRodas = 4;int numLugares = 5;public void arrancar() {                // implementação do método arrancar}

public void travar() {//... }public void acelerar() {//... }public void buzinar()  {//... }public boolean estaParado() {//... }public void mostrarEstado() {//... }}

Page 11: OOP Java

Encapsulamento• Uma das vantagens da programação orientada a objectos é a de

permitir o encapsulamento dos dados/comportamento:o  Por um lado, permite agrupar numa unidade lógica dados

associados a um determinado conceito e operações sobre esses dados.

o  Por outro lado, permite "esconder" informação do exterior, prevenindo erros e estados inconsistentes.  (Dentro do possível as classes devem ser implementadas de forma a

não ser possível que código externo à classe altere dados, colocando o objecto num estado de erro)

Page 12: OOP Java

Encapsulamento

• Estas duas propriedades facilitam o trabalho do programador que utiliza os objectos: tal como no caso das funções, não é necessário compreender o funcionamento interno do objecto para tirar partido dele.

• A estruturação de um programa em classes/objectos permite também ao programador definir e restringir as interdependências entre código, tornando-o mais robusto e compreensível. 

• (Sem objectos teríamos programas em que o estado e comportamento de diferentes componentes estariam todos misturados).

Page 13: OOP Java

Encapsulamento em Java 

• A linguagem Java não força o encapsulamento na perspectiva do "esconder" a informação do exterior

• O programador escolhe:o Os atributos podem ser declarados como vísiveis do

exterior (access modifier)  keyword public 

o Ou podem ser declarados como visíveis apenas pela classe keyword private

Page 14: OOP Java

Java: Variáveis e Métodos de Classe e de Instância

• Apesar de isto não acontecer com objectos no mundo real, em OOP é possível modelar atributos (variáveis) e comportamento (métodos) como pertencentes à classe ou à instância da classe (objecto)o Variáveis e métodos de classe: podem ser usados

mesmo sem criarmos um objectos dessa classeo Variáveis e métodos de instância: apenas podemos usá-

los depois de instanciarmos o objecto (caso mais comum)

• Por omissão as variáveis e métodos são de instância, para os tornarmos de classe usamos o "access modifier"o static

Page 15: OOP Java

Java: Variáveis e Métodos de Classe e de Instância

public classe XPTO {    public int var1 = 1;    public static int var2 = 2;

    public void metodo1() {        System.out.println("Instancia");    }    public static void metodo2() {        System.out.println("Static");        }}

Page 16: OOP Java

Java: Variáveis e Métodos de Classe e de Instância

• Para usarmos variáveis/métodos de classe usamos a notação "." directamente no nome da classe

    XPTO.var2 = 3;    XPTO.metodo2();    //XPTO.metodo1(); // Erro!

Page 17: OOP Java

Construtores

• Muitas vezes, a inicialização do objecto é complexa (pode envolver mais do que apenas inicialização de variáveis) e apenas faz sentido ser realizada pelo próprio objecto que está a ser criado (em vez de ser feita pelo código que está a criar o objecto).

• Por isso, quando um objecto é criado, é invocado um método especial chamado construtor. 

Page 18: OOP Java

Construtores em Java 

• Em Java, o construtor é um método com o mesmo nome da classe, mas sem tipo de retorno. 

• Uma classe pode definir vários construtores com parâmetros diferentes (número e/ou tipo).

• É o nome do construtor (e parâmetros) que colocamos a seguir à keyword 'new' quando criamos um objecto.

Page 19: OOP Java

Construtores em Java 

public class Veiculo {// Atributos aqui    public Veiculo() {    velMax = 120;     velActual = 0;    numRodas = 4;    numLugares = 5;    }    public Veiculo(int velMax, int velActual,                    int numRodas, int numLugares)     {

        this.velMax = velMax; this.velActual = velActual;this.numRodas = numRodas;this.numLugares = numLugares;    } }

public static void main(String args[]) {    Veiculo v = new Veiculo();    Veiculo v1 = new Veiculo(130, 0, 3, 2);    v.mostrarEstado();    v1.mostrarEstado();}

Projecto Java-Construtor

Page 20: OOP Java

Destrutores

• Um destrutor é o oposto de um construtor: é um método especial invocado quando o objecto é destruído. 

• O destrutor é usado para dar oportunidade ao objecto de libertar recursos (por exemplo memória).

• Em Java não existem destrutores porque a gestão de memória é feita automaticamente pelo garbage collector.o Existe um método que é invocado antes de o objecto ser

recolhido pelo garbage colector mas raramente se usa.

Page 21: OOP Java

Herança

• Em muitos casos existe uma relação entre classes diferentes num programa. 

• Voltando aos veículos, o nosso programa poderia necessitar de trabalhar com bicicletas e automóveis.

• Apesar de ambos serem veículos, uma parte do estado e alguns comportamentos são completamente diferentes.

Page 22: OOP Java

Herança• Nestes casos, faz mais sentido

modelar três classes: Automóvel e Bicicleta como classes derivadas da classe Veículo. 

• Desta forma, evita-se repetir o estado e comportamento partilhados.

• Nesta situação, as classes Automóvel e Bicicleta, herdam o estado e comportamento de Veículo, podendo estendê-los.

• A classe Veículo é a superclasse e as classes Automóvel e Bicicleta as subclasses.

Page 23: OOP Java

Herança• As subclasses herdam todos os atributos e métodos da

superclasse, excepto os construtores.

• O construtor da subclasse deve invocar o construtor da superclasse 

• (se a superclasse tiver um construtor vazio - sem parâmetros, este é invocado automaticamente).

• Para invocarmos o construtor da classe mãe usa-se a instrução o super()o super(param1, param2, etc);

Page 24: OOP Java

Herança em JavaProjecto Java-Herancapublic class Automovel extends Veiculo {int numPortas;public Automovel() {// Não é necessário, o construtor vazio é invocado automaticamente, se não // o invocarmos nós //super();System.out.println("Automovel()");}public Automovel(int velMax, int velActual, int numRodas, int numLugares) {super(velMax, velActual, numRodas, numLugares);numPortas = 4;

        System.out.println("Automovel(velMax, velActual, numRodas, numLugares)");}public void abrirPorta()  { }public void ligarMotor() { }public void trocarOleo() { }}

Page 25: OOP Java

Method Overriding

• Method overriding ("sobreposição de método") é uma funcionalidade das linguagens OOP que permite a uma subclasse definir uma implementação mais específica de um método da superclasse.o Por exemplo, a classe Veículo define um método buzinar() com uma

implementação genérica para todos os tipos de veículo ("horn"). No entanto, faz mais sentido a uma Bicicleta proporcionar uma

implementação mais específica deste método ("ring ring"). 

Page 26: OOP Java

Method overriding

Method overriding permite à classe Bicicleta re-implementar um método da classe Veículo.

A classe Automóvel, como não re-implementa o método buzinar(), usa a implementação de Veículo ("horn").

Page 27: OOP Java

Method overriding em JavaProjecto Java-Overriding

public class Veiculo {    // Atributos aqui

    // Construtores

    // outros métodos

    public void buzinar() {System.out.println("Buzinar veículo: horn!");    }

}

public class Bicicleta extends Veiculo{     // Construtores    // Outros métodos

    @Override    public void buzinar() {        System.out.println("Buzinar bicicleta: ring ring!");    }}

Automovel a = new Automovel(130, 20, 4, 4);a.buzinar();Bicicleta b = new Bicicleta();b.buzinar();

Page 28: OOP Java

Exercício• Reimplementar o problema das operações sobre fracções com

objectos• Classe Fraction

o Atributos: ?o Construtores: ?o Métodos: 4 métodos para efectuar as 4 operações aritméticas 

Parametro: outra Fraction Retorno: uma Fraction que resulta da operação da própria com

o parâmetro•  Classe Calculator

o Atributos: duas Fraction, um operador (char)o Construtores: ?o Métodos: 1 método para efectuar a operação correspondente

sobre as duas Fraction

Page 29: OOP Java

Exercício

public class Fraction {

int numerator;int denominator;public void setTo(int n, int d) {this.numerator = n;this.denominator = d;}public Fraction add(Fraction f) {Fraction result = new Fraction();int resultNum, resultDenom;

resultNum = this.numerator*f.denominator + this.denominator*f.numerator;resultDenom = this.denominator * f.denominator;result.setTo(resultNum, resultDenom);result.reduce();return result;        }

Page 30: OOP Java

Exercíciopublic class Calculator {

Fraction operand1, operand2;public Calculator(Fraction frac1, Fraction frac2) {operand1 = frac1;operand2 = frac2;}public Fraction performOperation(char op) {Fraction result = new Fraction();switch(op) {case '+':result = operand1.add(operand2);break;case '-':result = operand1.subtract(operand2);break;case '*':result = operand1.multiply(operand2);break;case '/':result = operand1.divide(operand2);break;}return result;}}

Page 31: OOP Java

Exercício                                Fraction f1 = new Fraction();Fraction f2 = new Fraction();Fraction result;f1.setTo(1, 4);f2.setTo(1, 4);Calculator calc = new Calculator(f1, f2);result = calc.performOperation('+');result.print();

Page 32: OOP Java

Strings

• strings (texto)• Para guardarmos texto num programa usamos o tipo

o String

String nome = "Jorge";

System.out.println(nome);

// aplicado a Strings o operador + // significa concatenaçãonome = nome + " Cardoso"; 

System.out.println(nome);

Page 33: OOP Java

Strings

• As strings em Java são implementadas como objectos

String nome = "jorge";• é o mesmo que 

char data[] = {'j', 'o', 'r', 'g', 'e'};String str = new String(data);• Como as strings são tipos de dados muito comuns, para

facilitar a sua utilização, apesar de internamente serem representadas como objectos, podemos nalguns aspectos usá-las como tipos primitivos.

Page 34: OOP Java

Referências

http://download.oracle.com/javase/tutorial/java/concepts/

http://en.wikipedia.org/wiki/Object-oriented_programming

http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

http://en.wikipedia.org/wiki/Method_overriding

Page 35: OOP Java

Fim

Cursos de Verão na Católica 2010http://porto.ucp.pt/cvc/

Jorge C. S. Cardoso, Luís Gustavo [email protected], [email protected]

http://slideshare.net/jorgecardoso (tag: cvc2010)

Código fonte: http://db.tt/AOFOfA2