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.