1) O documento discute conceitos de encapsulamento, como manter variáveis privadas e usar métodos de acesso públicos.
2) Aborda polimorfismo, quando o casting é necessário e erros relacionados a tempo de compilação x execução.
3) Explica sobrecarga, sobrescrita, regras e exemplos.
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() { }
}
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);
}
}
31. 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.”
32. 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.”
33. 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
34. 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()
35. 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