Inherence Flashcards
Quais modificadores são permitidos em uma herança?
Public
default
final (Objetos podem ser finais)
static
Os modificadores abaixo não são permitidos em herança:
protected
private
Classes finais não podem ser herdadas.
Tentar herdar uma classe definida como final vai resultar em um erro de compilação.
O que é o metodo super()?
O método super chama o construtor da classe pai.
Assim como o construtor padrão o comando super() é inserido automaticamente caso o programador não o insira.
Pode ser usado para chamar um construtor especifico da classe pai.
super(age,”Gorilla”);
Porque o código abaixo não compila?
public class Zoo { public Zoo() { System.out.println("Zoo created"); super(); } }
O super só poder ser usado em um construtor.
E para isso ele deve ser o primeiro parâmetro do construtor.
Caso contrário o código não compila.
Como chamar um construtor especifico de uma classe pai a partir da classe filha?
Usando o método super();
super(age,”Gorilla”);
Porque o código abaixo não compila? public class Mammal { public Mammal(int age) { } }
// Tentativa 1 - Não compila public class Elephant extends Mammal { }
// Tentativa 2 - Não compila public class Elephant extends Mammal { public Elephant() { } }
Caso o programador redefina o construtor padrão, a classe filha precisa chamar o super e passar os argumentos solicitados pelo novo construtor. Caso contrario a classe filha não compila.
public class Elephant extends Mammal { public Elephant() { super(10); } }
Porque o código abaixo não compila?
public class Camel { protected String getNumberOfHumps() { return "Undefined"; } }
public class BactrianCamel extends Camel { private int getNumberOfHumps() { return 2; } }
Ao sobrescrever um método ele deve ter igual acessibilidade ou maior que o método pai.
Caso contrário o código não compila!
No exemplo existem dois erros. O primeiro é relacionado a acessibilidade.
E o segundo é o retorno. Na classe pai o retorno é String e na classe filho o retorno é inteiro.
O que acontece ao sobrescrever um método privado?
Se o método da classe pai for privado, ele não será sobrescrito. Será criado um novo método na classe filho com mesmo nome.
Este novo método não tem que atender a nenhum dos requisitos do método da classe pai.
Não precisa retornar os mesmos valores e nem precisa ter os mesmos parâmetros.
O código abaixo compila?
public class Camel { private String getNumberOfHumps() { return "Undefined"; } }
public class BactrianCamel extends Camel { private int getNumberOfHumps() { return 2; } }
O código a compila normalmente. Mas se o método na classe pai fosse public protected ou default o código abaixo não compilaria.
Se o método da classe pai for privado, ele não será sobrescrito. Será criado um novo método na classe filho com mesmo nome.
Este novo método não tem que atender a nenhum dos requisitos do método da classe pai.
Não precisa retornar os mesmos valores e nem precisa ter os mesmos parâmetros.
Um método final pode ser sobrescrito?
Não
Um método static pode ser sobrescrito?
Sim!
Se o método na classe pai for static o método na classe filho também precisa ser static.
O que é uma classe abstrata?
Uma classe abstrata fornece variáveis e métodos que podem ser reutilizados pelo desenvolvedor.
É também uma forma de garantir que métodos sejam implementados pela classe filha.
Uma classe abstrata pode conter métodos completos ou incompletos.
Qual a diferença entre classe abstrata e interface?
Uma classe abstrata pode conter métodos completos ou incompletos. Uma Interface pode conter apenas a assinatura de um método, mas nenhum corpo ou implementação. Portanto, em uma classe abstrata, pode-se implementar métodos, mas em uma Interface, não.
Porque o código abaixo não compila?
public class Chicken { public abstract void peck(); }
Para um método poder ser abstrato é obrigatório que a classe também seja.
Porque o código abaixo não compila?
public abstract class Turtle { public abstract void swim(){} }
Se um método for abstrato ele não pode ter implementação.
Porque o código abaixo não compila?
public abstract class Turtle { public abstract void swim(){ return 10; } }
Se um método for abstrato ele não pode ter implementação.
Porque o código abaixo não compila?
public abstract class Whale { private abstract void sing(); }
Um método abstrato não pode ser privado.
Se for privado a classe que estende a classe não terá acesso ao método para implementa-lo.
Porque o código abaixo não compila?
public abstract class Whale { protected abstract void sing(); }
public class HumpbackWhale extends Whale { private void sing() { System.out.println("Humpback whale is singing"); } }
Assim como na herança, a subclasse não pode reduzir a visibilidade do método pai.
Uma classe abstrata pode ser final?
Por uma rasão obvia, uma classe abstrata não pode ser final.
Por definição, uma classe abstrata deve ser estendida por outra classe para ser instanciada.