O conceito de Orientação a Objetos é bastante simples e possui várias definições. Basicamente, se compararmos o paradigma da orientação objeto com o paradigma estrutura ou imperativo, observaremos uma mudança do foco com relação a modelagem de uma solução (ou proposta) para um determinado problema. No paradigma estruturada estaremos focando nos procedimentos, na seqüência de passos (instruções) para resolver o problema, enquanto que na orientação objetos, o foco estará na informação.
No paradigma estruturado, a informação é fragmentada em dados, estes dados são manipulados (processados) por funções que os recebem na forma de parâmetros e os devolve para outra função ou programa inicial.
Na orientação objeto, criamos objetos (baseados em modelos observados no mundo real) que possuem características (que armazenam os dados ou estados) e possuem comportamento (procedimentos que podem realizar alguma análise dos estados ou transformá-los em outros estados).
"Programação orientada a objetos é um novo paradigma, que surgiu em paralelo à criação de uma linguagem de programação, chamada Smalltalk, proposta por Alan Kay em 1972. A idéia básica do paradigma orientado a objetos é imaginar que programas simulam o mundo real: um mundo povoado de objetos. Dessa maneira, linguagens baseadas nos conceitos de simulação do mundo real devem incluir um modelo de objetos que possam enviar e receber mensagens e reagir a mensagens recebidas. Esse conceito é baseado na idéia de que no mundo real frequentemente usamos objetos sem precisarmos conhecer como eles realmente funcionam. Assim, programação orientada a objetos fornece um ambiente onde múltiplos objetos podem coexistir e trocar mensagens entre si." (BARANAUSKAS, 200?)
Em termos de POO (Programação Orientada a Objetos), podemos dizer que se trata de uma técnica para escrita de programas, baseados em modelos abstratos (objetos) e sua iteração.
Neste sentido, um objeto é um conjunto de dados e operações que eventualmente possui alguma funcionalidade que será aplicada para obter a solução final desejada.
Uma aplicação OO em execução será um conjunto de objetos que serão criados, existirão por um tempo finito, serão destruidos e estarão trocando mensagens entre si.
A Programação orientada objetos possui vários conceitos diretamente aplicados na escrita dos programas, são eles: classe, objeto, instância, encapsulamento, atributos ou características, métodos e herança.
Classe
Ao analisarmos a POO do ponto de vista de Estrutura de Dados então poderemos comparar uma Classe a um Tipo Abstrato de Dado (TAD) ou a um tipo de dado definido pelo usuário (programador).
A classe é a descrição do conjunto de atributos e comportamentos (métodos) que um objeto poderá ter e fazer uso.
Como classe é uma descrição (um protótipo do que será um objeto), podemos dizer que ela não ocupa memória (existe uma exceção, veremos mais para frente quando estudarmos os recursos estáticos (static)). As classes em java podem ficar em disco até o momento em que forem feitas referência a elas.
Em linguagens fortemente tipadas (como o java), a classe representará um dos tipos possíveis que poderemos criar objetos. Semelhante a criação de uma variável baseada em um tipo primitivo (como o int).
Problema 1: Construa um programa que registre os nomes e matrículas dos alunos de uma turma.
Para cada aluno teremos um objeto (que o representará no sistema) e as informações nome e matrícula serão "atributos" desses objetos.
Em java, nossa solução pode ser descrita:
class Aluno {
String nome;
String matricula;
public Aluno(String nom, String mat) {
nome = nom;
matricula = mat;
}
public void apreseta() {
System.out.println("Aluno "+nome+" ("+matricula+")" );
}
}
Em cada arquivo-fonte java, podemos ter uma e somente uma classe pública, portanto no exemplo acima, poderemos criar o arquivo "Aluno.java" e declarar a classe da forma:
public class Aluno {Observe que o nome do arquivo deve ser rigorosamente igual ao nome da classe, incluindo a variação de caixa.
A utilização desse modificador de visibilidade (public) estará dizendo para a VM do java que a classe Aluno pode ser utilizadas por objetos de outros tipos ou pela própria VM.
A Sun publicou em 12 de setembro de 1997 um conjunto de convênções que são amplamente aceitas e utilizadas pelo mercado. Uma dessas regras, diz que o nome da classe deve iniciar em a letra maiúscula. (SUN, 1997)
Objetos
Um objeto é uma instância de uma classe, assim como uma variável inteira é uma instância do tipo primitivo int.
Os objetos de uma programa em Java existem apenas enquanto a VM do java estiver em execução. Os objetos são "cópias" das classes que os criaram, possuem todas as caracteristicas e comportamento definido na classe. As características descritas nas classes podem ser um dos tipos primitivos aceito pelo java ou instâncias de outras classes. Os métodos são os blocos de instruções identificados e nomeados dentro de uma classe. Os métodos é que serão utilizados para viabilizar a "troca de mensagens" entre os objetos.
Vejamos dois exemplos de objetos, baseados no exemplo de classe descrito para o problema 1.
Para cada aluno da turma podemos criar um objeto para representá-lo no sistema:
Aluno a1 = new Aluno( "Lucas","GRR20090001");Aluno a2 = new Aluno( "João Henrique","GRR20090002");Cada linha acima "esconde" três operações realizadas pela linguagem, são elas:
1.declaração das variáveis a1 e a2 do tipo Aluno
Aluno a1;
2.Instanciação ou criação de um objeto da classe Aluno ou do "tipo" Aluno
new Aluno();
3.Associação dos objetos as variáveis.
a1 = (endereço do objeto em memória retornado pelo operador de instanciação new).
As informações "Lucas" e "GRR20090001" são atributos do objeto representado pela variável a1.
O método apresenta deve ser "chamado" através das variáveis que representam os objetos da classe Aluno, no nosso caso:
a1.apreseta();
Importante, como os atributos nome e matrícula, bem como o método apresenta fazem parte do objeto, não podemos fazer referência a eles sem que um objeto seja criado. Veja o exemplo abaixo:
Aluno x;x.apresenta();O código acima produz erro de compilação.
Package (Pacotes)
Um pacote identifica um espaço (namespace) que organiza um conjunto de classes e interfaces. Na prática, a linguagem java, implementa os pacotes em forma de diretórios (ou pastas) no sistema de arquivo.
Herança
Em linguagem OO podemos definir uma nova classe baseada em outra classe. Esse recurso é denominado herança.
Em java, utilizamos a palavra extends para descrever uma herança, vejamos o exemplo abaixo:
package aula;public class Poligono {
protected int[] tamanhoArestas;
public Poligono() {
tamanhoArestas = new int[0];
}
public int calcPerimetro() {
int perim = 0;
for(int i=0 ; i < tamanhoArestas.length ; i++) {
perim += tamanhoArestas[i];
}
return perim;
}
}
A segunda classe:
package aula;
public class Quadrado extends Poligono {
public Quadrado(int tamanhoLado) {
tamanhoArestas = new int[4];
for(int i=0 ; i < tamanhoArestas.length ; i++) {
tamanhoArestas[i] = tamanhoLado;
}
}
public double area() {
return tamanhoArestas[0] * tamanhoArestas[0];
}
}
Uma terceira classe:
package aula;
public class Retangulo extends Poligono {
public Retangulo(int lado1, int lado2) {
tamanhoArestas = new int[4];
tamanhoArestas[0] = lado1;
tamanhoArestas[1] = lado2;
tamanhoArestas[2] = lado1;
tamanhoArestas[3] = lado2;
}
public double area() {
return tamanhoArestas[0] * tamanhoArestas[1];
}
}
E um exemplo da utilização das classes:
package aula;
public class Main {
public static void main(String[] args) {
Quadrado q = new Quadrado(2);
System.out.println("Area: "+ q.area() );
System.out.println("Perimetro: "+ q.calcPerimetro() );
Retangulo r = new Retangulo(2,4);
System.out.println("Area: "+ r.area() );
System.out.println("Perimetro: "+ r.calcPerimetro() );
}
}
Observe que o atributo tamanhoAresta e o método calcPermite não foram definidos nas classes Quadrado e Retangulo. No programa da classe Main, são criadas as instâncias de Quadrado e Retangulo e associadas as variáveis q e r, respectivamente. Posteriormente, no mesmo programa são chamados os métodos area() e calcPerimetro(). Estes métodos fazem uso da propriedade tamanhoAresta que foi definida na classe Poligono.
Dessa forma, a relação de herança entre as classes Poligono e Quadrado e Poligono e Retangulo ficam demonstrados. Algumas nomenclaturas são bastante usuaris para demonstrar essas relações, são elas:
A classe Poligono é a classe pai ou superclasse das classes Quadrado e Retangulo. Essa relação demonstra uma generalização de implementação, ou seja, tudo que é comum (propriedades e métodos) das classes filhas são descritas na classe pai.
As classes Quadrado e Retangulo são classes filhas ou subclasses da classe Poligono. Essa relação demonstra uma especialização de implementação, ou seja, todo parte específica de cada classe são descritas nas classes filhas.
Encapsulamento
Existem alguns remédios que devem ser absorvidos pelo organismo apenas no estômago ou no intestino do individuo. Esses remédios normalmente são colocados em cápsulas, ocultando o seu conteúdo.
Em POO, o encapsulamento consiste em esconder os detalhes de implementação (métodos e propriedades internas) e definir uma interface (conjunto de métodos) simplificada para execução de algumas funcionalidades. Desta forma, se o programa precisar modificar o comportamento inicial, essa alteração tende a não produzir efeitos (modificações) nas outras classes do sistema.
A linguagem Java oferece quatro modificadores de acesso para o desenvolvedor implementar o encapsulamento em suas classes, são eles: public, protected, default e private.
A acessibilidade de cada recurso (propriedade ou método) da classe é apresentado na tabela abaixo:
Modificador Classe Pacote Subclasse Mundo
public Sim Sim Sim Sim
protected Sim Sim Sim Não
não especificado (default) Sim Sim Não Não
private Sim Não Não Não
Independente do modificador, os blocos de códigos de uma classe podem acessar todos os seus próprios recursos (propriedades e métodos).
As classes definidas em um mesmo pacote podem acessar todos os recursos dessas classes que não sejam declarados como private.
As classes especializadas (subclasse) podem acessar os recursos da classe pai declarados como protected ou public.
Qualquer classe do sistema pode acessar os recursos public das demais classes.
Um detalhe importante, o java não suporta herança múltipla, ou seja, a linguagem java implementa apenas a herança simples. Isso significa que uma classe pode ter uma e somente uma classe pai ou superclasse.
continua...
Nenhum comentário:
Postar um comentário