Definições sobre Orientação a Objetos

Olá pessoal meu nome é João Lucas Fortuna, quando optei em programar em Java tudo que eu via era “Java uma linguagem fácil de programar” e assim como muitos que estão iniciando na programação Java, eu tive alguns problema para entender o que era Orientação a Objetos e alguns outros conceitos.
Então eu decidi esclarecer minhas duvidas, pesquisando em muitos sites sobre os conceitos da linguagem Java e Orientação a Objetos. Com isso cheguei a seguinte conclusão:


  • Programação Orientada a Objetos ou POO:
    É uma abstração de objetos do mundo real, facilitando a compreensão do programa a ser criado.
    A POO foi criada para tentar aproximar o mundo real do mundo virtual: a ideia fundamental é tentar simular o mundo real dentro do computador. Para isso, nada mais natural do que utilizar Objetos. O programador é responsável por moldar o mundo dos objetos, e explicar para estes objetos como eles devem interagir entre si. Os objetos “conversam” uns com os outros através do envio de mensagens, e o papel principal do programador é especificar quais serão as mensagens que cada objeto pode receber, e também qual a ação que aquele objeto deve realizar ao receber aquela mensagem em específico.
    É uma maneira fácil de programar que ajuda na organização compreensão de como um determinado programa funciona. Esta programação e voltada para Interface e não para a Implementação. É sempre bom programar pensando na interface de sua classe, como seus usuários a estarão utilizando, e não somente como deve funcionar.
    A programação orientada a objetos é formada por alguns itens, dentre os quais destacamos: Classes, Objetos, Atributos, Métodos, Construtores, Abstração, Encapsulamento, Herança, Polimorfismo etc. Todo programa em Java usa classes e objetos. Na prática, sistemas de software reais são grandes e precisam ser fatorados em partes relativamente independentes para serem viáveis.
    Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos, além de concentrar as responsabilidades nos pontos certos.

  • Os 4 pilares da Programação Orientada a Objetos:
    Quando se programa orientado a objetos alguns itens são essenciais para caracteriza-lo, a partir desses itens é que toda a lógica pode ser aplicada e consequentemente todas as vantagens dessa metodologia podem ser aproveitadas.

  • Abstração

  • Encapsulamento

  • Herança

  • Polimorfismo

  • Abstração:
    Abstração para a OO, nada mais é do que você observar comportamentos e estruturas do dia a dia, e transformá-los em uma linguagem computacional.
    Esse pilar, como o próprio nome diz, visa abstrair algo do mundo real e transforma-lo em um objeto na programação. Esse objeto será composto por uma identidade, propriedades e métodos. Dessa forma fica mais simples trazer para dentro da programação o problema que precisa ser resolvido ou o processo que precisará ser automatizado.


  • Encapsulamento:
    O encapsulamento é uma das principais técnicas que define a programação orientada a objetos. Essa pilar visa a proteção de variáveis importantes dentro de uma classe que não podem ser manipuladas diretamente.
    Para fazermos um paralelo com o que vemos no mundo real, temos o encapsulamento em outros elementos.
    Por exemplo, quando clicamos no botão ligar da televisão, não sabemos o que está acontecendo internamente. Podemos então dizer que os métodos que ligam a televisão estão encapsulados.

  • Herança:
    Uma das grandes vantagens da programação orientada a objetos é justamente o reaproveitamento do código fonte, isso só é possível graças a herança. Com ela uma classe pode herdar as propriedades de uma classe mestra como por exemplo, a classe cachorro herda as propriedades da classe mamífero. Essa analogia indica que o cachorro tem características próprias, mas ele é um mamífero e compartilha das mesmas características que um gato, por exemplo, porém cada qual com suas peculiaridades.

  • Polimorfismo:
    Outro ponto essencial na programação orientada a objetos é o chamado polimorfismo. Na natureza, vemos animais que são capazes de alterar sua forma conforme a necessidade, e é dessa ideia que vem o polimorfismo na orientação a objetos. Como sabemos, os objetos filhos herdam as características e ações de seus “ancestrais”.
    Entretanto, em alguns casos, é necessário que as ações para um mesmo método seja diferente. Em outras palavras, o polimorfismo consiste na alteração do funcionamento interno de um método herdado de um objeto pai.

Esses quatro pilares são essenciais no entendimento de qualquer linguagem orientada a objetos e da orientação a objetos como um todo. Cada linguagem irá implementar esses pilares de uma forma, mas essencialmente é a mesma coisa.


  • Classes:
    Uma classe nada mais é do que um projeto que abstrai um conjunto de objetos com características similares. Uma classe define o comportamento de seus objetos através de métodos e os estados possíveis destes objetos através de atributos. Em outros termos, uma classe descreve os serviços providos por seus objetos e quais informações eles podem armazenar.
    Note que uma Classe não tem vida, é só um conceito. Mas os Objetos possuem vida.
    Classes não são diretamente suportadas em todas as linguagens, e são necessárias para que uma linguagem seja orientada a objetos. Classes são os elementos primordiais de um diagrama de classes.

  • Atributos:
    Um atributo é uma variável declarada no corpo de uma classe.
    Os Atributos são os elementos que definem a estrutura de uma classe (são as características de um objeto). Atributos são, basicamente, a estrutura de dados que vai representar a classe. A declaração de um atributo especifica o seu nome, seu tipo (que pode ser um dos tipos naturais, tais como int, char, double, float, ou o nome de uma classe, como String ou Pessoa), você pode dar qualquer nome ao atributo, desde que este nome não corresponda a uma palavra reservada da linguagem. Por questões de padronização, o nome de um atributo sempre começa com uma letra minúscula.

  • Métodos:
    Métodos são blocos de código que pertencem a uma classe e tem por finalidade realizar uma tarefa. Os métodos determinam o comportamento dos objetos de uma classe, métodos são as ações que um objeto pode realizar. Um método sempre tem que definir o que retorna, nem que defina que não há retorno.

  • Variáveis:
    Variáveis são nomes atribuídos à endereços na memória de um computador onde se guardam dados. A declaração de uma variável consiste em dar um nome para a posição de memória a ser usada e especificar qual tipo de dado a guardar na memória. O valor da variável é copiado para o atributo titular do objeto.

  • Obs:
    Atributos e Variáveis são a mesma coisa em questão de funcionalidade. Ambos são endereços de memória que tem um espaço ou tamanho definido de acordo com o tipo de dado que será guardado, por exemplo: caractere, número, número decimal, etc.
    Em Java, costumamos utilizar o termo atributo, que é nada além do que uma variável que está dentro de uma classe. Como tudo que fazemos em Java está contido dentro de uma classe, então usamos o termo atributo ao invés de variável.

  • Instância:
    Assim, em programação orientada a objetos, a palavra “instanciar” significa criar. Quando falamos em “instanciar um objeto”, criamos fisicamente uma representação concreta da classe. Instância é a concretização de uma classe. Quem faz o papel de instanciador em Java é o new. New trata de reservar memória o suficiente para o objeto e criar automaticamente uma referência a ele. Para new conseguir determinar o objeto, precisamos usar o método construtor que será usado como base para instanciar a classe e gerar o objeto.

  • Objeto:
    Em ciência da computação, objeto é uma referência a um local da memória que possui um valor. Os objetos são características definidas pelas classes, são instância de uma classe. Em Java, objetos são criados a partir de modelos que os descrevem.
    Esses modelos são chamados de classes. É dentro dessas classes que definimos que atributos os objetos conterão e que métodos os objetos fornecerão.
    Elementos de software que representam entidades físicas ou abstratas, simples ou complexas, dentro de um sistema. Possuem identidade, responsabilidades específicas, estado e um conjunto de mensagens que estão aptos a responder.
    Em programação orientada a objetos, um objeto passa a existir a partir de um “molde” (classe); a classe define o comportamento do objeto, usando atributos (propriedades) e métodos (ações). A palavra objeto refere-se a uma instância de uma classe.

Essas definições foram retirada de vários artigos, portanto não são de minha autoria.
Se você gostou e se lhe foi útil faça um Comentário sobre este post.

11 curtidas

Excelente artigo cara.

Ótimo resumo pra quem está começando e pra quem já sabe o que é POO é uma ótima revisão.

Valeu!

1 curtida

Obrigado pelo artigo,muito bom,de verdade.

João Lucas, parabéns pelo artigo, ficou show de bola. E, muito obrigado por compartilhar conosco.
Abraço.

Ficou muito bom, explicou de uma maneira simples sobre o conteúdo. Parabéns.

1 curtida

Sobre Herança eu tenho as minhas duvidas.

Não é verdade q reutilização de código só é possível por conta da herança. Existe composição por exemplo. Depois de trabalhar com linguagens q suportam herança múltipla, hoje com Go eu só tenho composição e acho ótimo.

JavaScript, por exemplo, é baseado em Protótipos e é outro exemplo de reuso q não usa herança

3 curtidas

Exatamente, infelizmente muitos cursos e professores ensinam que a herança é a forma de reaproveitar código, o que é um erro. Herança é para um objeto herdar comportamentos e características.

Eu também prefiro utilizar composição no lugar de herança, o código fica menos acoplado e a manutenção é mais fácil.
No Java é possível realizar herança múltipla utilizando herança de interfaces e composição de classes, embora pareça trabalhoso pra quem não está acostumado, gosto muito de usar este modelo.

1 curtida

Ai entrariamos em um outro debate: o dos cursinhos com decoreba. eu vejo gente decorando “polimorfismo, encapsulamento” mas não entendem esses conceitos na pratica. até pq demanda tempo mesmo pra entender. é muito murro em ponta de faca até cair as fichas

1 curtida

Concordo com @peczenyj.

Esses artigos sempre soam para vender OO/Herança. Reaproveitamento de código se faz mesmo de forma procedural.

def whileLoop(condition: => Boolean)(command: => Unit) {
  if (condition) {
    command; whileLoop(condition)(command)
  } else ()
}

As estruturas de dados , são sempre um paradigma , mesmo quando se trata de orientação a objetos . Uma das primeiras diferenças entre Scala e uma linguagem como Java, é que Scala também suporta o paradigma funcional.

Sobre a afirmação acima, não seria correto afirmar que JavaScript suporta herança baseada em protótipos e Java suporta herança baseada em classes?

Quero dizer, em JS há herança, só que implementada de outra forma, não?

1 curtida

Ola

Em JS 6 existe herança

No js comum e mundano isso não existe. Prototipo é prototipo, herança é herança.

Herança vc teria um tipo B q herda o comportamento do tipo A. Ou seja, se B não implementa o metodo X então vou executar o X definido em A.

Com JavaScript vc precisa explicitamente copiar os metodos de A para B. Isso é uma emulação de herança. Se vc adiciona ou altera A depois disso B não vai tomar conhecimento.

Para mim isso não é herança. São mecanismos completamente diferentes de reuso de código

1 curtida

Galera, preciso de ajuda para entender como funciona Array. No caso estou montando um programa teste (usando MVC) que cria uma conta bancaria. Porem para eu chamar uma confirmaçao na View vinda do Controller, queria usar o Array para alocar as informações que o usuario digitou na View, antes de mandar para o Model. Aqui está a parte do codigo da View:

 private void jBInserirActionPerformed(java.awt.event.ActionEvent evt) { 
        // i referencia o Model; c referencia o Controller.           
        i.setConta(Integer.parseInt(jTFConta.getText()));
        i.setNome(jTFNome.getText());
        i.setSaldo(Double.parseDouble(jTFSaldo.getText()));
        i.setLimite(Double.parseDouble(jTFLimite.getText()));            
        c.mostraDados(i);
}    

No caso estou mandando como parâmetro para o Controller a referência ao objeto em que antes joguei as informações. Mas em vez de mandar a referência do objeto queria usar o Array ai. Como proceder? (PS.: Mexo com NetBeans, e so tem uns 10 dias kkk então sejam bem simplistas por favor rsrs)

E sou novo aqui no GUJ, prazer galera! Meu nome é Sávio! Tamo junto hehe xD

Outra dúvida sobre Array:

Se array eh tipo uma variável especial, mas tratamos ela como objeto (afinal tem q meio q instanciá-la neh? Me corrijam caso eu esteja errado), no caso teria que ter uma classe apenas para o Array, onde crio metodos de lançamento de informações, de acordo com oq preciso?

Seria bacana abrir um tópico apenas para esta dúvida.