English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, vamos aprender sobre a herança em Java com exemplos.
A herança é uma das funcionalidades importantes do OOP (Programação Orientada a Objetos), que nos permite definir uma nova classe a partir de uma classe existente. Por exemplo,
classe Animal { // método eat() // método sleep() } class Dog extends Animal { // método bark() }
No Java, usamos a palavra-chave extends para herdar de uma classe. Aqui, herdamos a classe Dog da classe Animal.
Animal é a superclasse (classe pai ou classe base), e Dog é a subclasse (classe subordinada ou derivada). A subclasse herda os campos e métodos da superclasse.
Herança éé-arelação, apenas quando existem duas classes com-uma relação quando usamos herança.
Aqui estão alguns exemplos:
O carro é um veículo.
A laranja é uma fruta.
O cirurgião é um médico.
O cachorro é um animal.
class Animal { public void comer() { System.out.println("Eu posso comer"); } public void dormir() { System.out.println("Eu posso dormir"); } } class Cão extends Animal { public void latir() { System.out.println("Eu posso latir"); } } class Main { public static void main(String[] args) { Cão cão1 = new Cão(); cão1.comer(); cão1.dormir(); cão1.latir(); } }
Saída de dados
Eu posso comer Eu posso dormir I can bark
Aqui, herdamos a subclasse Dog do pai Animal. A classe Dog herda os métodos eat() e sleep() da classe Animal.
Portanto, os objetos da classe Dog podem acessar os membros da classe Dog e da classe Animal.
Nós aprendemos os modificadores de acesso private e public em aulas anteriores.
Os membros privados podem ser acessados apenas dentro da classe
Os membros publicos podem ser acessados de qualquer lugar
Você também pode definir métodos e campos como protegidos, os membros protegidos podem ser acessados
Dentro da classe
Nas subclasses
Dentro do mesmo pacote
Este é um resumo de acessibilidade dos modificadores de acesso.
modificador | classe | pacote | subclasse | global |
---|---|---|---|---|
public | Sim | Sim | Sim | Sim |
privado | Sim | Não | Não | Não |
protegido | Sim | Sim | Sim | Não |
class Animal { protected String type; private String color; public void comer() { System.out.println("Eu posso comer"); } public void dormir() { System.out.println("Eu posso dormir"); } public String getColor(){ return color; } public void setColor(String col){ color = col; } } class Cão extends Animal { public void displayInfo(String c){ System.out.println("Eu sou um ", + type); System.out.println("Minha cor é ", + c); } public void latir() { System.out.println("Eu posso latir"); } } class Main { public static void main(String[] args) { Cão cão1 = new Cão(); cão1.comer(); cão1.dormir(); cão1.latir(); cão1.type = "mammal"; cão1.setColor("preto"); cão1.displayInfo(dog1).getColor()); } }
Saída de dados
Eu posso comer Eu posso dormir I can bark Eu sou um mamífero Minha cor é preta
Aqui, o campo de tipo da classe Animal é protegido. Já acessamos este campo a partir da classe Main
cão1.type = "mammal";
Isso é viável, porque as classes Animal e Main estão no mesmo pacote (no mesmo arquivo).
Do exemplo acima, sabemos que o objeto da subclasse também pode acessar os métodos da superclasse.
O que acontece se definirmos o mesmo método tanto na superclasse quanto na subclasse?
Bem, neste caso, o método da subclasse substitui o método da superclasse. Por exemplo,
class Animal { protected String tipo = "animal"; public void comer() { System.out.println("Eu posso comer"); } public void dormir() { System.out.println("Eu posso dormir"); } } class Cão extends Animal { @Override public void comer() { System.out.println("Eu como comida para cão"); } public void latir() { System.out.println("Eu posso latir"); } } class Main { public static void main(String[] args) { Cão cão1 = new Cão(); cão1.comer(); cão1.dormir(); cão1.latir(); } }
Saída de dados
Eu como comida para cão Eu posso dormir I can bark
Aqui, o método comer() aparece tanto na superclasse Animal quanto na subclasse Cão. Criamos o objeto da subclasse Cão chamado dog1Note: The difference in calling constructors and super methods. For more information, please visit
Quando usamos dog1Quando chamamos o método eat() do objeto, será chamado o método interno do Cão, não o método idêntico da superclasse. Isso é chamado de sobrescrita de métodos.
No programa acima, usamos o comentário @Override para informar ao compilador que estamos sobrescrevendo um método. No entanto, isso não é obrigatório. No próximo tutorial, vamos entender melhorSobrescrita de métodosNote: The difference in calling constructors and super methods. For more information, please visit
Se precisar chamar o método eat() da subclasse Animal, use a chave super.
class Animal { public Animal() { System.out.println("Eu sou um animal"); } public void comer() { System.out.println("Eu posso comer"); } } class Cão extends Animal { public Cão(){ super(); System.out.println("Eu sou um cão"); } @Override public void comer() { super.comer(); System.out.println("Eu como comida para cão"); } public void latir() { System.out.println("Eu posso latir"); } } class Main { public static void main(String[] args) { Cão cão1 = new Cão(); cão1.comer(); cão1.latir(); } }
Saída de dados
Eu sou um animal Eu sou um cão Eu posso comer Eu como comida para cão I can bark
在这里,我们使用了super关键字通过super()来调用构造函数。 另外,我们使用super.eat()调用Animal超类的eat()方法。
I can barkHere, we use the super keyword to call the constructor through super(). Additionally, we use super.eat() to call the eat() method of the Animal superclass.Note: The difference in calling constructors and super methods. For more information, please visit
.
Inheritance types - There are five types of inheritance.
Single inheritance - Class B inherits only from class A.
Multi-level inheritance - Class B inherits from class A, and then class C inherits from class B.
Layered inheritance -Class A as parent class for B, C, and D.
Multiple inheritance -Class C extends interfaces A and B.Mixed inheritanceTwo or more
Inherited
Why use inheritance? Java does not support multiple inheritance and mixed inheritance through classes. However, we can implement multiple inheritance in Java through interfaces. We will learn about interfaces in the following chapters.
The most important use is the reusability of code. The code that exists in the superclass does not need to be written again in the subclass. In the following chapters, we will learn more about polymorphism.