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().
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
}
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()!
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);
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.
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"); }
}
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
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();
}
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)�
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
}
}
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
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");
}
}
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á?
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() { }
}
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()?
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");
}
}
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()?
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()?
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
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
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()�
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
Sobrecarga/Sobrescrita
class Adder {
public int addThem(int x, int y) {
return x + y;
}
public double addThem(double x, double y) {
return x + y;
}
}
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?
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");
}
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?
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);
}
}
Sobrecarga/Sobrescrita
Sobrecarga/Sobrescrita
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.”
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.”
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
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()
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
Top Related