Your SlideShare is downloading. ×
Orientação a Objeto
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Orientação a Objeto

2,340
views

Published on


1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total Views
2,340
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
77
Comments
1
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 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().
  • 2. 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 }
  • 3. 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()!
  • 4. 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);
  • 5. 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.
  • 6. Polimorfismo e Casting class Animal { void makeNoise() {System.out.println(quot;generic noisequot;); } } class Dog extends Animal { void makeNoise() {System.out.println(quot;barkquot;); } void playDead() { System.out.println(quot;roll overquot;); } }
  • 7. 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
  • 8. 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(); }
  • 9. 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)
  • 10. 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 } }
  • 11. 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
  • 12. Sobrecarga/Sobrescrita public class Animal { public void eat() { System.out.println(quot;Generic Animal Eating Genericallyquot;); } } class Horse extends Animal { public void eat() { System.out.println(quot;Horse eating hay, oats, and horse treatsquot;); } }
  • 13. 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á?
  • 14. Sobrecarga/Sobrescrita class Animal { public void eat() { System.out.println(quot;Generic Animal Eating Genericallyquot;); } } class Horse extends Animal { public void eat() { System.out.println(quot;Horse eating hay, oats, and horse treatsquot;); } public void buck() { } }
  • 15. 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()?
  • 16. Sobrecarga/Sobrescrita class Animal { public void eat() { System.out.println(quot;Generic Animal Eating Genericallyquot;); } } class Horse extends Animal { private void eat() { System.out.println(quot;Horse eating hay, oats, and horse treatsquot;); } }
  • 17. 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()?
  • 18. 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()?
  • 19. 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
  • 20. 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
  • 21. 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()
  • 22. 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
  • 23. Sobrecarga/Sobrescrita class Adder { public int addThem(int x, int y) { return x + y; } public double addThem(double x, double y) { return x + y; } }
  • 24. 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?
  • 25. Sobrecarga/Sobrescrita class Animal { } class Horse extends Animal { } class UseAnimals { public void doStuff(Animal a) { System.out.println(quot;In the Animal versionquot;); } public void doStuff(Horse h) { System.out.println(quot;In the Horse versionquot;); }
  • 26. 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?
  • 27. Sobrecarga/Sobrescrita public class Animal { public void eat() { System.out.println(quot;Generic Animal Eating Genericallyquot;); } } public class Horse extends Animal { public void eat() { System.out.println(quot;Horse eating hay quot;); } public void eat(String s) { System.out.println(quot;Horse eating quot; + s); } }
  • 28. Sobrecarga/Sobrescrita
  • 29. Sobrecarga/Sobrescrita
  • 30. 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.”
  • 31. 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.”
  • 32. 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
  • 33. 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()‫‏‬
  • 34. 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