JavaRush /Blogue Java /Random-PT /Conceitos de programação orientada a objetos JAVA
shabnahm
Nível 18

Conceitos de programação orientada a objetos JAVA

Publicado no grupo Random-PT
JAVA é baseado nos conceitos de programação orientada a objetos, o que permite passar para um nível superior de abstração para resolver qualquer problema de forma realista. A abordagem orientada a objetos conceitua a solução para um problema em termos de objetos do mundo real que são mais fáceis de reutilizar em uma aplicação. Por exemplo, Chair(cadeira), Fan(ventilador), Dog(cachorro), Computer(computador) e assim por diante. Em JAVA, uma classe é um layout, modelo ou protótipo que define o comportamento geral de um objeto de um determinado tipo. Uma instância é uma implementação separada de uma classe e todas as instâncias de uma classe possuem as mesmas propriedades, que são descritas na definição da classe. Por exemplo, você pode definir uma classe chamada Casa com número de cômodos como atributo e criar instâncias da classe, como uma casa de dois cômodos, uma casa de três cômodos e assim por diante. Conceitos de programação orientada a objetos JAVA - 1Vantagens: Listadas abaixo estão algumas vantagens do desenvolvimento de software orientado a objetos.
  • Redução dos custos de suporte de software, principalmente pelo fato de ser realizado de forma modular.
  • Reutilização aprimorada de código por meio de recursos como herança, resultando em desenvolvimento de software mais rápido.
  • Maior confiabilidade e flexibilidade do código.
  • Facilidade de compreensão devido à simulação do mundo real.
  • Melhor abstração no nível do objeto.
  • Reduzindo a complexidade da transição de uma fase de desenvolvimento para outra.
Existem quatro características principais da OOP:
  • Encapsulamento
  • Herança
  • Polimorfismo
  • Abstração

Encapsulamento

O encapsulamento atua como um contrato para um objeto, o que ele deve ocultar e o que deve abrir para acesso de outros objetos. Em JAVA, usamos um modificador de acesso privatepara ocultar um método e restringir o acesso a uma variável do mundo exterior. JAVA também possui vários modificadores de acesso: public, default, protected, private, que são usados ​​para restringir a visibilidade em diferentes níveis. Mas o objetivo final é encapsular aquelas coisas que não deveriam ser alteradas. A abordagem que funciona melhor é que uma classe deve ter apenas um motivo para mudar, e o encapsulamento torna o design desse “único motivo” uma realidade. A abordagem correta para o encapsulamento é ocultar coisas que mudam frequentemente para evitar danos a outras classes. Benefícios: Abaixo estão alguns dos benefícios do encapsulamento:
  • Podemos proteger o estado interno de um objeto ocultando seus atributos.
  • Isso melhora a modularidade do código porque evita que os objetos interajam de maneiras inesperadas.
  • Melhora a usabilidade do código.
  • Isto apoia a relação contratual de uma entidade específica.
  • O encapsulamento torna o software mais fácil de manter.
  • As alterações no código podem ser feitas independentemente umas das outras.

Polimorfismo

Polimorfismo em programação é a capacidade de fornecer a mesma interface para diferentes formas subjacentes (tipos de dados). Isso significa que classes com funcionalidades diferentes compartilham a mesma interface e podem ser chamadas dinamicamente passando parâmetros por referência. Um exemplo clássico é a classe Shape(forma) e todas as classes que dela herdam: square(quadrado), circle(círculo), dodecahedron(dodecaedro), irregular polygon(polígono irregular), splat(bolha) e assim por diante. Neste exemplo, cada classe terá seu próprio método Draw()e o código do cliente pode simplesmente fazer:
Shape shape = new Shape();
Shape.area()para obter o comportamento correto de qualquer forma A beleza do polimorfismo é que o código, trabalhando com classes diferentes, não precisa saber qual classe está usando, pois todas funcionam com o mesmo princípio. O processo usado pelas linguagens de programação orientadas a objetos para implementar o polimorfismo dinâmico é chamado de ligação dinâmica. Nota: Polimorfismo é a capacidade de escolher métodos mais específicos para executar dependendo do objeto. O polimorfismo ocorre quando classes abstratas não estão envolvidas. Vantagens:
  • Criação de código reutilizável. Ou seja, uma vez criada, implementada e testada uma classe, ela pode ser usada livremente sem se preocupar com o que exatamente está escrito nela.
  • Isso permite um código mais genérico e pouco acoplado.
  • O tempo de compilação é reduzido, o que acelera o desenvolvimento.
  • Vinculação dinâmica.
  • A mesma interface pode ser usada para criar métodos com diferentes implementações.
  • Toda a implementação pode ser substituída usando as mesmas assinaturas de método.
Substituição de método como parte do polimorfismo. Uma substituição interage com dois métodos: um método na classe pai e um método na classe derivada. Esses métodos têm o mesmo nome e assinaturas. A substituição permite executar a mesma operação de maneiras diferentes para diferentes tipos de objetos. Por exemplo:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
Conceitos de programação orientada a objetos JAVA - 2Sobrecarga de método ou polimorfismo ad-hoc ou polimorfismo estático A sobrecarga interage com vários métodos da mesma classe que são nomeados de forma idêntica, mas possuem assinaturas de método diferentes. O recarregamento permite descrever a mesma operação de maneiras diferentes para dados diferentes. Às vezes é chamado de polimorfismo estático, mas na verdade não é polimorfismo. Isso nada mais é do que simplesmente ter dois métodos com os mesmos nomes, mas uma lista de argumentos diferente. A reinicialização não tem nada a ver com herança e polimorfismo. E um método sobrecarregado não é a mesma coisa que um método substituído. Polimorfismo paramétrico por meio de geração em JAVA Ao declarar uma classe, o campo de nome pode ser associado a diferentes tipos, e o nome do método pode ser associado a diferentes parâmetros e tipos de retorno. JAVA suporta polimorfismo paramétrico usando genéricos.
List<String> list = new ArrayList<String>();
Por que não podemos substituir um método estático em JAVA? A substituição depende da existência de uma instância da classe. A ideia do polimorfismo é que você pode criar uma subclasse, e os objetos implementados por essas subclasses se comportarão de maneira diferente com os mesmos métodos da classe pai (substituídos nas subclasses). Um método estático não está associado a nenhuma instância da classe, portanto o conceito de substituição em si não pode ser aplicado. Os criadores do JAVA foram guiados por duas considerações que influenciaram esta abordagem. Primeiro, existem problemas de execução de código: houve muitas críticas ao Smalltalk por ser lento (coleta de lixo e polimorfismo faziam parte desse problema), e o JAVA foi projetado para evitar isso. A segunda consideração foi a decisão de que o público-alvo de JAVA seriam desenvolvedores de C++. Ter métodos estáticos funcionando dessa maneira era muito familiar para os programadores de C++ e também agilizava as coisas, já que não havia necessidade de subir na hierarquia de classes para descobrir qual método chamar. Você vai direto para a aula e chama um método específico.

Herança

Herança é o ato de incorporar o comportamento (ou seja, métodos) e o estado (ou seja, variáveis) de uma classe base em uma classe derivada para que fiquem disponíveis nessa classe derivada. A principal vantagem da herança é que ela fornece um mecanismo formal para reutilização de código e evita duplicação. Uma classe herdada estende a funcionalidade do aplicativo copiando o comportamento da classe pai e adicionando novas funcionalidades. Isso torna o código altamente acoplado. Se quiser mudar a superclasse, você terá que conhecer todos os detalhes das subclasses para não quebrar o código. Herança é uma forma de reutilização de software onde uma nova classe (subclasse) é criada a partir de uma classe existente (superclasse) que estende sua funcionalidade e usa algumas das propriedades da superclasse. Então, se você tem uma classe pai e então aparece uma classe filha, o filho herda todas as coisas que o pai possui. Vantagens:
  • Reutilização de código aprimorada.
  • A relação lógica “é um” (é alguém, alguma coisa) é estabelecida. Por exemplo: Cachorro é um animal . (Um cachorro é um animal).
  • Modularização de código.
  • As repetições estão excluídas.
Imperfeição:
  • Fortemente acoplado: Uma subclasse depende da implementação de uma classe pai, tornando o código fortemente acoplado.

Abstração

Abstração significa projetar classes com base em suas interfaces e funcionalidades, sem levar em conta os detalhes de implementação. Uma classe abstrata representa interfaces sem incluir a implementação real. Distingue a implementação de um objeto de seu comportamento. A abstração simplifica o código, ocultando detalhes sem importância. Vantagens:
  • Usando a abstração, podemos separar o que pode ser agrupado em algum tipo.
  • Propriedades e métodos modificados com frequência podem ser agrupados em um tipo separado, para que o tipo principal não esteja sujeito a alterações. Isto reforça o princípio da OOP: “O código deve estar aberto à extensão, mas fechado à mudança . ”
  • A abstração simplifica a representação de modelos de domínio.
Diferença entre abstração e encapsulamento O encapsulamento é uma estratégia usada como parte da abstração. Encapsulamento refere-se à estrutura de um objeto: os objetos encapsulam suas propriedades e as ocultam do acesso externo. Os usuários de uma classe interagem com ela usando seus métodos, mas não têm acesso direto à estrutura da classe. Dessa forma, a classe abstrai detalhes de implementação relacionados ao seu design. Abstração é um termo mais geral. Também pode ser alcançado, entre outras coisas, usando subclasses. Por exemplo, uma classe List(lista) na biblioteca padrão é uma abstração para uma sequência de elementos, indexados de acordo com sua posição na lista. Exemplos específicos de uma lista Listsão ArrayListou LinkedList. O código que interage com uma lista Listabstrai os detalhes de qual lista ele usa. Freqüentemente, a abstração não é possível sem ocultar o estado subjacente usando encapsulamento. Se uma classe expõe sua estrutura interna, ela não pode alterar suas operações internas e, portanto, não pode ser abstraída. O que são classes abstratas e métodos abstratos? Acontece que durante o desenvolvimento você deseja que uma classe base forneça apenas uma interface para suas classes derivadas. Ou seja, você não quer que ninguém crie instâncias da classe base. Você precisa usar a interface de forma que apenas lance objetos nela (esta é uma conversão implícita que permite comportamento polimórfico). Isso é conseguido tornando esta classe abstrata usando a palavra-chave abstract. Isto impõe algumas restrições, como a impossibilidade de criar instâncias de uma classe abstrata; ao usar uma classe abstrata, é necessário implementar métodos abstratos. Isso garante polimorfismo. Uma classe abstrata pode conter métodos abstratos e concretos. Se pelo menos um método em uma classe for declarado abstrato, toda a classe também deverá ser declarada abstrata. No entanto, a regra na direção oposta não precisa ser observada. Se uma classe for declarada abstrata, ela não poderá conter métodos abstratos. Um método que apenas define suas assinaturas e não fornece uma implementação é chamado de abstrato. Sua implementação real é deixada para suas subclasses, que estendem a classe abstrata. Um método abstrato não pode ser usado por um objeto, apenas outra classe pode estendê-lo. Quando você deve usar uma classe abstrata? As classes abstratas permitem definir algum comportamento padrão e fazer com que as subclasses forneçam qualquer comportamento específico. Por exemplo: List(lista) é uma interface, por sua vez AbstractListdefine o comportamento básico de uma Lista, que pode ser usada como está ou refinada em uma subclasse, por exemplo, em ArrayList(array de lista). O que é uma interface? O conceito de interface é uma classe abstrata, mas a interface (definida pela palavra-chave interface) vai um passo além. Impede qualquer implementação de um método ou função. Você só pode declarar um método ou função, mas não fornecer sua implementação. A classe que implementa a interface deve cuidar da implementação real. As interfaces são muito úteis e amplamente utilizadas em OOP. Por compartilharem a própria interface e a implementação, oferecem muitas vantagens de seu uso:
  1. Herança múltipla .
  2. Acoplamento solto . Existe uma abstração da operação, como camadas, e a implementação concreta pode ser qualquer coisa: JDBC, JPA, JTA, etc.
  3. O programa de interface não está implementado .
  4. Polimorfismo de ligação dinâmica : A interface de programação de um objeto é exposta sem revelar sua implementação real.
  5. Níveis abstratos , separação de funcionalidade.
Diferença entre interface e classe abstrata.
  • Uma interface é uma relação contratual com as classes que implementam esta interface, afirmando que a implementação ocorre da forma designada pela interface. Este é um shell vazio com métodos declarados.
  • Uma classe abstrata define algum comportamento geral e pede às suas subclasses que definam um comportamento atípico ou específico para sua classe.
  • Métodos e membros de uma classe abstrata podem ser designados com qualquer modificador de acesso; por sua vez, todos os métodos de interface devem ser públicos.
  • Ao herdar uma classe abstrata, a classe descendente deve definir métodos abstratos, enquanto uma interface pode herdar outra interface sem necessariamente definir seus métodos.
  • Uma classe descendente pode estender apenas uma classe abstrata, mas uma interface pode estender ou uma classe pode implementar muitas outras interfaces.
  • Uma classe descendente pode definir métodos abstratos com o mesmo modificador de acesso ou menos restritivo, mas a classe que implementa a interface deve definir métodos com o mesmo nível de visibilidade.
  • Uma interface não contém construtores, enquanto uma classe abstrata contém.
  • As variáveis ​​declaradas na interface Java são finais por padrão. Uma classe abstrata pode conter variáveis ​​que não são finais.
  • Todos os membros da interface Java são public. Os membros de uma classe abstrata podem se dar ao luxo de ser public, protectedetc.

Composição

A reutilização de código pode ser alcançada usando herança e composição. Mas o uso da composição fornece um nível mais alto de encapsulamento do que a herança, uma vez que as alterações na classe back-end não afetarão necessariamente o código que pertence à classe front-end. Composição é uma técnica de design que usa relacionamentos “tem-a” (tem, inclui) em classes. Tanto a herança java quanto a composição de objetos podem ser usadas para reutilizar código. A essência da composição é expressar a relação “tem um” entre os objetos. Pense em uma cadeira. A cadeira tem assento. A cadeira tem encosto. Uma cadeira tem um certo número de pernas. A frase “tem um” sugere uma relação em que a cadeira tem, ou pelo menos usa, outro objeto. Esta é precisamente a relação “tem-um”, que é a base da composição. Vantagens:
  • Controle de visibilidade
  • A implementação pode ser substituída em tempo de execução
  • Acoplamento fraco, pois a classe da interface não depende da implementação.
Diferenças entre composição e herança
Não. Composição (tem a/tem) Herança (é um / é)
1 Suporta polimorfismo e reutilização de código. Suporta polimorfismo e reutilização de código.
2 O objeto de tempo de execução já foi criado. O objeto é criado dinamicamente em tempo de compilação.
3 A implementação pode ser substituída em tempo de execução. A implementação pode ser alterada em tempo de compilação.
4 Uma subclasse é independente de sua classe pai, o que favorece o acoplamento fraco (especialmente sob controle de interface). A subclasse depende da implementação da classe pai, portanto a ligação é considerada forte.
5 Utilização: A Casa dispõe de Casa de Banho. É errado dizer que a Casa é o Banheiro. A herança é unidirecional: uma casa é um edifício. Mas o edifício não é uma casa.
Nota: Não use herança apenas para garantir a reutilização do código. Se não houver relação “é um” (é), a composição é usada para esses fins. A diferença entre composição e agregação está nos relacionamentos de objeto. Agregação é um relacionamento no qual uma classe se ajusta a uma coleção. É parte de um relacionamento completo, onde a parte pode existir sem o todo. Tais relacionamentos são muito mais fracos. Não há dependência cíclica. Por exemplo: pedido e produto. Composição é um relacionamento no qual uma classe se ajusta a uma coleção. É parte de uma relação de todo em que a parte não pode existir sem o todo. Se o todo for destruído, todos os seus componentes também serão destruídos. É um relacionamento mais forte. Por exemplo: um polígono e seus vértices, uma ordem e sua componente.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION