35
Encapsulamento Objetivo 5.1 – “Criar código que implemente forte encapsulamento, fraco acoplamento e alta coesão em classes, e descrever benefícios.” Manter variáveis de instância protegidas (com um modificador de acesso, geralmente private); Fazer métodos de acesso public, e force os códigos utilizadores da classe à usar os métodos em vez de acessar diretamente as propriedades; Usar convenção JavaBeans para acesso: getPropriedade() e setPropriedade().

Orientação a Objeto

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Orientação a Objeto

Encapsulamento

� Objetivo 5.1 – “Criar código que implemente forte encapsulamento, fraco acoplamento e alta coesão em classes, e descrever benefícios.”

− Manter variáveis de instância protegidas (com um modificador de acesso, geralmente private);

− Fazer métodos de acesso public, e force os códigos utilizadores da classe à usar os métodos em vez de acessar diretamente as propriedades;

− Usar convenção JavaBeans para acesso: getPropriedade() e setPropriedade().

Page 2: Orientação a Objeto

Encapsulamento

� Cuidado com pegadinhas perguntando sobre comportamento de método, quando o verdadeiro problema é encapsulamento!

class Foo {

public int left = 9;

public int right = 3;

public void setLeft(int leftNum) {

left = leftNum;

right = leftNum/3;

}

// código adicional aqui

}

Page 3: Orientação a Objeto

Encapsulamento

� O valor de right sempre vai ser um terço do valor de left? Parece que sim, até percebermos que os utilizadores da classe podem acessar as propriedades diretamente, sem utilizar o método setLeft()!

Page 4: Orientação a Objeto

Polimorfismo e Casting

� Objetivo 5.2 - “Dado um cenário, desenvolver código que demonstre o uso de polimorfismo. Além disso, determinar quando casting seránecessário e reconhecer erros tempo de compilação x tempo de execução relacionados ao casting de referências de objetos.”

� Uma referência é uma variável, logo pode ser reutilizada para apontar vários objetos;

� Uma variável de referência é imutável (quando declarada, sempre será daquele tipo);

Page 5: Orientação a Objeto

Polimorfismo e Casting

� O tipo de uma variável de referência indica os métodos que poderão ser invocados no objeto referenciado;

� Uma variável de referência pode referenciar um objeto do mesmo tipo da referência declarada ou qualquer subtipo dela;

� Uma variável de referência pode ser declarada como um tipo classe ou interface. Se a variável for declarada como interface, ela pode referenciar qualquer objeto de qualquer classe que implementa a interface.

Page 6: Orientação a Objeto

Polimorfismo e Casting

class Animal {

void makeNoise() {System.out.println("generic noise"); }

}

class Dog extends Animal {

void makeNoise() {System.out.println("bark"); }

void playDead() { System.out.println("roll over"); }

}

Page 7: Orientação a Objeto

Polimorfismo e Casting

class CastTest2 {

public static void main(String [] args) {

Animal [] a = {new Animal(), new Dog(), new Animal() };

for(Animal animal : a) {

animal.makeNoise();

if(animal instanceof Dog) {

animal.playDead();

}

}

}

}

� Erro “Cannot find symbol” - Referência Animal não conhece método de objeto Dog

Page 8: Orientação a Objeto

Polimorfismo e Casting

� Com adição de casting, podemos acessar o método de Dog:

if(animal instanceof Dog) {

Dog d = (Dog) animal;

d.playDead();

}

Page 9: Orientação a Objeto

Polimorfismo e Casting

class Animal { }

class Dog extends Animal { }

class DogTest {

public static void main(String [] args) {

Animal animal = new Animal();

Dog d = (Dog) animal;

}

}

� Exemplo de downcasting errado – referência da subclasse não pode referir à um objeto de superclasse. (java.lang.ClassCastException)�

Page 10: Orientação a Objeto

Polimorfismo e Casting

� Upcasting: pode ser implícito ou não, fica àcargo do programador adicionar o casting

class Animal { }

class Dog extends Animal { }

class DogTest {

public static void main(String [] args) {

Dog d = new Dog();

Animal a1 = d; // upcasting implícito

Animal a2 = (Animal) d; // upcast explícito

}

}

Page 11: Orientação a Objeto

Sobrecarga/Sobrescrita

� Objetivo 1.5 - “Dado um código de exemplo, determinar se um método está corretamente sobrescrevendo ou sobrecarregando outro método, e identificar retornos de valores legais (incluindo retornos covariantes), para o método.

� Objetivo 5.4 - “Dado um cenário, desenvolver código que declare e/ou invoque métodos sobrescritos ou sobrecarregados, e código que declara e/ou invoca superclasses

Page 12: Orientação a Objeto

Sobrecarga/Sobrescrita

public class Animal {

public void eat() {

System.out.println("Generic Animal Eating Generically");

}

}

class Horse extends Animal {

public void eat() {

System.out.println("Horse eating hay, oats, and horse treats");

}

}

Page 13: Orientação a Objeto

Sobrecarga/Sobrescrita

public class TestAnimals {

public static void main (String [] args) {

Animal a = new Animal();

Animal b = new Horse();

a.eat();

b.eat();

}

}

� Qual método b.eat() invocará?

Page 14: Orientação a Objeto

Sobrecarga/Sobrescrita

class Animal {

public void eat() {

System.out.println("Generic Animal Eating Generically");

}

}

class Horse extends Animal {

public void eat() {

System.out.println("Horse eating hay, oats, and horse treats");

}

public void buck() { }

}

Page 15: Orientação a Objeto

Sobrecarga/Sobrescrita

public class TestAnimals {

public static void main (String [] args) {

Animal a = new Horse();

a.buck();

}

}

� O que acontecerá na invocação de a.buck()?

Page 16: Orientação a Objeto

Sobrecarga/Sobrescrita

class Animal {

public void eat() {

System.out.println("Generic Animal Eating Generically");

}

}

class Horse extends Animal {

private void eat() {

System.out.println("Horse eating hay, oats, and horse treats");

}

}

Page 17: Orientação a Objeto

Sobrecarga/Sobrescrita

public class TestAnimals {

public static void main (String [] args) {

Animal a = new Horse();

a.eat();

}

}

� O que acontecerá na invocação de a.eat()?

Page 18: Orientação a Objeto

Sobrecarga/Sobrescrita

class Animal {

public void eat() throws Exception { ...

}

}

class Dog2 extends Animal {

public void eat() { /* no Exceptions */}

public static void main(String [] args) {

Animal a = new Dog2();

Dog2 d = new Dog2();

d.eat();

a.eat();

}

}

� O que ocorrerá na invocação de a.eat()?

Page 19: Orientação a Objeto

Sobrecarga/Sobrescrita

� Regras para sobrescrita de métodos:

− Argumentos iguais

− Retorno do mesmo tipo ou subtipo

− O nível de acesso não pode ser mais restritivo

� Mas pode ser menos restritivo

− Só podem ser sobrescritos se são herdados

− O método sobrecarregado pode enviar exceção unchecked (runtime), mesmo que o da superclasse não envie

Page 20: Orientação a Objeto

Sobrecarga/Sobrescrita

� Regras para sobrescrita de métodos:

− Não pode enviar exceção “checked” nova ou mais ampla que a do método pai

− O método filho pode enviar menos exceções

− Proibido sobrescrever FINAL

− Proibido sobrescrever STATIC

− Se não pode ser herdado, não pode ser sobrescrito

Page 21: Orientação a Objeto

Sobrecarga/Sobrescrita

public class Animal {

public void eat() { }

}

� Dado o método acima, qual das sobrescritas abaixo são válidas?

A) private void eat() {}

B) public void eat() throws IOException{}

C) public void eat(String food)�

D) public String eat()�

Page 22: Orientação a Objeto

Sobrecarga/Sobrescrita

� Regras para Sobrecarga:

− Deve alterar a lista de argumentos

− PODE mudar tipo de retorno

− PODE modificar o modificador de acesso

− PODE declarar novas ou mais amplas exceções

− Pode ser sobrecarregado na mesma classe ou em uma subclasse

Page 23: Orientação a Objeto

Sobrecarga/Sobrescrita

class Adder {

public int addThem(int x, int y) {

return x + y;

}

public double addThem(double x, double y) {

return x + y;

}

}

Page 24: Orientação a Objeto

Sobrecarga/Sobrescrita

public class TestAdder {

public static void main (String [] args) {

Adder a = new Adder();

int b = 27;

int c = 3;

int result = a.addThem(b,c);

double doubleResult = a.addThem(22.5,9.3);

}

}

� Quais serão os métodos invocados?

Page 25: Orientação a Objeto

Sobrecarga/Sobrescrita

class Animal { }

class Horse extends Animal { }

class UseAnimals {

public void doStuff(Animal a) {

System.out.println("In the Animal version");

}

public void doStuff(Horse h) {

System.out.println("In the Horse version");

}

Page 26: Orientação a Objeto

Sobrecarga/Sobrescrita

public static void main (String [] args) {

UseAnimals ua = new UseAnimals();

Animal animalObj = new Animal();

Horse horseObj = new Horse();

Animal animalRefToHorse = new Horse();

ua.doStuff(animalObj);

ua.doStuff(horseObj);

ua.doStuff(animalRefToHorse);

}

}

� O que será apresentado em cada uma das invocações?

Page 27: Orientação a Objeto

Sobrecarga/Sobrescrita

public class Animal {

public void eat() {

System.out.println("Generic Animal Eating Generically");

}

}

public class Horse extends Animal {

public void eat() {

System.out.println("Horse eating hay ");

}

public void eat(String s) {

System.out.println("Horse eating " + s);

}

}

Page 28: Orientação a Objeto

Sobrecarga/Sobrescrita

Page 29: Orientação a Objeto

Sobrecarga/Sobrescrita

Page 30: Orientação a Objeto
Page 31: Orientação a Objeto

Construtores

� Objetivo 1.6 - “Dado um conjunto de classes e superclasses, desenvolver construtores para uma ou mais classes. Dada uma declaração de classe, determinar se um construtor default será criado, e se sim, determinar o comportamento daquele construtor. Dado um listamento de classes aninhado ou não, escrever código para instanciar aquela classe.”

Page 32: Orientação a Objeto

Construtores

� Objetivo 5.3 - “Explicar o efeito dos modificadores na herança no que diz respeito àconstrutores, variáveis e métodos de instância e estáticos.”

� Objetivo 5.4 - “Dado um cenário, desenvolver código que declare e/ou invoque métodos sobrecarregados ou sobrescritos e código que declare construtores de superclasse, sobrecarregados ou sobrescritos.”

Page 33: Orientação a Objeto

Construtores

� Interfaces não podem ter construtores

� Classes concretas e abstratas DEVEM ter construtores

� Construtores NÃO possuem retorno

� Construtores aceitam qualquer modificador de acesso

� O nome do método construtor deve ter o nome IGUAL ao da classe

Page 34: Orientação a Objeto

Construtores

� Se não houver nenhum explícito, haverá um construtor default implícito gerado pelo compilador

− O construtor default é sempre sem argumentos

− Caso seja feito algum construtor, o compilador não gerará o construtor default implícito

� O primeiro comando de um construtor sempre será a chamada de um outro construtor sobrecarregado ou construtor da superclasse− this() ‏

− super() ‏

Page 35: Orientação a Objeto

Construtores

� Caso não seja inserido um super() ou this(), o compilador irá inserir um super() automaticamente

� Não é possível acessar um método ou variável de instância antes da execução do super()‏

� Apenas variáveis ou métodos estáticos podem ser acessadas como parte da chamada super() ou this() - Ex.: super(Animal.NAME) ‏

� Construtores de classes abstratas são chamados quando subclasses concretas são instanciadas