Baixe o app para aproveitar ainda mais
Prévia do material em texto
Aula 03: Princípios da Orientação à Objetos Objetivos Introdução Classes e Objetos Todo sistema orientado à objetos pode ser definido como um conjunto de objetos que trocam mensagens entre si. Então, quando programamos em Java, que é uma linguagem de programação orientada à objetos, estamos escrevendo ou definindo um conjunto de objetos que trocam mensagens. Bom, mas o que é um Objeto? O que é uma classe? O que é mensagens? As classes definem a estrutura e o comportamento de um tipo de objeto. Classe Uma classe é um tipo de modelo que define como são os objetos que pertencem a esta classe. É como se fosse um projeto que os objetos devem seguir para serem considerados como pertencentes à classe. Neste projeto estão definidos as características (que chamamos de atributos) e os comportamentos que representam as operações que os objetos dessa classe podem realizar (chamamos a isso de métodos). Exemplos de classes: Os animais podem ser classificados em classes, tais como mamíferos, aves, peixes, etc. Cada uma dessas classes tem suas características e comportamentos comuns, que poderiam ser relacionados (descritos) como atributos e métodos dessas classes. Exemplos de atributos: Uma classe pessoa, por exemplo, pode ter atributos como nome, endereço, identidade, ou seja, características (dados) específicas de cada pessoa. Exemplos de métodos: Introduzir conceitos de Programação Orientada a Objetos (POO) Aprender a criar classes Aprender a instanciar objetos Uma classe peixe pode ter um método nadar, uma classe pessoa pode ter um método andar ou um método falar, pois estes são comportamentos (ações) típicos destas classes. O que é um objeto? Como vimos, uma classe é uma representação de uma entidade do mundo real. Um objeto é uma ocorrência (chamamos a isso de uma instância) de uma determinada classe. Exemplos de objetos: Matheus é um objeto da classe pessoa. Thor (o peixinho do Matheus) é um objeto da classe peixe. CLASSE OBJETOS CLASSE OBJETOS CLASSE OBJETOS Carro Meu Gol Seu Corsa Pálio dele Empregado João Ana Carlos Formulário Demissão Cadastro Vendas Abstração Extrair tudo que for essencial e mais nada para o escopo do sistema; É o processo de filtragem de detalhes sem importância do objeto real, para que apenas as características apropriadas que o descrevam e que tenham relevância para o sistema permaneçam; Conceito aplicado à criação de software baseado em objetos, partindo do princípio que devemos considerar a essência de cada objeto e não pensar em todos os detalhes de implementação; Classes e Objetos em Java Definindo uma Classe em Java As classes em Java são definidas através do uso da palavra-chave class. Construindo uma classe: [modif] class NomeDaClasse { // corpo da classe... } A primeira linha é um comando que inicia a declaração da classe. Após a palavra-chave class, segue-se o nome da classe, que deve ser um identificador válido para a linguagem. O modificador modif é opcional; se presente, pode ser uma combinação de public e abstract ou final. A definição da classe propriamente dita está entre as chaves { e }, que delimitam blocos na linguagem Java. Este corpo da classe usualmente obedece à seguinte sequência de definição: 1. As variáveis de classe (definidas como static), ordenadas segundo sua visibilidade: iniciando pelas public, seguidos pelas protected, pelas com visibilidade padrão (sem modificador) e finalmente pelas private. 2. Os atributos (ou variáveis de instância) dos objetos dessa classe, seguindo a mesma ordenação segundo a visibilidade definida para as variáveis de classe. 3. Os construtores de objetos dessa classe. 4. Os métodos da classe, geralmente agrupados por funcionalidade. Antes de continuarmos com os elementos que compõe uma classe, faz-se necessário alguns esclarecimentos sobre encapsulamento. Encapsulamento Mecanismo utilizado em orientação a objetos para obter segurança, modularidade e autonomia dos objetos; Os atributos e métodos de um objeto podem ser escondidos de outros objetos por uma interface pública de métodos, de modo a impedir acessos indevidos. Para definir diferentes níveis de encapsulamento faz-se uso do conjunto de modificadores de acesso disponíveis no Java para os membros de classe, com mostrado na tabela. ( * acesso permitido ) Modificadores Mesma classe Mesmo pacote Subclasses Universo private * <sem modif> * * protected * * * public * * * * Atributos Representam as características de um objeto. A sintaxe utilizada para definir um atributo de um objeto é: [modificador] tipo nome [ = default]; Onde: modificador é opcional, especificando a visibilidade diferente da padrão (public, protected ou private); tipo deve ser um dos tipos primitivos da linguagem Java ou o nome de uma classe; nome deve ser um identificador válido da linguagem Java; valor default é opcional; se presente, especifica um valor inicial para a variável. Métodos Os métodos representam as funcionalidades que os objetos podem desempenhar. São essencialmente procedimentos que podem manipular atributos de objetos para os quais o método foi definido. Além dos atributos de objetos, métodos podem definir e manipular variáveis locais; também podem receber parâmetros por valor através da lista de argumentos. A forma genérica para a definição de um método em uma classe é: [modificador] <tipoDeRetorno> nome(argumentos) { corpo do método } Onde: o modificador (opcional) é uma combinação de: public, protected ou private; abstract ou final; e static. o tipoDeRetorno é um indicador do valor de retorno, sendo void se o método não tiver um valor de retorno; o nome do método deve ser um identificador válido na linguagem Java; os argumentos são representados por uma lista de parâmetros separados por vírgulas, onde para cada parâmetro é indicado primeiro o tipo e depois (separado por espaço) o nome. Uma boa prática de programação é manter a funcionalidade de um método simples, desempenhando uma única tarefa. O nome do método deve refletir de modo adequado a tarefa realizada. Se a funcionalidade do método for simples, será fácil encontrar um nome adequado para o método. Métodos de mesmo nome podem co-existir em uma mesma classe desde que a lista de argumentos seja distinta, usando o mecanismo de sobrecarga. Construtores são métodos especiais que possuem o mesmo nome da classe e não apresentam tipo de retorno. Podem estar declarados explicitamente ou simplesmente omitidos. Criando Objetos em Java Toda classe possui atributos e métodos. Em especial, toda classe tem um construtor, que é um método responsável pela instanciação do objeto. Este processo faz com que o objeto seja criado com as características desejadas. Para que um objeto exista em memória, ele precisa ter memória alocada, um endereço definido. O construtor é o responsável por isso. A criação de um objeto se dá através da aplicação do operador new. ClasseNome objeto = new ClasseNome(); O método a direita do operador new é o construtor da classe ClasseNome. Podemos instanciar quantos objetos forem necessários. Contanto que guardemos a referência para o objeto em questão. A referência é como poderemos acessar aquele objeto. Caso um objeto não tenha mais nenhuma referência para ele, o coletor de lixo (garbage collector - GC) elimina o objeto, liberando a memória. Criando umprograma Java Um programa Java é uma coleção de objetos que são descritos por um conjunto de arquivos texto, onde são definidas as classes. Pelo menos uma destas classes é ―public‖ e contém o método main(), que possui esta forma específica: public static void main(String [] args) { // aqui o programador insere os comandos } Como vimos nas aulas anteriores todos os programas feitos tinham esta estrutura. E o nome da classe era o nome do arquivo. Então, podemos concluir que uma classe em Java é construída dentro de um arquivo texto com o mesmo nome da classe e extensão .java. javac Oi.java java Oi Nos comando acima, o compilador Java compila o arquivo texto Oi.java, gerando o bytecode. A máquina virtual interpreta a classe Oi quando o comando java Oi é executado. Lembro que a classe que contém o método main() é chamada de classe principal. Exemplo: public class Ponto2D { private int x; private int y; public Ponto2D(int a, int b) { x = a; y = b; } public double distancia(Ponto2D p) { double distX = p.x - x; double distY = p.y - y; return Math.sqrt(distX*distX + distY*distY); } } Neste exemplo, definimos a classe Ponto2D com dois atributos e dois métodos. Os atributos são, x e y enquanto os métodos são: Ponto2D – Construtor distancia – método que calcula a distância entre o ponto e um outro dado. Um objeto dessa classe tem dois atributos privativos que definem as coordenadas do ponto bidimensional, x e y — nesse caso, as coordenadas são valores inteiros. A classe tem um construtor que recebe dois argumentos, a e b, que definem as coordenadas do ponto criado. Finalmente, a classe define um método público para calcular a distância entre o ponto que invocou o método e outro ponto especificado como o argumento p. A expressão de retorno ilustra ainda a utilização de um método estático da classe Math do pacote java.lang para o cômputo da raiz quadrada. Interface de classe Como vimos, podemos ter carro como sendo uma classe. As características ou atributos poderiam ser a cor, o modelo, a potência do motor e assim sucessivamente. Os comportamentos ou funcionalidades, poderiam ser ligar e desligar, abrir e fechar a porta, acelerar e frear, e outras ações (operações) que fossem consideradas úteis para descrever um carro. Os atributos e métodos da classe carro constituem o que chamamos de interface dessa classe com o mundo externo. Um objeto da classe carro só será acessível por outro objeto através de seus métodos, de forma que a interface da classe carro deve definir todos os comportamentos desejáveis a um objeto desta classe. Uma vez que tenhamos definido a interface da classe carro e que tenhamos um objeto dessa classe, como fazer para que ele execute a operação ligar? Devemos enviar uma mensagem para esse carro (ligue!) e ele executará a operação. Nós (externamente ao objeto) é que pedimos ao objeto para que execute essa operação, sem precisar saber como o carro faz para ligar (que tipo de algoritmo ele usa para isso). O mesmo ocorre se quisermos saber a cor do carro. Simplesmente perguntamos (qual é a sua cor?) e o carro responde (naturalmente precisaríamos ter criado um método que respondesse a isso). Onde e como ele armazena a informação da cor não é relevante. Apenas sabemos que ele é capaz de armazenar seus atributos e informá-los quando necessitarmos deles. O fato dos objetos esconderem sua forma de funcionamento é um conceito importante em OO, e está ligado à existência da interface. Somente a classe carro conhece a forma de funcionamento (implementação) de seus métodos. É o que chamamos de encapsulamento. Ou seja, conhecemos as características e as funcionalidades de um carro, mas não sabemos (nem precisamos saber) quais técnicas e processos os projetistas utilizaram para a construção do projeto, ou seja, para implementar a forma de funcionamento de seus métodos. Ou seja, a forma de fazer está encapsulada nos métodos do projeto e é de exclusiva responsabilidade do projetista. Representação do problema - UML Para estudarmos a Programação Orientada a Objetos (POO), é necessário que entendamos a Modelagem Orientada a Objetos (MOO). Essa técnica representa as estruturas através de uma linguagem padrão, conhecida como UML (Unified Modeling Language), usada para a criação de modelos que representam os problemas do mundo real. A UML classifica os ―objetos‖ envolvidos no domínio do problema e define as formas como os mesmos se relacionam. Não é o nosso foco uma abordagem profunda dos conceitos e ferramentas da UML. Utilizaremos apenas os principais elementos da MOO, que são necessários para dar andamento à POO. Para implementação utilizaremos a linguagem Java. Na UML as classes são representadas na forma de caixas com, no máximo, três compartimentos. O primeiro deles contém o nome da classe (sempre no singular e com a primeira letra em maiúsculo), o segundo contém a lista de atributos e o terceiro contém a lista de operações. Veja a classe carro: A UML (e o Java) sugere que todos os nomes de atributos e métodos se iniciem com letra minúscula. Na classe Carro foram criados três atributos: dois do tipo String, marca e cor e o terceiro, motorEstado, é um booleano que indica se o motor está desligado ou ligado. Além dos atributos da classe, queremos também criar métodos que contenham as operações que objeto poderá realizar. Um carro pode fazer muitas coisas, mas, para manter a simplicidade, vamos criar inicialmente apenas três métodos: O primeiro é o método ligaMotor, que muda o estado do motor para ligado, isto é, para true e depois exibe uma mensagem de aviso. O segundo é o método desligaMotor, que muda o estado do motor para desligado, isto é, para false e depois exibe uma mensagem de aviso. O terceiro método, mostraAtributos, exibe os valores dos atributos de um objeto ou instância da classe Carro. Exemplo: class Carro { String marca; String cor; boolean motorEstado; void ligaMotor() { motorEstado = true; System.out.println("O motor foi ligado."); } void desligaMotor() { motorEstado = false; System.out.println("O motor foi desligado."); } void mostraAtributos() { System.out.println("O carro tem a cor " + cor + "e eh da marca " + marca); if (motorEstado == true) System.out.println("O motor jah estah ligado."); else { System.out.println("O motor estah desligado."); } } } Bem, até agora, no exemplo, criamos apenas a classe Carro. Precisamos criar também um objeto dessa classe. Em Java, uma das maneira de fazer isso é adicionar o método main() à classe Carro e nele instanciando efetivamente um objeto da classe Carro (comando new). public static void main (String args[]) { Carro meuCarro = new Carro(); // instancia o objeto meuCarro.marca = "Palio"; // inicia o atributo marca meuCarro.cor = "azul"; // inicia o atributo cor System.out.println("Mostrando os atributos:"); meuCarro.mostraAtributos(); //mensagem para o objeto System.out.println("---------"); System.out.println("Ligando o motor..."); meuCarro.ligaMotor(); //mensagem para ligar o carro System.out.println("Mostrando os atributos:"); meuCarro.mostraAtributos(); System.out.println("---------"); System.out.println("Desligando o motor..."); meuCarro.desligaMotor(); System.out.println("Mostrando os atributos:"); meuCarro.mostraAtributos(); } Após a execução a tela de saída deve exibir algo como: Exercíos 1. Crie o objeto outroCarro da classe carro com a marca Gol e a cor prata. 2. Insira um novo atributo rotacaoMotor e inicie-o com zero. O método ligaMotor deve atualizar esse atributo para 1000 e o método desligaMotor deve atualizá- lo para zero. 3. Crie um novo método acelerar que some 100 ao valor corrente do atributo rotacaoMotor. Crie também o desacelerar, que subtraia 100. 4. A partir do arquivo criado, desmembre-o em dois. O arquivo já existente, de nome Carro, só com a classe Carro sem o método main. E outro arquivo, denominado Principal, só com o método main (este novo arquivo deve definir uma nova classe – a classe Principal). 5. Crie uma classe Quadrado que tenha um atributo lado e métodos para informar a área e o perímetro. Escreva uma outra classe Principal para testar essa classe. 6. Escreva uma classe Calculadora que tenha dois atributos inteiros (inicie-os com os valores 6 e 3) e métodos para calcular as quatro operações matemáticas e imprimir os quatro resultados. Escreva uma outra classe Principal para testar essa classe. 7. Escreva uma classe que possua um atributo chamado raio (inicie-o com o valor 1) e métodos para calcular o diâmetro, a circunferência e a área de um círculo. Utilize o valor 3,14159 para PI Utilize as fórmulas abaixo para os seus cálculos: Diâmetro = 2 x raio Circunferência = 2 x PI x raio Área = PI x raio x raio Observação: Você também pode usar a constante Math.PI predefinida para o valor de PI, que apresenta um valor mais preciso. A Classe Math é definida no pacote Java.lang, que não precisa ser importada no seu programa. Ex.: double varPI = Math.PI;
Compartilhar