SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
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(quot;generic noisequot;); }
}
class Dog extends Animal {
    void makeNoise() {System.out.println(quot;barkquot;); }
    void playDead() { System.out.println(quot;roll overquot;); }
}
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(quot;Generic Animal Eating Genericallyquot;);
    }
}
class Horse extends Animal {
    public void eat() {
        System.out.println(quot;Horse eating hay, oats, and horse treatsquot;);
    }
}
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(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() { }
}
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(quot;Generic Animal Eating Genericallyquot;);
    }
}
class Horse extends Animal {
    private void eat() {
    System.out.println(quot;Horse eating hay, oats, and horse treatsquot;);
    }
}
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(quot;In the Animal versionquot;);
    }
    public void doStuff(Horse h) {
        System.out.println(quot;In the Horse versionquot;);
    }
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(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);
    }
}
Sobrecarga/Sobrescrita
Sobrecarga/Sobrescrita
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.”
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

Más contenido relacionado

Destacado

Destacado (9)

ICC : modelo OSI
ICC : modelo OSIICC : modelo OSI
ICC : modelo OSI
 
2 C
2 C2 C
2 C
 
Modelo OSI Visão Geral
Modelo OSI   Visão GeralModelo OSI   Visão Geral
Modelo OSI Visão Geral
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTO
 
Encapsulamento em oo
Encapsulamento em ooEncapsulamento em oo
Encapsulamento em oo
 
Banco de Dados Orientado a Objeto
Banco de Dados Orientado a ObjetoBanco de Dados Orientado a Objeto
Banco de Dados Orientado a Objeto
 
Banco de dados orientado a objetos
Banco de dados orientado a objetosBanco de dados orientado a objetos
Banco de dados orientado a objetos
 
POO - 06 - Encapsulamento
POO - 06 - EncapsulamentoPOO - 06 - Encapsulamento
POO - 06 - Encapsulamento
 
Tipos Abstratos de Dados e Encapsulamento
Tipos Abstratos de Dados e EncapsulamentoTipos Abstratos de Dados e Encapsulamento
Tipos Abstratos de Dados e Encapsulamento
 

Similar a Orientação a Objeto

Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Mario Jorge Pereira
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaArthur Emanuel
 
Introdução a programação II
Introdução a programação IIIntrodução a programação II
Introdução a programação IIClerton Leal
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Injeção de Dependências com PHP
Injeção de Dependências com PHPInjeção de Dependências com PHP
Injeção de Dependências com PHPDanilo Godoy
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...Manuel Menezes de Sequeira
 
Java Desktop
Java DesktopJava Desktop
Java Desktopciceroclc
 
Java - Aula 2 - Orientado a Objetos
Java - Aula 2 - Orientado a ObjetosJava - Aula 2 - Orientado a Objetos
Java - Aula 2 - Orientado a ObjetosMoises Omena
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoAnderson Ledo
 

Similar a Orientação a Objeto (20)

Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
 
PowerShell
PowerShellPowerShell
PowerShell
 
Java20141219
Java20141219Java20141219
Java20141219
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de Java
 
Aula5
Aula5Aula5
Aula5
 
Introdução a programação II
Introdução a programação IIIntrodução a programação II
Introdução a programação II
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
10 heranca
10   heranca10   heranca
10 heranca
 
Injeção de Dependências com PHP
Injeção de Dependências com PHPInjeção de Dependências com PHP
Injeção de Dependências com PHP
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
 
Java Desktop
Java DesktopJava Desktop
Java Desktop
 
Lp3
Lp3Lp3
Lp3
 
Php 08 Oo
Php 08 OoPhp 08 Oo
Php 08 Oo
 
Java - Aula 2 - Orientado a Objetos
Java - Aula 2 - Orientado a ObjetosJava - Aula 2 - Orientado a Objetos
Java - Aula 2 - Orientado a Objetos
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
 
Spring Capitulo 03
Spring Capitulo 03Spring Capitulo 03
Spring Capitulo 03
 
Aula5
Aula5Aula5
Aula5
 

Más de Elenilson Vieira (20)

Aulão de JPA com Tomaz Lavieri
Aulão de JPA com Tomaz LavieriAulão de JPA com Tomaz Lavieri
Aulão de JPA com Tomaz Lavieri
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
JavaEE
JavaEEJavaEE
JavaEE
 
JavaME no Mercado Mobile
JavaME no Mercado MobileJavaME no Mercado Mobile
JavaME no Mercado Mobile
 
JavaFX 1.2
JavaFX 1.2JavaFX 1.2
JavaFX 1.2
 
Apresentação da Doom
Apresentação da DoomApresentação da Doom
Apresentação da Doom
 
Palestra sobre a Sun
Palestra sobre a SunPalestra sobre a Sun
Palestra sobre a Sun
 
Apresentação da RedeSoft
Apresentação da RedeSoftApresentação da RedeSoft
Apresentação da RedeSoft
 
Java Collections - Tomaz Lavieri
Java Collections - Tomaz LavieriJava Collections - Tomaz Lavieri
Java Collections - Tomaz Lavieri
 
A Sun no Meio Acadêmico - IESP/FatecPB
A Sun no Meio Acadêmico - IESP/FatecPBA Sun no Meio Acadêmico - IESP/FatecPB
A Sun no Meio Acadêmico - IESP/FatecPB
 
Mini-Curso de Sockets no Unipê
Mini-Curso de Sockets no UnipêMini-Curso de Sockets no Unipê
Mini-Curso de Sockets no Unipê
 
JavaME
JavaMEJavaME
JavaME
 
Concorrência com Java
Concorrência com JavaConcorrência com Java
Concorrência com Java
 
Programas Acadêmicos da Sun no Unipê
Programas Acadêmicos da Sun no UnipêProgramas Acadêmicos da Sun no Unipê
Programas Acadêmicos da Sun no Unipê
 
Mundo Livre e Aberto
Mundo Livre e AbertoMundo Livre e Aberto
Mundo Livre e Aberto
 
JavaME - Aula 2
JavaME - Aula 2JavaME - Aula 2
JavaME - Aula 2
 
JavaME - Aula 1
JavaME - Aula 1JavaME - Aula 1
JavaME - Aula 1
 
Apostila JavaME
Apostila JavaMEApostila JavaME
Apostila JavaME
 
Threads
ThreadsThreads
Threads
 
Sincronização - Glêdson Elias
Sincronização - Glêdson EliasSincronização - Glêdson Elias
Sincronização - Glêdson Elias
 

Orientação a Objeto

  • 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); } }
  • 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