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: