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.
Uma classe abstrata que estende uma outra classe abstrata, é obrigada a implementar seus métodos?
Se uma classe abstrata estende outra classe abstrata, ela não é obrigada a implementar os métodos abstratos da classe pai.
Mas se a classe seguinte for uma classe concreta(não abstrata), ela será obrigada a implementar.
O que é uma classe concreta?
Uma classe concreta é a primeira subclasse que estende uma classe abstrata. Isso quer dizer que é requerido implementar todos os métodos abstratos que ainda não foram implementados.
Como implementar múltiplas interfaces em uma classe?
Uma classe pode implementar múltiplas interfaces.
Elas devem ser separadas por virgula.
public class Elephant implements WalksOnFourLegs, HasTrunk, Herbivore { }
O que acontece se uma classe implementa duas interfaces que possuem métodos com nomes iguais?
public interface Herbivore { public void eatPlants(); } public interface Omnivore { public void eatPlants(); public void eatMeat(); }
Se uma classe herda de duas interfaces que implementa o mesmo método, não existe conflito, pois se a classe que herda implementa o primeiro, automaticamente implementa o segundo.
O que acontece se uma classe implementa duas interfaces que possuem assinaturas diferentes?
public interface Herbivore { public int eatPlants(int quantity); } public interface Omnivore { public void eatPlants(); }
Se uma classe herda de duas interfaces que implementam o mesmo método mas com assinaturas diferentes, isso não é um problema, já que a sobrecarga de métodos é permitida em java.
Mas neste caso o tipo de retorno é diferente. Portanto o código não compila.
O que acontece se uma classe implementa duas interfaces que possuem retornos diferentes?
Se uma classe herda de duas interfaces que implementam o mesmo método mas o retorno é diferente, o código não compila, já que não é permitido um método com mesmo nome e retorno diferente em java.