No mundo da programação, existem muitas formas de se programar, elas são chamadas de paradigmas de programação. Entre elas estão programação orientada a objeto, ou POO. objetivo da criação do POO foi principalmente de aproximar o manuseio das estruturas de um programa ao manuseio das coisas do mundo real (objeto). Esse paradigma se baseia em dois conceitos chaves: classes e objetos.
A herança é um princípio da POO que permite a criação de novas classes a partir de outras previamente criadas. Essas novas classes são chamadas de subclasses, ou classes derivadas; e as classes já existentes, que deram origem às subclasses, são chamadas de superclasses, ou classes base. Deste modo é possível criar uma hierarquia dessas classes, tornando, assim, classes mais amplas e classes mais específicas. Uma subclasse herda métodos e atributos de sua superclasse; apesar disso, pode escrevê-los novamente para uma forma mais específica de representar o comportamento do método herdado.
Ex: Temos as classes Funcionario e Coordenador que possuem o atributo nome e matrícula em comum.
Quando trabalhamos com herança e dizemos que uma subclasse PessoaFisica e PessoaJuridica são filhas da super classe Pessoa, podemos então dizer que um PessoaFisica É UMA Pessoa e PessoaJuridica É UMA Pessoa, justamente por ser uma extensão ou tipo mais especificado deste
Quando trabalhamos com uma variável do tipo Pessoa que é uma super classe, podemos fazer está variável receber um objeto do tipo PessoaFisica ou PessoaJuridica, por exemplo:
Com isso, podemos dizer que polimorfismo é a capacidade de um objeto ser referenciado de diversas formas diferentes e com isso realizar as mesmas tarefas (ou chamadas de métodos) de diferentes formas. Um exemplo do uso do polimorfismo utilizando a classe Pessoa, seria todas as subclasses sobrescreverem o método public String getNome().
Existe dois tipos de polimorfismo:
Os objetos são utilizados para representas as entidades do mundo real e encapsulam os dados relacionados a esses elementos. A técnica facilita a realização de testes unitários, pois permite testar o comportamento dos objetos isoladamente, sem depender de outros objetos ou de partes do sistema. Sem contar que pode ser usada para proteger dados e métodos de uma classe de acesso indevido, impedindo a violação de informações confidenciais.
Em um processo de encapsulamento os atributos das classes são do tipo private. Para acessar esses tipos de modificadores, é necessário criar métodos setters e getters. Por entendimento os métodos setters servem para alterar a informação de uma propriedade de um objeto. E os métodos getters para retornar o valor dessa propriedade.