• Nenhum resultado encontrado

SEÇÃO 1

Classes abstratas

As classes abstratas não podem ser utilizadas como instância direta, ou seja, vocênão pode utilizar o new para criar um objeto de uma classe

abstrata. Mas para que serve uma classe, se você não pode instanciá-la? Podemos dizer que uma classe abstrata é utilizada como um “molde” para outras classes. Para fazer isso, vamos utilizar a herança. Vamos tra- balhar novamente com as classes Pessoa, Funcionario e Cliente?

No sistema de locadora, teremos que cadastrar os funcionários e os clientes da loja. Como funcionários e clientes são pessoas, faz sentido ter um cadastro de pessoas, mas ao cadastrar é preciso saber quem é funcionário e quem é cliente. Podemos, então, utilizar uma classe Pessoa para reunir todas as características em comum das demais classes, que podem ser consideradas pessoas.

Fazendo isso, teremos uma classe modelo, que será a Pessoa, e outras classes que irão estender dessa modelo para reaproveitar suas caracte- rísticas. Para definir uma classe como sendo um “modelo”, se utiliza a palavra chave abstract. Dentro dessa classe, podemos ou não, ter méto-

dos abstratos, assim como, ter métodos não abstratos. Tornando a classe Pessoa abstrata, ela ficaria assim:

abstract class Pessoa { private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo;

abstract void cadastroCpf(String cpf);

//implementação dos demais métodos }

Agora temos a classe Pessoa como sendo abstrata, note que apenas adi- cionamos a palavra chave abstract no início da criação da classe. Além

dessa alteração, criamos também um método abstrato, o método ca- dastroCpf, isso significa que na classe abstrata Pessoa existe apenas a assinatura do método, e este deverá ser implementado nas classes que estenderem da classe Pessoa. Logo, as classes Funcionario e Cliente fi- cam da seguinte forma:

public class Funcionario extends Pessoa { private float salario;

private String carteiraTrabalho; public void cadastroCpf(String cpf){

if(cpf.length() >= 11){

super.cadastroCpf(cpf); }

else{

System.out.println(“CPF do funcionário é inválido.”); }

}

//implementação dos demais métodos }

public class Cliente extends Pessoa { private float dependentes;

public void cadastroCpf(String cpf){

if(cpf.length() >= 11){

super.cadastroCpf(cpf); }

else{

System.out.println(“CPF do cliente é inválido.”); }

}

//implementação dos demais métodos }

Note que ambas as classes, utilizaram a palavra extends para trabalhar com herança, estendendo da classe Pessoa. Como na classe Pessoa existe um método abstrato, este deve ser implementado em todas as classes filhas da classe Pessoa, e isso foi feito nas duas classes filhas.

Resumindo, quais são as principais características das classes abstratas?

Elas servem como “modelo” para outras classes.

Não podem ser instanciadas, ou seja, não se pode utilizar a palavra- -chave new para uma classe abstrata.

Pode-se implementar métodos abstratos dentro de uma classe abs- trata.

Métodos abstratos não possuem implementação, apenas a assinatura do método.

Pode-se implementar métodos não abstratos dentro de uma classe abstrata.

Os métodos abstratos devem ser implementados dentro das classes filhas.

Pode-se ainda representar as classes com o uso de uma classe abstrata por meio dediagramas de classes UML. Veja na figura a seguir.

Figura 10: Representação da herança utilizando classe abstrata

Perceba que esse diagrama é aquele apresentado quando estudamos a herança. Sabe por quê?

Porque as classes abstratas são utilizadas para se trabalhar com herança e como não podemos instanciar uma classe abstrata, ela é utilizada para ser herdada por outras classes.

Para não se confundir, lembre sempre que a herança existe, perfeita- mente, sem as classes abstratas, mas, as classes abstratas dependem da herança para serem utilizadas.

Na próxima unidade de estudo você aprenderá a criar as interfaces. Con- tinue atento e bom estudo!

Unidade de

estudo 10

Seções de estudo

Interface

SEÇÃO 1

Interface

A linguagem de programação Java não permite que classes herdem de mais de uma classe, ou seja, elas podem ter no máximo uma superclasse. Para suprir essa necessidade de herdar propriedades de mais de uma classe, foi desenvolvido o conceito de interfaces.

Diferente das classes abstratas, as interfaces não podem conter imple- mentações de métodos e declarações de atributos que não sejam do tipo public, static e final. As interfaces possuem apenas as assinaturas dos métodos, por isso dizemos que as elas são como contratos, depois que assinamos, temos a obrigação de implementar todos os métodos do contrato, ou seja, implementar todas as assinaturas de métodos que existem na interface.

Para criar uma interface, basta substituir a palavra class por interface.

Para ilustrar, vamos alterar a nossa classe Pessoa para que ela se torne uma interface, veja o exemplo a seguir:

interface Pessoa {

String nome = “Maria”;

public void cadastroCpf(String cpf);

//assinatura dos demais métodos }

Nesse exemplo, não temos mais a palavra class, e sim interface. Quan-

do existir um atributo criado dentro de uma interface, ele já deve ser inicializado, pois, mesmo sem informar, esse atributo é final (constante), além de estático e público. Além dessas mudanças, os métodos não po- dem mais ser implementados. Observe que no exemplo, temos apenas a assinatura do método.

Quando utilizamos uma interface em outra classe, dizemos que estamos implementando uma interface, para isso, utilizamos a palavra reserva- da implements. Observe o exemplo aplicado às classes Funcionario e

public class Funcionario implements Pessoa { private float salario;

private String carteiraTrabalho; public void cadastroCpf(String cpf){

if(cpf.length() >= 11){

super.cadastroCpf(cpf); }

else{

System.out.println(“CPF do funcionário é inválido.”); }

}

//implementação dos demais métodos }

public class Cliente implements Pessoa { private float dependentes;

public void cadastroCpf(String cpf){

if(cpf.length() >= 11){

super.cadastroCpf(cpf); }

else{

System.out.println(“CPF do cliente é inválido.”); }

}

//implementação dos demais métodos }

Perceba que nas duas classes utilizamos a palavra-chave implements

para afirmar que as classes Funcionario e Cliente vão implementar todos os métodos da interface Pessoa.

Uma das vantagens em utilizar interface é que se pode implementar mais de uma na mesma classe. Para fazer isso, basta separar por vírgula as interfaces que se deseja implementar, exemplo:

public class Funcionario implements Pessoa, SegundaInterface, TerceiraInterface {

//Criação de atributos

//implementação dos métodos }

Nesse exemplo, separamos por vírgula três interfaces - Pessoa, Segun- daInterface e TerceiraInterface, pois, estamos nos responsabilizando por assinar três contratos, e com isso, temos que implementar os métodos assinados em todas as interfaces.

Deve ficar bem claro que quando se fala em interface, é que, aqui, não é definido como as coisas são feitas (implementação), mas sim, o que será feito (assinatura). Na programação orientada a objeto, é muito importante pensar dessa forma, fazendo assim, as classes acabam ficando mais fáceis de entender e de manutenir.

Diversos autores aconselham amplamente o uso de interfaces, ao invés de herança. A herança, se utilizada sem conhecimento, pode tornar seu código perigoso. Já no uso de interfaces, cada classe é responsável pela sua implementação, pois estamos programando voltados à interface, o que é mais aconselhado.

DICA

Na próxima unidade de estudos, você vai entender como o compu- tador consegue executar várias coisas ao mesmo tempo, mas antes, teste o que aprendeu nesta unidade realizando os exercícios 33 e 34 do caderno de atividades práticas. Até mais!

Unidade de

estudo 11

Seções de estudo

Seção 1 - Apêndice – Programação concorrente e threads

Apêndice – Programação

No documento Apostila de Programação OO - SENAI.pdf (páginas 66-74)

Documentos relacionados