Você está na página 1de 16

Herana

Enquanto programamos em Java, h a necessidade de trabalharmos com vrias classes. Muitas vezes, classes diferentes tem caractersticas comuns, ento, ao invs de criarmos uma nova classe com todas essas caractersticas usamos as caractersticas de um objeto ou classe j existente. Ou seja, herana , na verdade, uma classe derivada de outra classe. Para simplificar de uma forma mais direta, vejamos: Vamos imaginar que exista uma classe chamada Eletrodomestico, e nela esto definidos os seguintes atributos: ligado (boolean), voltagem (int) e consumo (int). Se levarmos em conta a classe TV que estamos usando de exemplo at agora, podemos dizer que TV deriva de Eletrodomestico. Ou seja, a classe TV possui todas as caractersticas da classe Eletrodomestico, alm de ter suas prprias caractersticas.

Extends e Super
Para fazermos uma classe herdar as caractersticas de uma outra, usamos a palavra reservada extends logo aps a definicao do nome da classe. Dessa forma: class NomeDaClasseASerCriada extends NomeDaClasseASerHerdada Importante: Java permite que uma classe herde apenas as caractersticas de uma nica classe, ou seja, no pode haver heranas mltiplas. Porm, permitido heranas em cadeias, por exemplo: se a classe Mamifero herda a classe Animal, quando fizermos a classe Cachorro herdar a classe Mamifero, a classe Cachorro tambm herdar as caractersticas da classe Animal.

Como estamos tratando de herana de classes, toda classe tem seu mtodo construtor. Portanto, se estamos trabalhando com duas classes, temos dois mtodos construtores. Para acessarmos o mtodo 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 mtodos. Para finalizar, iremos mostrar o exemplo citado mais acima da classe Eletrodomestico e TV. Observe:

Classe 1: Eletrodomestico
01.package tiexpert; 02. 03.public class Eletrodomestico { 04.private boolean ligado; 05.private int voltagem; 06.private int consumo; 07. 08.public Eletrodomestico(boolean ligado, int voltagem, int consumo) { 09.this.ligado = ligado; 10.this.voltagem = voltagem; 11.this.consumo = consumo; 12.} 13.// (...) 14.}

Classe 2: TV
01.package tiexpert; 02. 03.public class TV extends Eletrodomestico { 04.private int canal; 05.private int volume; 06.private int tamanho; 07. 08.public TV(int voltagem, int consumo, int canal, int volume, int tamanho) { 09.super(false, voltagem, consumo); 10.this.canal = canal; 11.this.volume = volume; 12.this.tamanho = tamanho; 13.} 14.//(...) 15.}

Classe que mostra a instanciao de TV.


01.package tiexpert; 02. 03.public class ExemploHeranca { 04.public static void mostrarCaracteristicas(TV obj) { 05.System.out.print("Esta TV tem as seguintes caractersticas:\n" 06.+ "Tamanho: " + obj.getTamanho() + "\"\n" 07.+ "Voltagem Atual: "+ obj.getVoltagem() + "V\n" 08.+ "Consumo/h: " + obj.getConsumo() + "W\n"); 09.if (obj.isLigado()) { 10.System.out.println("Ligado: Sim\n" 11.+ "Canal: " + obj.getCanal() + "\n" 12.+ "Volume: " + obj.getVolume()+"\n"); 13.} else { 14.System.out.println("Ligado: No\n"); 15.} 16.} 17. 18.public static void main(String args[]) { 19.TV tv1 = new TV(110, 95, 0, 0, 21); 20.TV tv2 = new TV(220, 127, 0, 0, 29);

21.tv2.setLigado(true); 22.tv2.setCanal(3); 23.tv2.setVolume(25); 24.mostrarCaracteristicas(tv1); 25.mostrarCaracteristicas(tv2); 26.} 27.}

O cdigo acima ir mostrar o seguinte resultado: Esta TV tem as seguintes caractersticas: Tamanho: 21" Voltagem Atual: 110V Consumo/h: 95W Ligado: No Esta TV tem as seguintes caractersticas: Tamanho: 29" Voltagem Atual: 220V Consumo/h: 127W Ligado: Sim Canal: 3 Volume: 25

Interfaces
Interface um recurso da orientao a objeto utilizado em Java que define aes que devem ser obrigatoriamente executadas, mas que cada classe pode executar de forma diferente. Interfaces contm valores constantes ou assinaturas de mtodos que devem ser implementados dentro de uma classe. E por que isso? Isso se deve ao fato que muitos objetos (classes) podem possuir a mesma ao (mtodo), porm, podem execut-la de maneira diferente. Usando um exemplo bem drstico, podemos ter uma interface chamada areo que possui a assinatura do mtodo voar(). Ou seja, toda classe que implementar areo deve dizer como voar(). Portanto, se eu tenho uma classe chamada pssaro e outra chamada avio, ambas implementando a interface areo, ento, nestas duas classes devemos codificar a forma como cada um ir voar(). Uma interface criada da mesma forma que uma classe, mas utilizando a palavra-chave interface no lugar de class. interface nomeDaInterface { mtodoAbstrato (argumentos); }

Usando herana em Java Quando estamos projetando as classes que faro parte de um sistema, aconselhvel ter em mente um conceito muito importante da programao orientada a objetos: a herana. O que um aluno, um professor e um funcionrio possuem em comum? Todos eles so pessoas e, portanto, compartilham alguns dados comuns. Todos tm nome, idade, endereo, etc. E, o que diferencia um aluno de uma outra pessoa qualquer? Um aluno possui uma matrcula; Um funcionrio possui um cdigo de funcionrio, data de admisso, salrio, etc; Um professor possui um cdigo de professor e informaes relacionadas sua formao. aqui que a herana se torna uma ferramenta de grande utilidade. Podemos criar uma classe Pessoa, que possui todos os atributos e mtodos comuns a todas as pessoas e herdar estes atributos e mtodos em classes mais especficas, ou seja, a herana parte do geral para o mais especfico. Comece criando uma classe Pessoa (Pessoa.java) como mostrado no cdigo a seguir:
public class Pessoa{ public String nome; public int idade; }

Esta classe possui os atributos nome e idade. Estes atributos so comuns a todas as pessoas. Veja agora como podemos criar uma classe Aluno que herda estes atributos da classe Pessoa e inclui seu prprio atributo, a saber, seu nmero de matrcula. Eis o cdigo:
public class Aluno extends Pessoa{ public String matricula; }

Observe que, em Java, a palavra-chave usada para indicar herana extends. A classe Aluno agora possui trs atributos: nome, idade e matricula. Veja um aplicativo demonstrando este relacionamento:
public class Estudos{ public static void main(String args[]){ // cria um objeto da classe Aluno Aluno aluno = new Aluno(); aluno.nome = "Osmar J. Silva"; aluno.idade = 36; aluno.matricula = "AC33-65"; // Exibe o resultado System.out.println("Nome: " + aluno.nome + "\n" + "Idade: " + aluno.idade + "\n" + "Matrcula: " + aluno.matricula); } }

A herana nos fornece um grande benefcio. Ao concentrarmos caractersticas comuns em uma classe e derivar as classes mais especficas a partir desta, ns estamos preparados para a adio de novas funcionalidades ao sistema. Se mais adiante uma nova propriedade comum tiver que ser adicionada, no precisaremos efetuar alteraes

em todas as classes. Basta alterar a superclasse e pronto. As classes derivadas sero automaticamente atualizadas.

Usando uma Interface em uma Classe


Como vimos anteriormente, uma classe pode extender suas funcionalidades obtendo as caractersticas de outra classe num processo que chamamos de herana. Uma interface no herdada, mas sim, implementada. Porque todo o cdigo dos mtodos da interface deve ser escrito dentro da classe que o chama. Dessa forma, obtemos as assinaturas dos mtodos da interface em uma classe usando a palavra-chave implements. A vantagem principal das interfaces que no h limites de quantas interfaces uma classe pode implementar. O que ajuda no caso de heranas mltiplas que no possvel ser feito em Java, pois uma classe apenas pode herdar as caractersticas de uma outra classe. Trazendo ao exemplo j usado por ns, teramos o seguinte conceito. 1) Teramos a classe principal que caracteriza a TV.
01.public class TV { 02.private int tamanho; 03.private int canal; 04.private int volume; 05.private boolean ligada; 06. 07.public TV(int tamanho) { 08.this.tamanho = tamanho; 09.this.canal = 0; 10.this.volume = 0; 11.this.ligada = false; 12.} 13. 14.// abaixo teramos todos os mtodos construtores get e set... 15.}

2) Teramos as aes que comumente toda televiso executa, mas que cada modelo pode executar de forma diferente. Como geralmente toda ao da TV executada pelo controle remoto, ento chamaremos esta interface de controle remoto.
01.public interface ControleRemoto { 02./* 03.* Perceba que apenas a assinatura dos mtodos esto aqui. 04.* E cada mtodo termina com um ponto-e-vrgula (;) 05.*/ 06.void mudarCanal(int canal); 07.void aumentarVolume (int taxa); 08.void diminuirVolume (int taxa); 09.boolean ligar(); 10.boolean desligar(); 11.}

3) Agora que temos nossa interface e a definio do que a TV, vamos desenvolver duas TVs diferentes, imaginando que fossem duas marcas completamente distintas e que uma no tem nenhuma relao com a outra. Como ambas as TVs iro implementar a interface ControleRemoto, ento, no corpo das duas classes devem conter todos os mtodos da interface. No exemplo usado abaixo, apenas implementaremos os mtodos ligar e desligar. A TV modelo 001 uma TV simples, sem muitos recursos que quando acionarmos o comando desligar ir simplesmente desligar.
01.public class ModeloTV001 extends TV implements ControleRemoto { 02.public final String MODELO = "TV001"; 03. 04.public ModeloTV001(int tamanho) { 05.super(tamanho); 06.} 07. 08.public void desligar() { 09.super.setLigada(false); 10.} 11. 12.public void ligar() { 13.super.setLigada(true); 14.} 15. 16.public void aumentarVolume(int taxa) { } 17.public void diminuirVolume(int taxa) { } 18.public void mudarCanal(int canal) { } 19.}

O modelo SDX uma TV mais moderna, que quando acionarmos o comando desligar ir apresentar uma mensagem dizendo "tchau!".
01.public class ModeloSDX extends TV implements ControleRemoto { 02.public final String MODELO = "TV-SDX"; 03. 04.public ModeloSDX(int tamanho) { 05.super(tamanho); 06.} 07. 08.public void desligar() { 09.System.out.println("Tchau!"); 10.super.setLigada(false); 11.} 12. 13.public void ligar() { 14.super.setLigada(true); 15.} 16. 17.public void aumentarVolume(int taxa) { } 18.public void diminuirVolume(int taxa) { } 19.public void mudarCanal(int canal) { } 20.}

Como pode ser visto, ambos possuem a mesma ao que desligar, porm cada um executa de forma diferente. Visualizar Codigo Fonte Imprimir?
01.public class ExemploInterfaceamento { 02.public static void main(String[] args) { 03.ModeloTV001 tv1 = new ModeloTV001(21); 04.ModeloSDX tv2 = new ModeloSDX (42); 05. 06.tv1.ligar(); 07.tv2.ligar(); 08. 09.System.out.print("TV1 - modelo " + tv1.MODELO + " est "); 10.System.out.println(tv1.isLigada() ? "ligada" : "desligada"); 11.System.out.print("TV2 - modelo " + tv2.MODELO + " est "); 12.System.out.println(tv1.isLigada() ? "ligada" : "desligada"); 13. 14.// ambas as TVs esto ligadas e vamos deslig-las 15.System.out.println("Desligando modelo " + tv1.MODELO); 16.tv1.desligar(); 17.System.out.println("Desligando modelo " + tv2.MODELO); 18.tv2.desligar(); 19.} 20.}

Java: O que Interface ?


Publicado em agosto 23, 2008 [Dica: Leia os comentrios do cdigo e implemente-os para melhor entendimento.] Como voc j aprendeu na Orientao a Objetos, os objetos representam algo do mundo real atravs de seus atributos e mtodos. Uma interface no java pode representar uma superfcie como o boto de liga e desliga de um equipamento eletrnico. Este boto, por padro, esta obrigatriamente presente em todos os aparelhos de televiso. No mais comum, uma interface, um conjunto de mtodos relacionados que no tem corpo, ou seja, sem implementao. Se um comportamento bsico de qualquer aparelho eletrnico for especificado como uma interface, poderia ser como o cdigo abaixo: 1package estudos; 2 3public interface Eletronico { void ligar(); 4 void desligar(); 5 } 6

Todos os mtodos das interfaces so implicitamente public e abstract , sendo que muitas pessoas gostam usualmente de explicitar o public. E as constantes so public static e final. 1package estudos; 2 3String teste = "t123"; 4 5public interface Eletronico { void ligar(); 6 void desligar(); 7 } 8 a mesma coisa que: 1package estudos; 2 3public static final String teste = "t123"; 4 5public interface Eletronico { public abstract void ligar(); 6 public void desligar(); 7 } 8 Se voc quiser implementar um aparelho eletrnico seguindo o padro bsico de comportamento, voc ter que usar a palavra-chave implements na declarao da classe deste aparelho: 1 2 package estudos; 3 public class Televisao implements Eletronico { 4 5 // Temos obrigatriamete que implementar os mtodos 6 // da interface Eletronico. 7 public void ligar() { 8 System.out.println("Liguei a televiso"); 9 // Aqui voc implementaria os cdigos para ligar a televiso 10 } 11 12 public void desligar() { System.out.println("Desliguei a televiso"); 13 // Aqui voc implementaria os cdigos para desligar a 14 televiso 15 } 16 17} 18 Como vemos no cdigo, para se implementar a televiso, que um aparelho eletrnico, seguimos o padro criado por ns para aparelhos eletrnicos. Usamos a palavra-chave implements para implementar obrigatriamente os mtodos da interface Eletronico ,

fazendo uso do padro criado. como um contrato entre diversas classes, quase que criando at um tipo de dado. Quando voc precisa criar funes que manipulam outros objetos, necessrio, as vezes, garantir que esta funo esta realmente recebendo um objeto que tenha determinados atributos e mtodos, os quais esta ir fazer uso. Vou mostrar um exemplo: Criamos um interface Imprimivel: 1package estudos2; 2 3public interface Imprimivel { 4 void imprimir(); 5 6 7} Vamos criar uma classe Impressora que implementa a interface Eletronico, e que s imprime objetos que implementam a interface Imprimivel. 1 package estudos; 2 3 public class Impressora implements Eletronico { 4 // Impressora desligada por padro 5 private boolean ligada = false; 6 7 // Mtodo para imprimir uma nota, veja o parmetro 8 // Imprimivel objImprimivel // O metodo espera um objeto que possua uma funo imprimir() 9 // gerou um contrato da impressora .. o mtodo somente 10 // aceita objetos que implementa a interface Imprimivel. 11 public void imprimirNotaFiscal(Imprimivel objImprimivel){ 12 // Verifica se a impressora esta ligada! if(this.ligada){ 13 objImprimivel.imprimir(); 14 // Se o objeto passado no fosse Imprimivel 15 } else { 16 System.out.println("Problema: Impressora desligada!"); 17 } } 18 19 // implementamos o mtodo da interface Eletronico 20 // Ligamos a impressora .... 21 public void ligar() { 22 this.ligada = true; System.out.println("Impressora ligada!"); 23 } 24 25 public void desligar() { 26 this.ligada = false; 27 System.out.println("Impressora desligada!"); 28 } 29 30}

31 32 33 34 35 Agora vamos criar dois tipos de nota fiscal, uma imprimivel na impressora e a outra no aceita imprimir pela impressora do seu sistema, porque a segunda somente para visualizao. Classe NotaFiscal que implementa a interface Imprimivel: 1 2 3 package estudos; 4 public class NotaFiscal implements Imprimivel { 5 6 private int numero; 7 private double valor; 8 public NotaFiscal(int numero, double valor){ 9 this.numero = numero; 10 this.valor = valor; 11 } 12 13 public void imprimir() { System.out.println("Nmero: " + this.getNumero() + ", Valor: 14 "+ this.getValor()); 15 } 16 17 public double getValor() { 18 return valor; 19 } 20 public void setValor(double valor) { 21 this.valor = valor; 22 } 23 24 public int getNumero() { 25 return numero; } 26 27 public void setNumero(int numero) { 28 this.numero = numero; 29 } 30 31} 32 33 > A Classe de nota fiscal que somente para visualizao. No obrigada a implementar a funo imprimir().

1 2 3 package estudos; 4 public class NotaFiscalOnline { 5 private int numero; 6 private double valor; 7 8 public NotaFiscalOnline(int numero, double valor){ this.numero = numero; 9 this.valor = valor; 10 } 11 12 public double getValor() { 13 return valor; } 14 15 public void setValor(double valor) { 16 this.valor = valor; 17 } 18 19 public int getNumero() { 20 return numero; } 21 22 public void setNumero(int numero) { 23 this.numero = numero; 24 } 25} 26 27 Criamos um classe executvel main para fazer uma demonstrao: 1 2 public class Main { 3 4 public static void main(String[] args) { 5 6 // Instnciamos uma impressora Impressora impressora1510 = new Impressora(); 7 8 // Ligamos a impressora! 9 impressora1510.ligar(); 10 11 // Fazemos um for para simular a criao de 10 notas fiscais 12 for (int i = 1; i <= 10; i++) { // numero da nota atual recebe o valor de i 13 int numeroNota = i; 14 // Criamos um valor i * 10, s para esta demonstrao 15 // 10.0 , 20.0, 30.0, 40.0, 50.0 .... 100.0 16 double valor = (double) (10 * i); 17 // Criamos um nota fiscal aqui dentro do for... // utilizando o valores gerados com a ajuda da varivel 18 i 19 NotaFiscal notaf = new NotaFiscal(numeroNota, valor); 20 // Como passamos um objeto que implementa a classe
package estudos;

21Imprimivel para // o mtodo da impressora que espera um objeto 22 Imprimivel 23 // no ter problemas... 24 impressora1510.imprimirNotaFiscal(notaf); } 25 } 26 27 28} 29 30 Primeiro criamos a interface Imprimivel, depois uma Classe Impressora que implementa a interface Eletronico. Criamos duas classes de nota fiscal, uma Imprimivel e a outra no. Ento veio o teste na classe executvel: O resultado foi:
Impressora ligada! Nmero: 1, Valor: 10.0 Nmero: 2, Valor: 20.0 Nmero: 3, Valor: 30.0 Nmero: 4, Valor: 40.0 Nmero: 5, Valor: 50.0 Nmero: 6, Valor: 60.0 Nmero: 7, Valor: 70.0 Nmero: 8, Valor: 80.0 Nmero: 9, Valor: 90.0 Nmero: 10, Valor: 100.0

Vou comentar um pouco sobre a linha 24 do cdigo da Classe executvel Main: impressora1510.imprimirNotaFiscal(notaf); Se tivessemos passado um objeto que no fosse do tipo Imprimivel, aconteceria um erro na hora da compilao! No chegava nem ao ponto de compilar. Isso timo para obrigar ao programador a passar pelo parmetro um objeto que tenha realmente a funo imprimir(), a qual a Classe Impressora necessita. Tente alterar , passando um objeto que no implemente a interface Imprimivel, para ver o que acontece! As regras de nomenclatura para interfaces so as mesmas que para as classes, embora seja usual o emprego de nomes que denotem, ou indiquem, suas funcionalidades ali definidas. Ou seja, uma interface chamada Imprimivel, somente ter mtodos relacionados com impresso, e uma interface Editavel ter mtodos relacionados a edio. As interfaces tambm fazem uso do mecanismo de herana! Sim, isto mesmo extends. Suas funcionlidades podem ser reescritas, ou podem ganhar mais funcionalides atravs da herana. 1package estudos;

2public interface Editavel { 3 void editar(String conteudo); 4 5 } 6 1package estudos; 2public interface EmailEditavel extends Editavel { 3 4 void editarAssunto(String assunto); void editarDe(String de); 5 void editarPara(String para); 6 7 } 8 A interface ficou mais especialista , ganhou funes relacionadas a edio de emails, ficou com 4 funes, uma j era de edio do contedo, editar(String conteudo), herdado da interface Pai (Editavel). Uma classe pode implementar diversas interfaces, por exemplo: Um e-mail pode ser Imprimivel e Editavel 1 package estudos2; 2 public class Email implements Imprimivel, EmailEditavel { 3 4 private String de; 5 private String para; private String assunto; 6 private String mensagem; 7 8 // Implementamos o mtodo imprimir() da interface Imprimivel 9 public void imprimir() { 10 System.out.println( 11 "De:" + this.getDe() + ",\n" + "Para:" + this.getPara() + ",\n" + 12 "Assunto: " + this.getAssunto() + ",\n" + 13 "Mensagem:" + this.getMensagem()); 14 } 15 16 // E implementamos os mtodos da interface EmailEditavel! public void editarAssunto(String assunto) { 17 this.setAssunto(assunto); 18 } 19 20 public void editarDe(String de) { 21 this.setDe(de); 22 } 23 public void editarPara(String para) { 24 this.setPara(para); 25 } 26 27 public void editar(String conteudo) { 28 this.setMensagem(conteudo);

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58} 59 60 61 62 63 64 65 66 67 68

} public String getDe() { return de; } public void setDe(String de) { this.de = de; } public String getPara() { return para; } public void setPara(String para) { this.para = para; } public String getAssunto() { return assunto; } public void setAssunto(String assunto) { this.assunto = assunto; } public String getMensagem() { return mensagem; } public void setMensagem(String mensagem) { this.mensagem = mensagem; }

Com isto, podemos ver que diferente do C++, o java no tem herana multipla extends Classe1, Classe2, mas uma classe pode implementar mais de uma interface. O Java no permite a herana multipla, porque se tivemos duas classes, que cada uma tem exatamente o mesmo mtodo(mesma assinatura) e com corpo diferente, qual dos dois mtodos a JVM ir usar? Exemplo: Se pudessemos fazer herana multipla no java ficaria assim:

Classe PortuguesBrasil: 1package estudos; 2 3public class PortuguesBrasil { 4 public void falarPalavraFiladeBanco(){ System.out.println("Fila!"); 5 } 6 } 7 Classe PortuguesPortugal: 1package estudos; 2 3public class PortuguesPortugal { 4 public void falarPalavraFiladeBanco(){ System.out.println("Bicha!"); 5 } 6 } 7 Classe Pessoa: 1package estudos; 2 3public class Pessoa extends PortuguesBrasil, PortuguesPortugal { 4 public Pessoa(){ this.falarPalavraFiladeBanco(); 5 } 6 } 7 Isto impossvel no java! Este cdigo no pode ser compilado! Qual dos dois mtodos a JVM ir usar? falarPalavraFiladeBanco() da classe PortuguesBrasil ou PortuguesPortugal ? A interface veio para resolver esse tipo problema. Algumas ltimas pergutas: possvel declarar Atributos privados em uma Interface? No. As interfaces no podem ter atributos privados, todos os seus atributos so public final e static. O objetivo das interfaces que sejam implementadas, as classes que a implementa ir fazer uso de seus atributos, se tivesse atributos private seria intil, pois a classe que implementar no enxegar o atributo. Por este motivo que no permitido criar atributos ou mtodos private em interfaces. possvel declarar mtodos static em uma interface. No. Uma interface no pode ter mtodos com corpo. Para que um mtodo static ? Se os mtodos de interfaces no podem ter corpo. Os mtodos das interfaces, sero implementados em outras classes.

Artigo de opinio: texto jornalstico que caracteriza-se por expor claramente a opinio do seu autor. Tambm chamado de matria assinada ou coluna (quando substitui uma seo fixa do jornal). As CARACTERSTICAS do artigo de opinio so: Contm um ttulo polmico ou provocador. Expe uma idia ou ponto de vista sobre determinado assunto. Apresenta trs partes: exposio, interpretao e opinio. Utiliza verbos predominantemente no presente. Utiliza linguagem objetiva (3 pessoa) ou subjetiva (1 pessoa). PROCEDIMENTOS ARGUMENTATIVOS DE UM ARTIGO DE OPINIO:

Relaes de causa e consequncia. Comparaes entre pocas e lugares. Retrocesso por meio da narrao de um fato. Antecipao de uma possvel crtica do leitor, construindo antecipadamente os contra-argumentos. Estabelecimento de interlocuo com o leitor. Produo de afirmaes radicais, de efeito.

Você também pode gostar