Buscar

Herança em Java: Relação 'é um'

Prévia do material em texto

HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 1 
Herança 
Herança, em Java, nada mais é do que criar classes usando outras classes já existentes. 
Quando e como saber que é hora de usar herança em Java - Relação 'é um'. 
 
Ao estender uma classe, a classe filha tem todas as propriedades e métodos da classe base e pode-
se adicionar ou modificar métodos que se aplicam apenas a esta classe filha. Então, a classe filha 
"herda" métodos e propriedades da classe "mãe". 
 
HERANÇA MÚLTIPLA: uma sub-classe herda características de mais de uma super-classe. 
Algumas linguagens orientadas a objetos não suportam herança múltipla, por exemplo a 
linguagem Java. 
GENERALIZAÇÃO 
Determinando uma “Generalização”, já que Tecnico é um tipo de Empregado. Isso significa 
dizer que o Tecnico tem, além de matrícula, nome, uma terceira informação, o título, ou 
seja, podemos dizer que a classe Tecnico herda os atributos da classe Empregado, e define 
seus próprios atributos. 
pode-se representar em java o sistema acima como: 
class Empregado //Classe construtora Empregado 
{ String matricula; //Se private, não poderá ser instanciada por outra classe 
 String nome;} 
class Tecnico extends Empregado // Classe construtora Tecnico 
{ String titulo; 
} 
Empregado 
 
matricula 
nome 
 
Tecnico 
 
titulo 
Tecnico 
 
titulo 
 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 2 
Podemos observar que os atributos matricula, nome foram definidos na classe Empregado 
(também chamada superclasse), e a classes Técnico (também chamada subclasse) utiliza tais 
atributos pois herda os atributos da superclasse da qual é derivada. 
No código acima, criamos a classe Técnico por herança da classe Empregado utilizando o nome 
desta após o comando extends: 
 
public class Tecnico extends Empregado 
 
O que faz com que tudo aquilo Empregado contenha, Tecnico passe a ter, e qualquer modificação 
na classe Empregado, refletirá na classe Tecnico, por exemplo, a alteração do atributo matricula 
de String para int. 
Só falta a classe que instanciará os objetos das classes Empregado e Tecnico, que é o termo 
correto para dizer que um determinado objeto é objeto de uma dada classe, ou seja, para utilizar os 
atributos e métodos definidos em uma classe, precisamos utilizar um objeto daquela classe, o que 
significa dizer que precisamos instanciar um objeto daquela classe. 
A classe que instanciará os objetos será chamada de TestaHeranca, tendo seu código-
fonte definido a seguir. 
public class TestaHeranca 
{ public static void main(String[] args) 
 { Empregado e; 
 Tecnico t; 
 e = new Empregado(); 
 t = new Tecnico(); 
 e.nome = "Joao"; 
 e.matricula = "E1"; 
 t.nome = "Jose"; 
 t.matricula = "T1"; 
 t.titulo = "Dr. "; 
 System.out.println ("\nOFICINA - HERANÇA EM JAVA"); 
 System.out.println ("\n\nPROF. EDIBERTO MARIANO \n\n"); 
 System.out.println ("\nDADOS DA SUPERCLASSE EMPREGADO"); 
 System.out.println ("Matricula: "+ e.matricula + "\nNome: " + e.nome); 
 System.out.println ("\nDADOS DA SUBCLASSE TECNICO"); 
 System.out.println ("Matricula: "+ t.matricula + "\nNome: " + t.titulo + t.nome); 
 } 
} 
SAÍDA 
 
Vejamos então outro exemplo: suponha que numa firma hipotética, os empregados sejam 
identificados por suas matrículas e nomes. Há, porém, duas subclasses de empregados: 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 3 
os vendedores e os técnicos. Os vendedores têm uma comissão sobre o salário e os 
técnicos têm um título (advogado, engenheiro, etc.). 
 
 
Implementando este projeto em JAVA, temos: 
- Classe construtora Empregado: 
 
public class Empregado 
{ 
 String matricula; 
 String nome; 
 double salario; 
} 
- Classe construtora Vendedor: 
public class Vendedor extends Empregado 
{ 
double comissao; 
} 
 
- Classe construtora Tecnico: 
 
public class Tecnico extends Empregado 
{ 
String titulo; 
} 
 
Empregado 
 
matricula 
nome 
salario 
Vendedor 
 
comissao 
Tecnico 
 
titulo 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 4 
Podemos observar que os atributos matricula, nome e salario foram definidos na classe Empregado 
(também chama superclasse), e as classes Vendedor e Técnico (também chamadas subclasses) 
utilizam tais atributos pois herdam-nos da super classe da qual são derivadas. 
No código acima, criamos a classe Vendedor por herança da classe Empregado utilizando o nome 
desta após o comando extends: 
 
public class Vendedor extends Empregado 
 
O que faz com que tudo aquilo Empregado contenha, Vendedor passe a ter, e qualquer modificação 
na classe Empregado, refletirá na classe Vendedor (bem como na classe Tecnico), por exemplo, a 
alteração do atributo matricula de String para int. 
Só falta a classe que instanciará os objetos das classes Empregado, Vendedor e Tecnico, que é o 
termo correto para dizer que um determinado objeto é objeto de uma dada classe, ou seja, para 
utilizar os atributos e métodos definidos em uma classe, precisamos utilizar um objeto daquela 
classe, o que significa dizer que precisamos instanciar um objeto daquela classe. 
 
A classe que instanciará os objetos será chamada de Firma, tendo seu código-fonte 
definido a seguir. 
 
public class Firma 
{ 
 public static void main(String[] args) 
 { 
 Empregado e; 
 Vendedor v; 
 Tecnico t; 
 
 e = new Empregado(); 
 v = new Vendedor(); 
 t = new Tecnico(); 
 
 e.nome = "Joao"; 
 e.matricula = "E1"; 
 e.salario = 100.00; 
 
 v.nome = "Pedro"; 
 v.matricula = "V1"; 
 v.salario = 500.00; 
 v.comissao = 20; 
 
 t.nome = "Jose"; 
 t.matricula = "T1"; 
 t.salario = 900.30 ; 
 t.titulo = "Dr. "; 
 
 System.out.println ("Matricula: "+ e.matricula + 
 " Nome: " + e.nome + 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 5 
 " Salario: R$ " + e.salario); 
 
 System.out.println ("Matricula: "+ v.matricula + 
 " Nome: " + v.nome + " Salario: R$ " + v.salario + " (ja incluida a 
 comissao de: " + v.comissao + " %)"); 
 
 System.out.println ("Matricula: "+ t.matricula + 
 " Nome: " + t.titulo + t.nome + 
 " Salario: R$ " + t.salario); 
 System.out.println ("\n"); 
 } 
} 
 
Salve-o como Firma.java, compile-o (as outras classes serão compiladas automaticamente), e 
execute com java Firma. 
Saída: 
 
 
 
 
 
EXERCÍCIOS 
QUESTÃO 21 (P.O.O) 
O paradigma de programação orientado a objetos tem sido largamente utilizado no desenvolvimento de 
sistemas. 
Considerando o conceito de herança, avalie as afirmações abaixo. 
 
 I Herança é uma propriedade que facilita a implementação de reuso. 
 II Quando uma subclasse é criada, essa herda todas as características da superclasse, não podendo 
 possuir propriedades e métodos próprios. 
 III Herança múltipla é uma propriedade na qual uma superclasse possui diversas subclasses. 
 IV Extensão é uma das formas de se implementar herança. 
É correto apenas o que se afirma em 
 
A I. 
B III. 
C I e IV. 
D II e III. 
E II e IV. 
 
 
 
 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 6 
 
HERANÇA OUTRA FORMA DE SER IMPLEMENTADA - uso do SUPER( ) 
USANDO INSTANCIAÇÃO, OBJETOS E MÉTODOS 
SUPER( ) - execução do construtorde superclasses em uma generalização 
SUPER – Palavra reservada que indica a execução do construtor de superclasses em uma 
generalização. 
 O uso do SUPER permite invocar construtores da classe pai. 
 SUPER – acessa o método construtor da classe que está herdada (classe pai). 
Como estamos tratando de herança de classes, toda classe tem seu método construtor. Portanto, se 
estamos trabalhando com duas classes, temos dois métodos construtores. Para acessarmos o 
método construtor da classe que está sendo herdada usamos o super(). 
Podemos usar o super para qualquer construtor da classe pai, pois o Java consegue diferenciar os 
construtores por causa da sobrecarga de métodos. 
Herança múltipla, em orientação a objetos, é o conceito de herança de duas ou mais classes. Ela 
é implementada nas linguagens de programação C++ e em Python, por exemplo. A linguagem 
Java possui apenas herança simples (uma classe possui no máximo uma classe pai), mas 
permite que uma classe implemente várias interfaces. 
EXEMPLO: 
class Empregado //Classe construtora Empregado 
{ int matricula; //obs se private String nome, NÃO PODERÁ SER INSTANCIADA POR OUTRA CLASSE 
 String nome; //obs se private String nome, NÃO PODERÁ SER INSTANCIADA POR OUTRA CLASSE 
 
 public Empregado(int matricula, String nome) 
 { this.matricula=matricula; 
 this.nome = nome; 
 } 
} 
Empregado 
 
matricula 
nome 
 
Tecnico 
 
titulo 
Tecnico 
 
titulo 
 
Método 
Construtor 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 7 
class Tecnico extends Empregado // Classe construtora Tecnico 
{ String titulo; 
 //método construtor 
 public Tecnico(int matricula, String nome, String titulo) 
 { super (matricula, nome); //atributos que são compartilhados da SUPER CLASSE 
 this.titulo = titulo; 
 } 
} 
public class TestaHeranca //CLASSE INSTANCIADORA 
{ public static void mostrarTecnico(Tecnico obj) 
 { System.out.println ("\nOFICINA - HERANÇA EM JAVA - USO DO METODO SUPER()"); 
 System.out.println ("\n\nPROF. EDIBERTO MARIANO \n"); 
 System.out.print("\n\tDados da classe TÉCNICO\n"); 
 System.out.print("\n\tMatricula-----: "+obj.matricula); 
 System.out.print("\n\tNome----------: "+obj.nome); 
 System.out.print("\n\tTitulo----------: "+obj.titulo); 
 } 
 public static void main(String[] args) 
 { 
 Tecnico tecnico = new Tecnico(1172, "Ediberto Mariano da Silva", "Analista de Sistemas"); 
 mostrarTecnico(tecnico); 
 } 
} 
 Obs. 
 A utilização da cláusula THIS (acima), faz referência ao atributo da classe dentro da qual se 
está trabalhando. 
 OBJETO – É uma instância de classe. Para instanciar uma classe em Java, deve-se usar o 
Método Construtor. 
 
Característica do Método Construtor 
 - Deve ter o mesmo nome da classe; 
 - Não pode possuir retorno. 
 
Obs. 
 - O acesso aos atributos e aos métodos privados só pode ser feito a partir dos métodos 
membros da classe. 
 - Quando um objeto é criado, ele usa o bloco construtor da classe. 
 - Toda classe possui implicitamente o bloco construtor. 
 
Classes Abstratas 
- Ao subir na hierarquia de heranças, as classes tornam-se mais genéricas. A classe ancestral 
pode tornar-se tão geral que acaba sendo vista mais como um modelo para outras classes do 
que como uma classe com instâncias específicas. 
- Uma classe declarada abstrata não pode ser instanciada, nenhum objeto desta classe 
pode ser criado. É como se ela estivesse incompleta, servindo apenas como contêiner para os 
campos comuns das subclasses. 
- Um método abstrato promete que todas as subclasses da classe abstrata que o 
contém irão implementar este método. Ou seja, se a classe abstrata contém um método 
Método 
Construtor 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 8 
abstrato, deve-se implementar os métodos concretos para este método nas subclasses. Os 
métodos abstratos servem apenas como declaração dos métodos concretos. 
- Quando uma subclasse de uma classe abstrata não implementa todos os métodos abstratos 
que herda, ela também é abstrata, não podendo ser instanciada. 
- Métodos static, private e final não podem ser abstract, uma vez que métodos destes 
tipos não podem ser substituídos por uma subclasse. Uma classe final não pode conter 
nenhum método abstract, pois não há subclasses para classes final. 
- As classes abstratas podem possuir métodos abstratos e métodos concretos. 
- No nosso exemplo Firma, se definíssemos a classe Empregado como abstract, não 
poderíamos instanciar objetos desta classe, e a mesma serviria apenas como modelo para 
Vendedor e Tecnico (tente modificar o código, retirando também a instanciação de 
Empregado). 
 
EXERCICIOS: 
O paradigma de programação orientado a objetos tem sido largamente utilizado no 
desenvolvimento de sistemas. Considerando o conceito de herança, avalie as afirmações abaixo. 
I – Herança é uma propriedade que facilita a implementação de reuso. 
II – Quando uma subclasse é criada, essa herda todas as características da superclasse, não 
podendo possuir propriedades e métodos próprios. 
III – Herança múltipla é uma propriedade na qual uma superclasse possui diversas subclasses. 
IV – Extensão é uma das formas de se implementar herança. 
 
É correto apenas o que se afirma em 
A – I. 
B – III. 
C – I e IV. 
D – II e III. 
E – II e IV. 
 
Exercício 
Tomando como base as três classes apresentadas abaixo, diga o que será exibido após execução 
das mesmas. 
class A { 
 A() { 
 System.out.println("A"); 
 } 
 A(int valor) { 
HERANÇA, CLASSE ABSTRATA - PROFESSOR: EDIBERTO MARIANO 
 9 
 System.out.println("A: " + valor); 
 } 
} 
class B extends A { 
 B() { 
 System.out.println("B"); 
 } 
 B(int valor) { 
 super(valor); 
 } 
} 
public class Heranca01 { 
 public static void main(String[] args) { 
 A a = new A(); 
 B b = new B(); 
 A a2 = new B(3); 
 } 
} 
Resposta:

Mais conteúdos dessa disciplina