Java - Herança

A herança pode ser definida como o processo em que uma classe adquire as propriedades (métodos e campos) de outra. Com o uso de herança, as informações são gerenciáveis ​​em uma ordem hierárquica.

A classe que herda as propriedades de outra é conhecida como subclasse (classe derivada, classe filha) e a classe cujas propriedades são herdadas é conhecida como superclasse (classe base, classe pai).

estende a palavra-chave

extendsé a palavra-chave usada para herdar as propriedades de uma classe. A seguir está a sintaxe da palavra-chave extends.

Syntax

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

Código de amostra

A seguir está um exemplo que demonstra a herança Java. Neste exemplo, você pode observar duas classes, a saber, Calculation e My_Calculation.

Usando a palavra-chave extends, o My_Calculation herda os métodos add () e Subtraction () da classe Calculation.

Copie e cole o seguinte programa em um arquivo com o nome My_Calculation.java

Example

class Calculation {
   int z;
	
   public void addition(int x, int y) {
      z = x + y;
      System.out.println("The sum of the given numbers:"+z);
   }
	
   public void Subtraction(int x, int y) {
      z = x - y;
      System.out.println("The difference between the given numbers:"+z);
   }
}

public class My_Calculation extends Calculation {
   public void multiplication(int x, int y) {
      z = x * y;
      System.out.println("The product of the given numbers:"+z);
   }
	
   public static void main(String args[]) {
      int a = 20, b = 10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Subtraction(a, b);
      demo.multiplication(a, b);
   }
}

Compile e execute o código acima conforme mostrado abaixo.

javac My_Calculation.java
java My_Calculation

Depois de executar o programa, ele produzirá o seguinte resultado -

Output

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

No programa fornecido, quando um objeto para My_Calculationclasse é criada, uma cópia do conteúdo da superclasse é feita dentro dela. É por isso que, usando o objeto da subclasse, você pode acessar os membros de uma superclasse.

A variável de referência da Superclasse pode conter o objeto da subclasse, mas usando essa variável você pode acessar apenas os membros da superclasse, portanto, para acessar os membros de ambas as classes, é recomendado sempre criar variáveis ​​de referência para a subclasse.

Se você considerar o programa acima, poderá instanciar a classe conforme fornecido a seguir. Mas usando a variável de referência da superclasse (cal neste caso) você não pode chamar o método multiplication(), que pertence à subclasse My_Calculation.

Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);

Note- Uma subclasse herda todos os membros (campos, métodos e classes aninhadas) de sua superclasse. Os construtores não são membros, portanto, não são herdados pelas subclasses, mas o construtor da superclasse pode ser chamado a partir da subclasse.

A super palavra-chave

o super palavra-chave é semelhante a thispalavra-chave. A seguir estão os cenários em que a palavra-chave super é usada.

  • É usado para differentiate the members da superclasse dos membros da subclasse, se eles tiverem os mesmos nomes.

  • É usado para invoke the superclass construtor da subclasse.

Diferenciando os membros

Se uma classe está herdando as propriedades de outra classe. E se os membros da superclasse têm os mesmos nomes que os da subclasse, para diferenciar essas variáveis ​​usamos superpalavra-chave conforme mostrado abaixo.

super.variable
super.method();

Código de amostra

Esta seção fornece um programa que demonstra o uso do super palavra-chave.

No programa fornecido, você tem duas classes, nomeadamente Sub_class e Super_class , ambas têm um método denominado display () com implementações diferentes e uma variável denominada num com valores diferentes. Estamos invocando o método display () de ambas as classes e imprimindo o valor da variável num de ambas as classes. Aqui você pode observar que usamos a palavra-chave super para diferenciar os membros da superclasse da subclasse.

Copie e cole o programa em um arquivo com o nome Sub_class.java.

Example

class Super_class {
   int num = 20;

   // display method of superclass
   public void display() {
      System.out.println("This is the display method of superclass");
   }
}

public class Sub_class extends Super_class {
   int num = 10;

   // display method of sub class
   public void display() {
      System.out.println("This is the display method of subclass");
   }

   public void my_method() {
      // Instantiating subclass
      Sub_class sub = new Sub_class();

      // Invoking the display() method of sub class
      sub.display();

      // Invoking the display() method of superclass
      super.display();

      // printing the value of variable num of subclass
      System.out.println("value of the variable named num in sub class:"+ sub.num);

      // printing the value of variable num of superclass
      System.out.println("value of the variable named num in super class:"+ super.num);
   }

   public static void main(String args[]) {
      Sub_class obj = new Sub_class();
      obj.my_method();
   }
}

Compile e execute o código acima usando a seguinte sintaxe.

javac Super_Demo
java Super

Ao executar o programa, você obterá o seguinte resultado -

Output

This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20

Invocando o Construtor de Superclasse

Se uma classe está herdando as propriedades de outra classe, a subclasse adquire automaticamente o construtor padrão da superclasse. Mas se você deseja chamar um construtor parametrizado da superclasse, você precisa usar a palavra-chave super conforme mostrado abaixo.

super(values);

Código de amostra

O programa fornecido nesta seção demonstra como usar a palavra-chave super para invocar o construtor parametrizado da superclasse. Este programa contém uma superclasse e uma subclasse, onde a superclasse contém um construtor parametrizado que aceita um valor inteiro, e usamos a palavra-chave super para invocar o construtor parametrizado da superclasse.

Copie e cole o seguinte programa em um arquivo com o nome Subclass.java

Example

class Superclass {
   int age;

   Superclass(int age) {
      this.age = age; 		 
   }

   public void getAge() {
      System.out.println("The value of the variable named age in super class is: " +age);
   }
}

public class Subclass extends Superclass {
   Subclass(int age) {
      super(age);
   }

   public static void main(String args[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}

Compile e execute o código acima usando a seguinte sintaxe.

javac Subclass
java Subclass

Ao executar o programa, você obterá o seguinte resultado -

Output

The value of the variable named age in super class is: 24

Relacionamento IS-A

IS-A é uma forma de dizer: este objeto é um tipo desse objeto. Vamos ver como oextends palavra-chave é usada para obter herança.

public class Animal {
}

public class Mammal extends Animal {
}

public class Reptile extends Animal {
}

public class Dog extends Mammal {
}

Agora, com base no exemplo acima, em termos orientados a objetos, o seguinte é verdadeiro -

  • Animal é a superclasse da classe Mammal.
  • Animal é a superclasse da classe Reptile.
  • Mamífero e Réptil são subclasses da classe Animal.
  • Cachorro é a subclasse das classes Mamíferos e Animais.

Agora, se considerarmos o relacionamento IS-A, podemos dizer -

  • Mamífero É-Um Animal
  • Réptil É-Um Animal
  • Cão é um mamífero
  • Portanto: Cachorro É-Um Animal também

Com o uso da palavra-chave extends, as subclasses serão capazes de herdar todas as propriedades da superclasse, exceto as propriedades privadas da superclasse.

Podemos garantir que Mammal é realmente um Animal com o uso do operador de instância.

Example

class Animal {
}

class Mammal extends Animal {
}

class Reptile extends Animal {
}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

Isso produzirá o seguinte resultado -

Output

true
true
true

Uma vez que temos um bom entendimento do extends palavra-chave, vejamos como o implements palavra-chave é usada para obter o relacionamento IS-A.

Geralmente, o implementspalavra-chave é usada com classes para herdar as propriedades de uma interface. As interfaces nunca podem ser estendidas por uma classe.

Example

public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

A instância da palavra-chave

Vamos usar o instanceof operador para verificar se o mamífero é realmente um animal e se o cão é realmente um animal.

Example

interface Animal{}
class Mammal implements Animal{}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

Isso produzirá o seguinte resultado -

Output

true
true
true

Relação HAS-A

Essas relações são baseadas principalmente no uso. Isso determina se uma certa classeHAS-Adeterminada coisa. Essa relação ajuda a reduzir a duplicação de código e também os bugs.

Vejamos um exemplo -

Example

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
}

Isso mostra que a classe Van HAS-A Speed. Por ter uma classe separada para Speed, não precisamos colocar todo o código pertencente a speed dentro da classe Van, o que torna possível reutilizar a classe Speed ​​em vários aplicativos.

No recurso Orientado a Objetos, os usuários não precisam se preocupar com qual objeto está fazendo o trabalho real. Para conseguir isso, a classe Van oculta os detalhes de implementação dos usuários da classe Van. Então, basicamente o que acontece é que os usuários pediriam à classe Van para fazer uma determinada ação e a classe Van faria o trabalho sozinha ou pediria a outra classe para executar a ação.

Tipos de herança

Existem vários tipos de herança, conforme demonstrado abaixo.

Um fato muito importante a lembrar é que Java não oferece suporte a herança múltipla. Isso significa que uma classe não pode estender mais de uma classe. Portanto, seguir é ilegal -

Example

public class extends Animal, Mammal{}

No entanto, uma classe pode implementar uma ou mais interfaces, o que ajudou o Java a se livrar da impossibilidade de herança múltipla.