types inheritance java single vs multiple inheritance
Aprenda tudo sobre os vários tipos de herança em Java com a ajuda de exemplos simples. Descubra se o Java oferece suporte a herança múltipla:
Introduzimos a Herança em Java junto com os vários conceitos básicos relacionados à herança para os leitores em nosso último tutorial.
Neste tutorial, exploraremos mais o tópico de herança e aprenderemos mais sobre os tipos de herança.
=> Verifique TODOS os tutoriais Java aqui.
Arquivos jar necessários para o selenium webdriver
O que você aprenderá:
Tipos de herança em Java
Dependendo da maneira como as classes são herdadas e de quantas classes são herdadas, temos os seguintes tipos de herança, conforme mostrado na figura abaixo.
Conforme mostrado na figura acima, existem cinco tipos de heranças na programação orientada a objetos, conforme descrito abaixo:
# 1) Herança única: Quando uma classe ou subclasse derivada herda de apenas uma base ou superclasse, então é herança simples.
# 2) Herança multinível: Em Herança multinível, temos mais de um nível em que uma classe herda de uma classe base e a classe derivada, por sua vez, é herdada por outra classe.
# 3) Herança hierárquica: Uma hierarquia de herança é formada neste tipo de herança quando uma superclasse é herdada por mais de uma classe.
# 4) Herança múltipla: Herança múltipla é aquela em que uma classe pode herdar propriedades e comportamento de mais de um pai.
# 5) Herança híbrida: Quando um ou mais tipos de herança são combinados, torna-se uma herança híbrida.
Observe que o Java oferece suporte apenas ao tipo de herança único, multinível e hierárquico usando classes. Java não oferece suporte à herança múltipla e híbrida com classes.
Agora vamos discutir cada tipo de herança em detalhes com exemplos de programação.
Herança única em Java
Uma única herança é descrita conforme mostrado abaixo:
Aqui, uma subclasse herda de uma única superclasse. Esta é uma herança única. Qualquer animal como o Cão herda da espécie Animal. Esta é a forma mais simples de herança.
A seguir está um programa Java que explica a Herança Única.
//base class:Animal class Animal { void Action_eat() { System.out.print('eating...'); } } //derived class:Dog class Dog extends Animal { void Action_bark() { System.out.print('barking...'); } } class Main{ public static void main(String args()){ Dog d=new Dog(); //create an object of derived class System.out.print('The dog is '); d.Action_bark(); //call derived class method System.out.print('
The dog is '); d.Action_eat(); //call base class method } }
Resultado:
Aqui, temos um método eat (Action_eat) na classe base Animal que é comum às espécies Animal. Temos uma classe derivada Dog que deriva da classe Animal. Na classe Dog, temos um método específico para espécies de Dog, bark (Action_bark).
Em seguida, criamos um objeto Dog no método principal e, como a classe Dog herdou a classe Animal, esse objeto pode chamar o método eat e também o método bark.
Herança multinível em Java
Na herança de vários níveis, temos uma cadeia de herança. Isso significa que temos uma classe pai que é herdada por uma classe derivada. A classe derivada, por sua vez, atua como pai de outra classe e assim por diante.
A herança de vários níveis pode ser representada como abaixo:
Como visto na figura acima, há uma classe pai A. A classe B herda da Classe A. Então, há outra classe C que, por sua vez, herda da Classe B. Assim, podemos ver que ela forma uma cadeia de herança. Aqui a classe B se torna uma classe intermediária que conecta as classes A e C.
Continuando com nosso exemplo de classe Animal abaixo, podemos ter uma classe Dog derivada da classe Animal. Então podemos ter outra classe Puppy, que é um cachorro bebê derivado da classe Dog. Dessa forma, podemos ter a herança multinível.
Um exemplo de programa para herança multinível é mostrado abaixo.
import java.util.*; import java.lang.*; import java.io.*; //parent class A class A { public void print_A() { System.out.print('SoftwareTestingHelp '); } } //Derived class B - intermediary class B extends A { public void print_B() { System.out.print('Java Series '); } } //Derived Class C class C extends B { public void print_C() { System.out.print('Tutorials'); } } public class Main { public static void main(String() args) { C c_obj = new C(); //create Class C obj c_obj.print_A(); //call grandparent class method c_obj.print_B(); //call parent class method c_obj.print_C(); //call member method } }
Resultado:
Nós programamos a cadeia exata mostrada acima. Em seguida, no método principal, criamos um objeto da classe C. O objeto da classe C pode acessar os métodos de seu pai B, bem como do avô A.
Herança hierárquica em Java
Uma classe pode ter mais de uma classe derivada dela. Portanto, temos uma base ou superclasse e mais de uma subclasse. Este tipo de herança é denominado “herança hierárquica”.
A herança hierárquica é representada em diagrama abaixo:
Como um exemplo de herança hierárquica, podemos representar a classe Animal como uma superclasse e então ter mais de um animal como Gato, Cachorro, Vaca, etc. derivados dela.
O programa Java abaixo demonstra a Herança hierárquica em Java.
//class Parent class Parent { public void print_parent() { System.out.println('In ::Parent class'); } } //child1 class class Child1 extends Parent { public void print_child1() { System.out.println('In ::Child1 class'); } } //child2 class class Child2 extends Parent { public void print_child2() { System.out.println('In ::Child2 class'); } } //child3 class class Child3 extends Parent { public void print_child3() { System.out.println('In ::Child3 class'); } } public class Main { public static void main(String() args) { Child1 ch1 = new Child1(); //create a Child1 class object ch1.print_child1(); //call its member method Child2 ch2 = new Child2(); //create a Child2 class object ch2.print_child2(); //call its member method Child3 ch3 = new Child3(); //create a Child3 class object ch3.print_child3(); //call its member method ch3.print_parent(); //call parent class method with any object } }
Resultado:
Como vemos no programa, temos uma classe pai e três classes filho derivadas deste pai. No método principal, criamos um objeto de cada uma das classes filhas e chamamos seus respectivos métodos membros.
Para chamar os métodos da classe pai, observe que podemos usar qualquer um dos objetos da classe filha, pois todos têm acesso à classe pai.
Herança múltipla em Java
Herança múltipla é uma situação em que uma classe pode herdar de mais de uma classe, ou seja, uma classe pode ter mais de um pai. Ao fazer isso, a classe pode ter mais de uma superclasse e, assim, adquirir as propriedades e o comportamento de todas as suas superclasses.
A representação esquemática da herança múltipla é mostrada abaixo:
Conforme mostrado acima, podemos derivar uma classe de mais de uma classe simultaneamente. Dessa forma, a classe derivada adquirirá os recursos de todas as suas classes pai. Isso pode dar origem a sérias ambigüidades, especialmente quando as características herdadas são as mesmas.
Nota:Java não suporta herança múltipla usando classes. Mas ele suporta herança múltipla usando interfaces que discutiremos em nosso próximo tutorial sobre herança.
Como o Java não oferece suporte a herança múltipla com classes, não entraremos em detalhes. No entanto, posteriormente no tutorial, tentaremos entender as razões por trás do Java não suportar herança múltipla.
Herança híbrida em Java
Herança híbrida é uma combinação de um ou mais tipos de heranças que discutimos acima. Qualquer combinação, entretanto, resulta em um tipo de herança múltipla que não é compatível com Java.
Uma herança híbrida pode ser representada em diagrama como a seguir.
Conseqüentemente, o Java não suporta herança híbrida tão bem com classes. Mas, como a herança múltipla, podemos implementar a herança híbrida em Java usando interfaces. Discutiremos isso em detalhes em nosso próximo tutorial.
Por que o Java não oferece suporte a herança múltipla?
Java visa a simplicidade nos programas. Isso se aplica até mesmo aos recursos OOP. Portanto, quando se trata de herança múltipla, algumas situações ambíguas podem surgir quando derivamos uma classe de mais de uma classe.
Agora vamos entender os problemas que podem surgir quando temos herança múltipla em nosso programa.
Considere os seguintes sistemas de herança múltipla.
Se observarmos o sistema acima, ele é autoexplicativo. Aqui a classe A e a classe B são classes biparentais herdadas pela classe C. Agora, mostramos que ambas as classes A e B têm um método com o mesmo nome, ou seja, print (). Portanto, quando a classe C herda A e B, ela obterá as duas versões do método print ().
Nesse caso, a classe C não saberá qual método deve herdar. Esta é a situação ambígua que mencionamos acima, que surge no caso de herança múltipla.
Conseqüentemente, o Java emite um erro do compilador quando a classe herda de mais de uma classe.
O seguinte programa Java irá demonstrar isso.
class A{ void print(){ System.out.println('Class A :: print()'); } } class B{ void print(){ System.out.println('Class B :: print()'); } } class C extends A , B{ //let C inherit from A and B } public class Main { public static void main(String() args) { C cObj = new C(); c.print(); } }
Resultado:
diferenças c ++ e java
Conforme visto na saída, o compilador Java emite um erro quando descobre que a classe estende duas classes.
Embora Java não permita que duas classes sejam herdadas simultaneamente, ele nos oferece uma maneira de contornar essa limitação. Podemos simular herança múltipla usando interfaces em vez de classes. Discutiremos isso em nossos tutoriais subsequentes.
Problema de Diamante
A herança múltipla resulta em uma situação chamada “problema do diamante”.
Considere que temos o seguinte sistema de herança.
class Super{ void show(){} } class Sub1 extends super{ void show1(){} } class Sub2 extends super{ void show2(){} } class sample extends Sub1,Sub2{ //Sample class code here }
Podemos representar esse sistema em diagrama, conforme mostrado abaixo:
Como podemos ver no diagrama acima, todo o sistema de herança aparece em forma de diamante. Por causa dessa estrutura de diamante, a ambigüidade é chamada de “Problema do Diamante”.
Conforme explicado anteriormente para herança múltipla, a ambigüidade aqui é o número múltiplo de cópias do método show () que a classe Sample obtém como resultado da herança. Como existem vários caminhos, ele atinge o método show () e há uma ambigüidade em relação a qual cópia herdar.
Tal como acontece com a herança múltipla, o problema do diamante também pode ser resolvido usando interfaces.
Regras de herança em Java
Até agora vimos os fundamentos da herança, bem como os tipos de herança em Java, vamos listar algumas regras que precisamos seguir ao desenvolver aplicativos com herança.
Regra nº 1: Java não oferece suporte a herança múltipla
Como já vimos, Java não oferece suporte a herança múltipla de nenhuma forma. Quando a herança múltipla é tentada em um programa, o compilador Java emite um erro do compilador.
Regra # 2: Java não permite herança cíclica
Uma classe que herda a si mesma para formar um ciclo é chamada de Herança Cíclica.
Considere as seguintes classes, class1 e class2.
classe class1 estende classe 2 {}
classe class2 estende classe 1 {}
A situação acima forma um loop. Isso não é permitido em Java.
Regra nº 3: Não podemos herdar membros de dados privados
Já aprendemos no tópico “Modificadores de acesso” que membros com acesso privado não podem ser herdados.
Regra nº 4: Construtores não são herdados
Como os construtores são usados para criar objetos de classe, eles não são herdados de uma classe para outra.
Regra # 5: Podemos usar referência pai para acessar objetos filhos
Já vimos vários exemplos de herança. Podemos criar uma referência do tipo classe pai e, em seguida, atribuir a ela um objeto de classe derivado criado usando a nova palavra-chave.
Se super for uma superclasse e sub for uma classe derivada de super, conforme mostrado abaixo.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Regra # 6: construtores pais são executados por causa de super () em construtores derivados
Uma das regras afirma que os construtores não podem ser herdados. Mas o construtor da superclasse pode ser executado dentro do construtor da classe derivada usando a chamada super ().
perguntas frequentes
P # 1) Qual tipo de herança não é compatível com Java?
Responda: Java não oferece suporte a herança múltipla, pois pode causar problemas em aplicativos como o problema do diamante. Java também não oferece suporte à herança híbrida, pois é uma combinação de um ou mais tipos de herança e pode, em última instância, se transformar em herança múltipla.
Q # 2) Qual dos membros da classe pode ser herdado?
Responda: Uma classe pode herdar membros públicos e protegidos de sua classe base, mas não pode acessar os membros privados da classe base.
P # 3) Por que a herança múltipla não é permitida?
Responda: A herança múltipla resulta em ambigüidade quando as classes de dois pais têm métodos com o mesmo protótipo. Nesse caso, a classe derivada enfrenta uma ambigüidade em relação a qual classe base deve herdar o método.
A herança múltipla também pode resultar em um problema de diamante em Java. Portanto, o Java não oferece suporte a herança múltipla.
P # 4) Por que você precisa de herança múltipla?
Responda: Linguagens como Java e C # reforçam a herança múltipla usando várias interfaces. Portanto, quando precisamos herdar recursos de mais de uma interface, precisamos de herança múltipla.
P # 5) Qual é o principal uso da herança multinível?
Responda: Diz-se que uma classe derivada de outra classe que por sua vez é derivada de uma terceira classe exibe herança multinível. Os níveis neste tipo de herança podem ser estendidos a qualquer número, desde que mantenha a clareza e a simplicidade.
Podemos representar diferentes níveis de espécies usando herança multinível. Do ponto de vista da programação, quando queremos representar vários níveis de classes de aplicativos, optamos pela herança multinível.
Conclusão
Neste tutorial, discutimos os tipos de herança em Java. Java oferece suporte apenas aos tipos de herança Único, Multinível e Hierárquico. Java não oferece suporte à herança múltipla e híbrida. Discutimos a ambigüidade de herança múltipla e o problema do Diamond em Java.
Em seguida, discutimos as várias regras que devemos seguir ao implementar a herança em Java. Com isso, concluímos nossa discussão sobre o relacionamento IS-A em Java.
=> Veja a série de treinamento simples em Java aqui.
Leitura recomendada
- O que é herança em Java - Tutorial com exemplos
- Herança em C ++
- Tipos de herança em C ++
- Java Basics: Java Syntax, Java Class e Core Java Concepts
- Java Integer e classe Java BigInteger com exemplos
- Tipos de classes em Java: abstrato, concreto, final, estático
- Variáveis Java e seus tipos com exemplos
- Tutorial da classe Java Scanner com exemplos