Arquivar

Posts Etiquetados ‘POO’

Pilha em Java

20/05/2009 [nico] 1 comentário

Pilha:

A forma mais geral de uma lista permite a inserção ou eliminação de um elemento em qualquer posição na lista. Se restringirmos a ocorrência de inserção e eliminação a uma extremidade da lista, por exemplo, extremidades superiores, então temos uma estrutura de dados chamada de pilha.

Utilizando a terminologia de pilhas, operações de inserção e eliminação são comumente citadas como operações “push” e “pop”, respectivamente. O único elemento diretamente acessível de uma pilha é seu elemento superior. O elemento menos acessível é seu elemento inferior.

Desde que as operações de inserção e eliminação são executadas na mesma extremidade da pilha (por exemplo, na extremidade superior), os elementos podem ser removidos somente na ordem oposta a que foram inseridos.

Este interessante fenômeno é conhecido como LIFO. LIFO é um acrônimo para a expressão inglesa Last In, First Out que, em português significa último a entrar, primeiro a sair.

Um exemplo comum de pilha, que permite a seleção de seu elemento superior, é a pilha de pratos num restaurante. Os pratos em pilha fazem com que a pessoa tenha acesso ao prato superior, à remoção de um prato superior faz com que a pessoa tenha acesso ao próximo prato, se colocado um novo prato na pilha, esse será o primeiro a sair.

Em Java, já existe a classe para o TAD pilha, que é a java.util.Stack.

Os métodos disponíveis nesta classe, entre outros, são: push(), pop(), equivalentes a empilha() e desempilha() e peek(), equivalente a topo(), tamanho() e vazia().

Os métodos pop() e peek() lançam a exceção StackEmptyException se a pilha estiver vazia quando eles são chamados.

  • Outros métodos
    • size(): retorna o número de objetos da pilha
    • isEmpty(): retorna true se a pilha estiver vazia
    • top(): retorna, mas não remove, o objeto do topo da pilha, retornando um erro se a pilha estiver vazia

Exemplo simples:

Operação

Conteúdo da Pilha

Saida

Inserir X X -
Inserir Y X Y -
Inserir Z X Y Z -
Remover X Y Z
Inserir W X Y W -
Remover X Y W
Remover X Y
Remover   X
Remover   erro

Traduzindo a tabela em linguagem java.

import java.util.Stack;

/**

* Esta classe demonstra como funciona uma pilha em java

*

* @author Nico

*

* @since 20 MAIO, 2009

*

*/

public class TestarUmaStack {

public static void main(String[] args) {

// DECLARANDO NOSSOS ELEMENTOS/OBJETOS

String nico = “Nico”, kawano = “Kawano”, gaucho = “Gaucho”, erick = “Erick”, cris = “Cris”, junior = “Junior”, silvio = “Silvio”, jean = “Jean”;

// DECLARANDO A PILHA

Stack<String> nossaPilha = new Stack<String>();

// Passo 1: Incrementar Nico

nossaPilha.push(nico);

// Passo 2: Incrementar Kawano

nossaPilha.push(kawano);

// Passo 3: Incrementar Gaucho e Cris

nossaPilha.push(gaucho);

nossaPilha.push(cris);

// Passo 4: Decrementar elemento Cris do topo

nossaPilha.pop();

// Passo 5: Incrementar Erick

nossaPilha.push(erick);

// Passo 6: Incrementar Jean e Junior

nossaPilha.push(jean);

nossaPilha.push(junior);

// Passo 7: Substituir elemento na pilha. Jean por Silvio!

nossaPilha.set(4, silvio);

// EXIBINDO INFORMAÇÕES SOBRE A PILHA

if (nossaPilha.isEmpty()) {

System.out.println(“A PILHA ESTÁ VAZIA!”);

} else {

System.out

.println(“NOSSA PILHA DO GRUPO…\n\nElemento\tÍndice\n———————-”);

for (int i = nossaPilha.size() – 1; i > -1; i–) {

System.out.println(nossaPilha.get(i) + “\t\t” + i);

}

System.out.println(“\nNÚMERO DE ELEMENTOS: “ + nossaPilha.size());

System.out.println(“ELEMENTO NO TOPO: \”" + nossaPilha.peek()

+ “\” no índice “ + nossaPilha.indexOf(nossaPilha.peek()));

}

}

}

Resultado:

NOSSA PILHA DO GRUPO…

Elemento    Índice
———————-
Junior      5
Silvio       4
Erick        3
Gaucho   2
Kawano  1
Nico        0

NÚMERO DE ELEMENTOS:  6
ELEMENTO NO TOPO:  “Junior” no índice 5

CategoriasJava, POO Tags:,

Orientação a Objetos – Parte 3

CONCEITO DE ENCAPSULAMENTO

  • Encapsulamento é o mecanismo pelo qual podemos unir numa mesma estrutura de dados, dados e métodos.
  • Por meio do encapsulamento pode-se ocultar os dados.
  • O princípio do encapsulamento: “Princípio do Menor Privilégio” – disponibilize ao usuário somente aquilo que for necessário, o resto esconda.

CONCEITO DE HERANÇA

  • Herança é o processo de definição de uma classe baseada em outra classe.
  • Terminologia
    • Classe Base               Classe Derivada
    • Classe Mãe/Pai          Classe Filha
    • Super-classe              Sub-classe
    • Generalização            Especialização
  • A classe derivada herda e incorpora todos os atributos e métodos da classe base.
  • Podemos adicionar ou redefinir algum método ou adicionar atributos na classe derivada a fim de adaptar a definição à nova classe.

CONCEITO DE POLIMORFISMO

  • O polimorfismo é caracterizado pela frase: “Uma interface, vários métodos”
  • Caso se faça a sobreposição de métodos (com a mesma assinatura) em uma herança, será possível se aplicar o conceito de Polimorfismo.
  • Tendo-se uma variável do tipo da classe mãe, pode-se criar uma instância para qualquer classe filha descendente da mesma e armazenar sua referência na variável.
  • Como o método está definido na classe mãe e sobrecarregado na classe filha, o compilador irá escolher o método baseado no tipo da instância apontada pela referência e não pelo tipo da mesma.
  • Permite uma interface ser usada para representar uma classe geral de ações.
CategoriasPOO, Programação Tags:,

Orientação a Objetos – Parte 2

ASSINATURA DE UM MÉTODO

  • A definição do método é conhecida como a sua assinatura. O compilador irá localizar um código a ser executado Através da sua assinatura.
  • Dois métodos são diferentes se possuírem assinaturas diferentes.
  • Na assinatura de um método entram:
    • O nome do método;
    • A quantidade de parâmetros do mesmo;
    • O tipo de cada parâmetro;
    • A ordem desses parâmetros;
  • Obs. – o tipo de retorno de um método não faz parte da assinatura do mesmo.

SOBRECARGA MÉTODOS

  • A sobrecarga de métodos (overload) é a capacidade de definir mais de um método com o mesmo nome, mas com assinaturas diferentes em uma única classe.
  • Métodos sobrecarregados possuem o mesmo nome, mas a lista de parâmetros formais é diferentes.
  • Através da assinatura, o compilador irá selecionar o método certo a ser executado.

SOBRESCRITA DE MÉTODOS

  • A sobreposição de métodos (override) é a capacidade de redefinir um método com a mesma assinatura em uma classe filha de outra classe. Sempre temos que ter herança na aplicação da sobreposição de métodos.
  • O compilador irá escolher o método a ser executado baseado no tipo da instância utilizada na chamada e não no tipo da referência usada.
CategoriasPOO, Programação Tags:,

Orientação a Objetos – Parte 1

Continuando a saga Java, agora irei explicar os conceitos sobre Programação Orientada a Objeto (POO).

Pra este tópico não ficar muito extenso, vou dividir esse assunto em 3 partes.

TÓPICOS QUE SERÃO ABORDADOS:

  • Vantagens da Orientação a Objetos.
  • Conceito de objeto.
  • Estado de um objeto.
  • Conceito de classe.
  • Assinatura de um método.
  • Sobrecarga métodos.
  • Sobrescrita de métodos.
  • Conceito de encapsulamento.
  • Conceito de herança.
  • Conceito de polimorfismo.

    VANTAGENS DA ORIENTAÇÃO A OBJETOS

    • MODULARIDADE
      • Cada objeto pode ser desenvolvido independente dos outros, os outros objetos apenas precisam conhecer a interface do objeto (que mensagens o objeto aceita)
    • ENCAPSULAÇÃO
      • Certos detalhes podem ser omitidos dos outros objetos. Existem estados e comportamentos internos que podem ser alterados sem interferir na interação com outros objetos.
    • HERANÇAS
      • Novas classes podem ser criadas a partir de outras

    CONCEITO DE OBJETO

    • Um objeto é algo que possui um Estado, um Comportamento e uma Identidade
    • Um objeto é uma entidade capaz de manter um estado, ou seja informação, e que oferece um número de operações que podem ser realizadas sobre o mesmo.
    • As operações podem examinar ou alterar as informações (estado) do objeto.
    • Todo objeto deve ser identificado unicamente no sistema.

    ESTADO DE UM OBJETO

    • O estado de um objeto é definido como sendo as propriedades do mesmo em um determinado instante de tempo.
    • Os estados de um objeto são implementados através de Atributos.
    • Um objeto pode ser
      • Estático ou Passivo
        • O seu estado quase não muda durante a sua existência no sistema.
        • Dinâmico ou Ativo
          • O estado do objeto está constantemente mudando devido a aplicação de alguma operação sobre o mesmo.
    • O comportamento de um objeto é a maneira que o mesmo apresenta-se para o sistema.
    • É o conjunto de operações possíveis de realizar-se sobre este objeto.
    • O comportamento de um objeto é implementado através de Métodos.
    • Os métodos podem:
      • Retornar algum valor de algum estado do objeto.
      • Pedir para o objeto fazer algo, alterando o seu estado.
      • Informar para o objeto alguma situação externa ocorrida e que irá influenciar o estado do mesmo.

    CONCEITO DE CLASSE

    • Uma classe é algo que define um estado e um comportamento.
    • Uma classe serve de modelo o qual é capaz de descrever um estado e um comportamento.
    • O modelo oferece operações que modificam o estado.
    • O estado é representado pelos dados da classe e o comportamento pelo métodos da classe.
    CategoriasPOO, Programação Tags:,

    Programação Orientada a Objetos

    Programação Orientada a Objetos = POO.

    Nem sempre conceitos de programação orientada a objeto são fáceis de assimilar ainda mais quando falamos da diferença entre polimorfismo e sobrecarga ou sobre o funcionamento pratico do encapsulamento.

    Aproveitando o post do UltraG do site BSIDEIAS, que me foi muito útil diga-se de passagem, onde de forma simples e rápida ele explica as bases da linguagem orientada a objeto, por isso resolvi compartilhar compartilhar com vcs.

    O que é programar Orientado a Objetos?

    Programar Orientado a Objetos é pensar em como criar seu código como você pensa na vida real. É você abstrair os objetos da vida real e leva-los para as linhas de código como eles são – com suas características, que são os atributos e suas ações, que são os métodos. Todo objeto tem características e ações.

    A POO foi criada com o intuito de resolver os problemas da programação estruturada. A idéia era resolver problemas o mais rápido possivel e com a segurança que funcionaria em qualquer lugar a mesma solução. A grande vantagem disso é o reaproveitamento de código, isso traz uma redução no tempo que uma solução pode ser gerada. Tempo em programação pode ser muito caro, por isso a POO é tão bem aceita!

    O que é um Objeto?

    Um objeto é um elemento computacional que representa, no domínio da solução, alguma entidade (abstrata ou concreta) de interesse do sistema sob análise. Objetos similares são agrupados em classes. No paradigma da orientação a objetos, tudo pode ser potencialmente representado como um objeto. Sob o ponto de vista da programação, um objeto não é muito diferente de uma variável no paradigma de programação convencional.

    Quando se define uma variável em Java, essa variável terá:

    • Um espaço em memória para registrar o seu estado atual (um valor)

    • Um conjunto de operações associadas que podem ser aplicadas a ela, através dos operadores definidos na linguagem que podem ser aplicados a valores inteiros (soma, subtração, inversão de sinal, multiplicação, divisão inteira, resto da divisão inteira, incremento, decremento).

    Da mesma forma, quando se cria um objeto, esse objeto adiquire um espaço em memória para armazenar seu estado (os valores de seu conjunto de atributos, definidos pela classe) e um conjunto de operações que podem ser aplicadas ao objeto (o conjunto de métodos definidos pela classe).

    Portanto um programa orientado a objetos é composto por um conjunto de objetos que interagem através de “trocas de mensagens” entre eles. Na prática, essa troca de mensagem traduz-se na chamada de métodos (funções) entre objetos.

    Exemplo de um objeto:

    Um Jaguar é um objeto. Ele tem como características a cor, peso, quantidade de portas, modelo, ano, etc. Também tem ações como frear, buzinar, acelerar, abrir os vidros, trocar de marchas, etc. Portanto programar Orientado a Objetos é você fazer essa abstração do mundo real e transforma-la em código. Mais adiante mostrarei um exemplo de código Orientado a Objetos.

    A POO tem quatro pilares que a sustenta, seguindo:

    Abstração:

    É a capacidade de você pensar nos objetos da vida real e classifica-los. É o processo pelo qual modelamos sistemas reais ou imaginários, extraindo do seu contexto os seus principais elementos “Objetos”, e descrevemos cada objeto, com suas principais “características” de dados e funcionalidades.

    Uma Ferrari por exemplo tem as mesmas características do objeto Jaguar citado acima, possui até mais, mas eles tem algo em comum, ou seja, ambos são carros, logo pertencem a classe carro. A Ferrari é um tipo de carro e o Jaguar também, mas cada um com suas características e ações particulares e comuns.

    Programar Orientado a Objetos é fácil, o difícil é programar Orientado a Objetos bem. Pois se programando bem, você pode tirar proveito de todas as vantagens que a POO possui e para se programar bem Orientado a Objetos a principal característica que o programador deve ter é uma boa abstração do mundo real.

    Encapsulamento:

    Os objetos como dito acima contém atributos e métodos. O encapsulamento trata de dar alguma segurança aos objetos. Explico:

    Um objeto Cliente por exemplo tem atributos como qualquer outro e estes não podem ser acessados por qualquer outro objeto diretamente. Existem dois tipos de atributos, os privados e os publicos. Em UML e OO (orientação a objetos) é definido que para atributos privados usa-se o sinal de “-” antes do nome e para atributos publicos usa-se o sinal de “+” antes do nome.

    Exemplo:

    objeto cliente

    Para que o encapsulamento exista é preciso deixar os atributos privados e os métodos públicos, assim está sendo garantido que os valores atribuídos aos atributos serão sempre respeitados pelas regras existentes.

    Exemplo:

    O atributo cpf deve sempre ter 11 números, se o atributo não for privado, ele perde essa regra (11 números) pois alguém poderia acessar e colocar 12 ou 9 números tornando-o inválido.

    Como os atributos privados não podem ser acessados diretamente por outros objetos, existem os métodos publicos que são os responsáveis em acessar os atributos e trazer ou levar algum dado para o objeto respeitando as regras.

    Idéia de encapsulamento:

    encapsulamento

    Herança:

    O que torna a orientação a objetos única é o conceito de herança que no inglês significa inheritence.

    Herança é um mecanismo que permite que características comuns a diversas classes com comportamentos comuns ou parecidos, sejam abstraídas e centralizadas em uma classe base, ou superclasse. Tem uma relação “É um”.

    Exemplo:

    Um Jaguar “é um” carro. Logo ele foi herdado da classe carro, pois contém as características comuns de um carro.

    A partir dessa superclasse outras classes podem ser especificadas. Portanto uma subclasse que é uma classe herdada da superclasse recebe sem codificação extra as características da superclasse. Ainda podemos adicionar elementos particulares a está subclasse.

    Na linguagem Java uma subclasse somente pode herdar uma única superclasse diretamente.

    Exemplo:

    herançajaguar

    Polimorfismo:

    Analisando a palavra Polimorfismo, ela significa muitas formas. Ou seja, para uma árvore de herança, temos muitas formas de objetos e métodos a partir de uma superclasse e suas subclasses. Polimorfismo é o princípio pelo qual usamos objetos construídos a partir de uma árvore de herança, através de referências do tipo de uma superclasse da hierarquia.

    Formas de polimorfismo:

    • Subclasses;
    • Sobrescrita de método;
    • Sobrecarga de método ou construtor

    Sobrescrita de métodos – Overriding

    Esta utilidade nos permite escrever numa subclasse um ou mais métodos presentes numa das superclasses podendo alterar o comportamento da superclasse.

    Exemplo:

    polimorfismo

    Quando numa subclasse reescrevemos um método já existente numa superclasse, chamamos de sobreescrita de método ou reescrita de método mas o termo técnico é Method Overriding. Lembrando que a sobrescretica de métodos só é valida quando o método reescrevido na subclasse tem exatamente a mesma identificação (nome, tipos, etc.) do método da superclasse.

    Sobrecarga de métodos – Overloading

    O Polimorfismo ainda permite que numa mesma classe tenhamos métodos com o mesmo nome, desde que o número ou tipos de parâmetros passados sejam diferentes.

    Exemplo:

    sobrecarga

    A sobrecarga de métodos é uma ferramenta poderosa, pois nos permite criar vários métodos com o mesmo nome, isso facilita o entendimento de problemas mais complexos, pois não é necessária a criação de nomes de funcionalidades sem sentido aparente.

    Classes

    Entendido todos os conceitos acima fica fácil entender o que é uma classe. Como na vida real existem diversos objetos do mesmo tipo, nos softwares também é assim. Imagine o sistema de gerenciamento de veículos do Detran. Quantos objetos do tipo carro este sistema deve manipular por dia? Se fosse feita uma descrição para cada um, o sistema jamais iria funcionar.

    Assim, podemos descrever um mesmo tipo de objetos uma única vez e cada vez que um novo objeto precise ser criado, é só utilizar a mesma fôrma. Esta fôrma é chamada classe.

    Pense em uma padaria, quando você vai escolher bolos se depara com muitos bolos idênticos. Ai você se pergunta, seria o padeiro capaz de produzir tantos bolos com a mesma forma apenas usando as mãos?NÃO! Ele usou uma fôrma para fazer estes bolos, a fôrma foi o molde que ele queria para seus bolos. Com os objetos não é diferente, as classes são os moldes (modelos, fôrmas, plantas) para criação dos os objetos em tempo de execução dos programas.

    Ainda tem mais, uma classe é a descrição de um conjunto de objetos que possuem os mesmos atributos, operação e semântica. Dizemos que um objeto é uma instância de uma classe, quando ele é criado a partir dela, seguindo sua especificação.

    Ainda existe a diferença entre abstração e instância

    A abstração denota a essência ideal de uma coisa; a instância denota uma manifestação concreta.

    Poderíamos também dizer que, na codificação existem somente as classes, não os objetos. Já em tempo de execução, o que existe são os objetos e não as classes. Também dizemos que uma variável é de um determinado tipo (inteiro, booleano, real, etc.) numa linguagem de programação, então dizemos que um objeto é de uma determinada classe.

    Uma classe é a reunião de objetos idênticos por meio de atributos e métodos.

    CategoriasPOO Tags:,