You are on page 1of 46

1

Engenharia de Computao




Prof: Jos Antonio Gonalves


zag655@gmail.com

- Orientao a Objetos em Java:


- Definies e aplicao do conceito de Herana;
- Classe concreta vs. classe abstrata;
- Polimorfismo com sobrescrita;
- Mtodo concreto vs. mtodo concreto;

Herana

Herana (definio): mecanismo que possibilita a


construo de uma classe (classe filha) com base
numa classe j existente (classe me).
Importante: embora exista o conceito de Herana
Mltipla, que pode ser implementado em outras
linguagens que suportam Orientao a Objetos, como
C++ por exemplo, Java no oferece esta
possibilidade. A maneira de se lidar com estas
necessidade de Projeto atravs de uma estrutura de
dados chamada Interface (que ser abordada mais a
frente)
5

Para a construo da Aplicao imagine o seguinte Diagrama de Classes:


+ Pessoa
- int rg;
- String nome;
+ setRg();
+ setNome();
+ getRg();
+ getNome();

+ Aluno

+ Professor

- int ra;
- String turma;

- int siape;
- String titulo;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();

+ setSiape();
+ setTitulo();
+ getSiape();
+ getTitulo();
+Inicio

+ main()

Podemos observar neste diagrama uma classe chamada Pessoa, composta


por:
2 atributos (privados): rg (interio) e nome (String)
4 mtodos (pblicos): setRg(), setNome(), getRg(), getNome() e Calc1();

+ Pessoa
- int rg;
- String nome;
+ setRg();
+ setNome();
+ getRg();
+ getNome();

O cdigo para a criao desta classe Pessoa ser:


public class Pessoa{
private int rg;
private String nome;

+ Pessoa

public Pessoa( ) { }
public Pessoa(int rg, String nome){
this.rg = rg;
this.nome = nome;
}
public void setRg(int rg){
this.rg = rg;
}
public void setNome(String nome){
this.nome = nome;
}
public int getRg(){
return rg;
}
public int getNome(){
return nome;
}

- int rg;
- String nome;
+ setRg();
+ setNome();
+ getRg();
+ getNome();

}
8

A classe chamada Aluno composta por:


2 atributos (privados): ra (interio) e turma (String)
4 mtodos (pblicos): setRa(), setTurma(), getRa(), getTurma() e Calc1();
+ Aluno
- int ra;
- String turma;
+ setRa();
+ setTurma();
+ getRa();
+ getTurma();

Porm, observe no diagrama que a classe Aluno herda a classe pessoa. Isso
pode ser observado pelo tringulo presente na ligao entre Aluno e Pessoa.
Ele indica a existncia do mecanismo de Herana. No cdigo fonte esta herana
ser definida pela palavra extends.
+ Pessoa
- int rg;
- String nome;
+ setRg();
+ setNome();
+ getRg();
+ getNome();

+ Aluno

- int ra;
- String turma;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();

10

public class Aluno extends Pessoa{


private int ra;
private String turma;
public Aluno( ) { }
public Aluno(int ra, String turma){
this.ra = ra;
this.turma = turma;
}
public void setRa(int ra){
this.ra = ra;
}
public void setTurma(String turma){
this.turma= turma;
}
public int getRa(){
return ra;
}
public int getTurma(){
return turma;
}

+ Aluno
- int ra;
- String turma;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();

Observe o
Polimorfismo com
sobrecarga tambm
na classe Aluno!

11

A classe chamada Professor composta por:


2 atributos (privados): siape (interio) e titulo (String)
4 mtodos (pblicos): setSiape(), setTitulo(), getSiape(), getTitulo()

+ Professor
- int siape;
- String titulo;
+ setSiape();
+ setTitulo();
+ getSiape();
+ getTitulo();

12

Da mesma forma coma a classe Aluno herda a classe Pessoa, a classe


Professor tambm herda a classe Pessoa:
+ Pessoa
- int rg;
- String nome;
+ setRg();
+ setNome();
+ getRg();
+ getNome();

+ Professor

- int siape;
- String titulo;

+ setSiape();
+ setTitulo();
+ getSiape();
+ getTitulo();

13

public class Professor extends Pessoa{


private int siape;
private String titulo;
public Professor( ) { }
public Professor(int siape, String titulo){
this.siape = siape;
this.titulo = titulo;
}
public void setSiape(int siape){
this.siape = siape;
}
public void setTitulo(String titulo){
this.titulo= titulo;
}
public int getSiape(){
return siape;
}
public int getTitulo(){
return titulo;
}
}

+ Professor
- int siape;
- String titulo;
+ setSiape();
+ setTitulo();
+ getSiape();
+ getTitulo();

Observe o
Polimorfismo com
sobrecarga tambm
na classe Professor!
14

E por fim a classe Inicio, que, neste caso, composta apenas pelo mtodo
main( ). No tem nenhum outro mtodo ou atributo.
+Inicio

+ main()

Nesta modelagem, a classe Inicio a nica que faz Troca de Mensagens


com as outras classes (Aluno e Professor que no se comunicam diretamente
entre si).
Esta troca de mensagens se d pela declarao de objetos dos tipos de
classes e pela invocao dos mtodos atravs dos objetos declarados. Veja
parte do cdigo:
15

Testando a Herana (codificao de Inicio)


Declarando 2 objetos:

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
Professor p = new Professor();
a.setRg(1);
a.setNome(Jesus);

a do tipo Aluno
e
p do tipo Professor
Utilizao do Mecanismo de Herana pelo
objeto a (que do tipo Aluno) atravs dos
mtodos gets e sets (herdados de
Pessoa) que por sua vez instanciam os
atributos tambm herdados de Pessoa: rg e
nome

a.setRa(10);
a.setTurma(A);
System.out.println(\n Rg: +a.getRg());
System.out.println(\n Rg: +a.getNome());
System.out.println(\n Rg: +a.getRa());
System.out.println(\n Rg: +a.getTurma());
}
}

A classe Inicio Trocando Mensagens


com a classe Aluno atravs do objeto
a, que do tipo Aluno.

Exerccios: At aqui temos somente de parte do cdigo (Aluno). Faltou a parte que trata do Professor.
Termine o cdigo (parte do Professor) na classe Incio.
16

Classe Abstrata

17

At agora trabalhamos com classes concretas, isto , classes das quais


podemos declarar e instanciar (new...), de forma direta, objetos de seu tipo.

Por exemplo: dentro da classe Incio, utilizada anteriormente, alm dos objetos
dos tipos Aluno e Professor, que fazem parte daquele exemplo, tambm
poderia declarar e instanciar um objeto do tipo Pessoa e atravs deste utilizar
os membros pblicos de Pessoa, como mostra o cdigo a seguir:

18

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
Professor p = new Professor();

Declarando e

instanciando 1
objeto:
pes do tipo Pessoa

Pessoa pes = new Pessoa();


pes.setRg(1);
pes.setNome(Jesus);
System.out.println(\n Rg: +pes.getRg());
System.out.println(\n Rg: +pes.getNome());
}

19

Observe que conseguiu declarar e instanciar (e utilizar) um objeto do tipo


Pessoa, pois ela, at ento uma classe Concreta. Assim como Aluno e
Professor.
Mas poderia haver uma situao na qual no devesse ser permitida a
declarao direta de uma Pessoa que no fosse Aluno ou Professor.
Para resolver este problema deveramos declarar a classe Pessoa como
abstrata pois:
Classe abstrata:
- Embora seja possvel declarar um objeto de seu tipo, no possvel
instanciar este objeto;
- Quase sempre usada com classe como classe base (classe me) num
mecanismo de herana.
Faa o teste: altere a classe Pessoa, na linha de definio da classe coloque
a especificao de acesso abstract(vide prximo slide), depois teste novamente a
classe Incio.
20

Alterao da classe Pessoa:


abstract class Pessoa{
private int rg;
private String nome;
public Pessoa( ) { }
public Pessoa(int rg, String nome){
this.rg = rg;
this.nome = nome;
}
public void setRg(int rg){
this.rg = rg;
}
public void setNome(String nome){
this.nome = nome;
}
public int getRg(){
return rg;
}
public int getNome(){
return nome;
}

Nota: Aps fazer esta alterao teste


novamente a classe Inicio que deve ter o
cdigo parecido com o apresentado no
prximo slide

}
21

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
Professor p = new Professor();

Pessoa pes = new Pessoa();


pes.setRg(1);
pes.setNome(Jesus);
System.out.println(\n Rg: +pes.getRg());
System.out.println(\n Rg: +pes.getNome());
:
:
:
}

}
Nota: Observe o erro logo na compilao
do cdigo.

22

Polimorfismo
com Sobrescrita

23

Mtodos com a mesma assinatura em classes distintas mas envolvidas


num mecanismo de herana
- Implementao atravs de dois tipos de mtodos:
-Mtodo abstrato:
- Contido numa classe abstrata (classe-me);
- No apresenta corpo na classe-me. Somente sua assinatura;
- Torna obrigatrio sua implementao (sobrescrio) na classe-filha.
-Mtodo concreto:
- Pode estar contido numa classe concreta ou abstrata;
- Pode apresentar corpo na classe-me;
- Sua re-implementao (sobrescrio) na classe filha opcional.

24

Polimorfismo com Sobrescrita utilizando

Mtodos Concretos

25

Observe o diagrama de classes (vamos usar somente as classes Pessoa, Aluno e Inicio
para exemplificar):
+ Pessoa
- int rg;
- String nome;
+ setRg();
+ setNome();
+ getRg();
+ getNome();
+ mostraClasse();

+ Aluno

- int ra;
- String turma;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();
+Inicio

+ main()

26

classe Pessoa:
public class Pessoa{
private int rg;
private String nome;

+ Pessoa

public void setRg(int rg){


this.rg = rg;
- int rg;
}
- String nome;
public void setNome(String nome){
this.nome = nome;
}
+ setRg();
public int getRg(){
+ setNome();
return rg;
}
+ getRg();
public int getNome(){
+ getNome();
return nome;
}
+ mostraClasse();
public void mostraClasse(){
System.out.println(\n Estou na classe Pessoa));
}
}

27

classe Aluno:
public class Aluno extends Pessoa{
private int ra;
private String turma;
public void setRa(int ra){
this.ra = ra;
}
public void setTurma(String turma){
this.turma= turma;
}
public int getRa(){
return ra;
}
public int getTurma(){
return turma;
}

+ Aluno
- int ra;
- String turma;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();

}
Nota: Ainda no h a sobrescrio
do mtodo mostraClasse( ) herdado
da classe Pessoa.

28

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
a.setRg(1);
a.setNome(Jesus);
a.setRa(10);
a.setTurma(A);
System.out.println(\n Rg: +a.getRg());
System.out.println(\n Rg: +a.getNome());
System.out.println(\n Rg: +a.getRa());
System.out.println(\n Rg: +a.getTurma());
a.mostraClasse();
}

Ainda no h a sobrescrio. Logo estar


utilizando o mtodo herdado da classe
Pessoa. Observe a mensagem que ir aparecer
ao executar esta linha

}
29

public class Aluno extends Pessoa{


private int ra;
private String turma;

+ Aluno

public void setRa(int ra){


this.ra = ra;
}
public void setTurma(String turma){
this.turma= turma;
}
public int getRa(){
return ra;
}
public int getTurma(){
return turma;
}
public mostraClasse(){
System.out.println(\nEstou na classe Aluno));
}

- int ra;
- String turma;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();

Nota: Atente para a sobrescrio do mtodo


na classe Aluno. Lembre-se este mtodo j
foi herdado da classe Pessoa e tinha uma
implementao.
30

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
a.setRg(1);
a.setNome(Jesus);
a.setRa(10);
a.setTurma(A);
System.out.println(\n Rg: +a.getRg());
System.out.println(\n Rg: +a.getNome());
System.out.println(\n Rg: +a.getRa());
System.out.println(\n Rg: +a.getTurma());
a.mostraClasse();
}

Agora h a sobrescrio. Ento estar utilizando o


mtodo sobrescrito da prpria classe Aluno.
Novamente, observe a mensagem que ir
aparecer ao executar esta linha.

}
31

Uma pergunta?
E se, mesmo tendo um mtodo sobrecarregado, eu quiser utilizar o
mtodo original da classe me?

super

R.: Para isso poder utilizar o objeto


. Este objeto usado
para apontar para um membro da classe-me (num mecanismo de
herana).
Para exemplificar, veja o cdigo do mtodo mostraMae() . Que no caso
dever estar contido na classe filha Aluno:

32

public class Aluno extends Pessoa{


private int ra;
private String turma;

+ Aluno

- int ra;
public void setRa(int ra){
this.ra = ra;
- String turma;
}
public void setTurma(String turma){
this.turma= turma;
+ setRa();
}
+ setTurma();
public int getRa(){
+ getRa();
return ra;
+ getTurma();
}
+ mostraMae();
public int getTurma(){
return turma;
}
public void mostraClasse(){
System.out.println(\n RG da classe Aluno: +(rg+100));
}
public void mostraMae(){

super.motraClasse();
}
}

Nota: no mtodo mostraMae() temos uma


chamada do mtodo mostraClasse() contido na
classe-me Pessoa (atravs do apontamento do
objeto super).
33

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
a.setRg(1);
a.setNome(Jesus);
a.setRa(10);
a.setTurma(A);
System.out.println(\n Rg: +a.getRg());
System.out.println(\n Rg: +a.getNome());
System.out.println(\n Rg: +a.getRa());
System.out.println(\n Rg: +a.getTurma());

Executar o mostraClasse() da classe Aluno

a.mostraClasse();
a.mostraMae();

Executar, indiretamente, o
mostraClasse() da classe Pessoa

}
}

34

Polimorfismo com Sobrescrita utilizando

Mtodos Abstratos

35

Observe o diagrama de classes (vamos usar somente as classes Pessoa, Aluno e Inicio
para exemplificar):
+ abstract Pessoa
- int rg;
- String nome;
+ setRg();
+ setNome();
+ getRg();
+ getNome();
+ abstract mostraClasse();

+ Aluno

- int ra;
- String turma;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();
+Inicio

+ main()

36

+ abstract Pessoa

classe Pessoa:

- int rg;
- String nome;

public abstract class Pessoa{


private int rg;
private String nome;

+ setRg();
+ setNome();
+ getRg();
+ getNome();
+ abstract mostraClasse();

public void setRg(int rg){


this.rg = rg;
}
public void setNome(String nome){
this.nome = nome;
}
public int getRg(){
return rg;
}
public int getNome(){
return nome;
}
abstract void mostraClasse();
}

Nota:
Mtodo abstrato, somente assinatura

37

classe Aluno:
public class Aluno extends Pessoa{
private int ra;
private String turma;
public void setRa(int ra){
this.ra = ra;
}
public void setTurma(String turma){
this.turma= turma;
}
public int getRa(){
return ra;
}
public int getTurma(){
return turma;
}

+ Aluno
- int ra;
- String turma;

+ setRa();
+ setTurma();
+ getRa();
+ getTurma();

}
Nota: Ainda no h a sobrescrio
do mtodo mostraClasse herdado da
classe Pessoa.

38

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
a.setRg(1);
a.setNome(Jesus);
a.setRa(10);
a.setTurma(A);
System.out.println(\n Rg: +a.getRg());
System.out.println(\n Rg: +a.getNome());
System.out.println(\n Rg: +a.getRa());
System.out.println(\n Rg: +a.getTurma());
}
}

Nota: Mesmo o mtodo mostraClasse() no


sendo chamado aqui, apresentar um erro
logo na compilao, informando que h um
mtodo abstrato (na classe Pessoa) que deve
ser implementado na classe Aluno
39

public class Aluno extends Pessoa{


private int ra;
private String turma;

+ Aluno
- int ra;

public void setRa(int ra){


- String turma;
this.ra = ra;
}
public void setTurma(String turma){
+ setRa();
this.turma= turma;
+ setTurma();
}
+ getRa();
public int getRa(){
+ getTurma();
return ra;
}
public int getTurma(){
return turma;
}
public mostraClasse(){
System.out.println(\nSobrescrevi o mtodo Abstrato de Pessoa. Estou na classe Aluno);
}
}

Nota: Atente para a sobrescrio do mtodo


abstrato na classe Aluno. Lembre-se este
mtodo foi herdado da classe Pessoa (onde
definido como abstrato), no tinha uma
implementao.
40

public class Inicio{


public static void main(String args[]){
Aluno a = new Aluno();
a.setRg(1);
a.setNome(Jesus);
a.setRa(10);
a.setTurma(A);
System.out.println(\n Rg: +a.getRg());
System.out.println(\n Rg: +a.getNome());
System.out.println(\n Rg: +a.getRa());
System.out.println(\n Rg: +a.getTurma());
a.mostraClasse();
}
}

Agora h a sobrescrio. Ento estar


utilizando o mtodo sobrescrito da prpria
classe Aluno.

41

modificador de acesso

FINAL

42

Em Java a palavra reservada FINAL indica a impossibilidade de alterao a


estrutura a qual ela foi empregada. Porm esta indicao passa a ser
contextual justamente pelos diferentes tipos de estruturas em que podemos
empreg-la. Podemos utiliz-la na declarao de:
- Atributos;
- Mtodos;
- Classes;

43

Atributo final envolve a questo de modificao de seu valor


Indica que o atributo em questo ser uma constante, isto , uma estrutura de
dados (assim como um varivel) porm que no poder ter seu valor
modificado.
Exemplo: Imagine um cdigo que dever calcular as reas de circunferncias.
Para isso dever utilizar o PI radiano, cujo valor sempre o mesmo
(3,14159...), logo uma constante. Sendo assim poderamos declarar o atributo
da seguinte forma

final private float pi = 3.14159;

44

Mtodo final envolve a questo do polimorfismo de sobrescrita


Indica que o mtodo no pode ser sobrescrito. Contrapondo-se ao conceito
da mtodo abstrato que declarado em uma classe-me e dever ser
sobrescrito em uma classe-filha.
Exemplo: de acordo com os exemplos desta aula, que trataram da herana
entre Pessoa e Aluno. Considere que o desenvolvedor da classe Aluno (que
herdou a classe Pessoa) queira sobrescrever os mtodos set (j definidos na
classe Pessoa) . Isso poderia se uma tentativa de driblar o encapsulamento
definido para a classe Pessoa. Pode-se evitar isso declarando que o mtodo
final, isto , no poder ser sobrescrito nas classes-filhas:

final public void setRg(int rg){....}


45

Classe final envolve a questo do mecanismo de herana


Indica que a classe no pode ser herdada. Contrapondo-se ao conceito da
classe abstrata que, geralmente, projetada para ser utilizada como classeme num mecanismo de herana, uma classe definida como final no
poder ser herdada.
Exemplo: Imagine que no desenvolvimento acadmico o projeto no preveja
(ou no deva existir) uma extenso de aluno.

final public class Aluno extends Pessoa....


Observe que aluno herda Pessoa, porm ela (a classe Aluno) no poder ser
herdada por nenhuma outra classe.

46

You might also like