O documento discute conceitos de programação orientada a objetos em Java, incluindo encapsulamento, herança e polimorfismo. O encapsulamento restringe o acesso aos dados de uma classe através de métodos getters e setters. A herança permite que subclasses herdem atributos e métodos de superclasses. O polimorfismo permite que objetos se comportem de maneiras diferentes ao receberem a mesma mensagem.
4. O que é o encapsulamento?
Mecanismo da linguagem de programação
para restringir o acesso a alguns
componentes dos objetos, escondendo os
dados de uma classe e tornando-os
disponíveis somente através de métodos.
5. O que é o encapsulamento?
• Na verdade, o mecanismo para restringir o acesso a alguns dos
componentes do objeto é a definição de ocultação de
informações. O encapsulamento é um conceito da Programação
Orientada a Objetos onde o estado de objetos (as variáveis da
classe) e seus comportamentos (os métodos da classe) são
agrupados em conjuntos segundo o seu grau de relação.
6. • Em programação orientada a objetos,
modificador de acesso, é a palavra-
chave que define como um atributo,
método, ou classe será visto no
contexto que estiver inserido.
Para utilizar estes modificadores de
acesso, basta que o escreva antes do
nome do atributo, método ou classe:
7. • Public: O modificador public
deixará visível a classe ou
membro para todas as outras
classes, subclasses e pacotes do
projeto Java.
8. • Protected: O modificador protected
deixará visível o atributo para todas
as outras classes e subclasses que
pertencem ao mesmo pacote. A
principal diferença é que apenas as
classes do mesmo pacote têm acesso
ao membro. O pacote da subclasse
não tem acesso ao membro.
9. • Private: O modificador private
deixará visível o atributo apenas
para a classe em que este
atributo se encontra.
10. • 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.
11. Veja um exemplo de encapsulamento, na Listagem 2 gera-se os
atributos privados (private) e é realizado o processo de geração
dos métodos setters e getters.
13. 1º Criar: a classe
public class Funcionario {
private double salario;
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public void setSalario(double salario) {
this.salario = salario;
}
public double getSalario() {
return salario;
}
}
14. 2º criar: Classe Testadora dos métodos getters e
setters.
public class TestaFuncionario {
public static void main(String[] args) {
Funcionario funcionario = new Funcionario();
funcionario.setNome("Thiago");
funcionario.setSalario(2500);
System.out.println(funcionario.getNome());
System.out.println(funcionario.getSalario());
}
}
15. • Na classe testadora é instanciado a classe
“Funcionario”, onde a variável de referência é
usada para invocar os métodos setters,
informando algum dado.
• Ao final, é usado os métodos getters dentro
do “System.out.println” para gerar a saída dos
resultados que foram passados nos métodos
setters.
17. Conceito de Herança:
• Na Programação Orientada a Objetos o significado de
herança tem o mesmo significado para o mundo real.
• Assim como um filho pode herdar alguma
característica do pai, na Orientação a Objetos é
permitido que uma classe herde atributos e métodos
da outra, tendo apenas uma restrição para a
herança.
• Os modificadores de acessos das classes, métodos e
atributos só podem estar com
visibilidade public e protected para que sejam
herdados.
18. Conceito de Herança:
• Uma das grandes vantagens de usar o recurso da
herança é na reutilização do código.
• Esse reaproveitamento pode ser acionado quando
se identifica que o atributo ou método de uma classe
será igual para as outras.
• Para efetuar uma herança de uma classe é utilizada a
palavra reservada chamada extends.
19. Exemplo: A superclasse “Funcionario” que
servirá de base para as subclasses
usarem seus atributos ou
métodos.
20. 1º Criar a
superclasse
Funcionario:
public class Funcionario {
private String nome;
private double salario;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getSalario() {
return salario;
}
public void setSalario(double salario) {
this.salario = salario;
}
public double calculaBonificacao(){
return this.salario * 0.1;
}
}
21. 2º Criar a
subclasse
Gerente:
public class Gerente extends Funcionario {
private String usuario;
private String senha;
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public double calculaBonificacao(){
return this.getSalario() * 0.6 + 100;
}
}
22. • Podemos ver que a classe “Gerente” está
herdando da classe “Funcionario” através da
palavra reservada extends.
• Acontece também a mudança do
comportamento de herança, a partir do
método “calculaBonificacao” que é
sobrescrito, pois entende-se que o valor da
classe “Gerente” é diferente para as demais.
23. 3º Criar a subclasse Secretaria:
public class Secretaria extends
Funcionario {
private int ramal;
public void setRamal(int ramal) {
this.ramal = ramal;
}
public int getRamal() {
return ramal;
}
}
24. 4º Criar a subclasse Telefonista:
public class Telefonista extends Funcionario {
private int estacaoDeTrabalho;
public void setEstacaoDeTrabalho(int estacaoDeTrabalho) {
this.estacaoDeTrabalho = estacaoDeTrabalho;
}
public int getEstacaoDeTrabalho() {
return estacaoDeTrabalho;
}
}
25. • Na classe TestaFuncionario são apresentadas
todas as classes e mostrada a reutilização de
código, um exemplo são os atributos “nome” e
“salario”. Portanto, não foi preciso criar em todas
as classes, apenas criou-se na superclasse.
• Apenas lembrando que o acesso dos atributos ou
métodos de uma superclasse é permitido
somente se estão definidos com o modo de
visibilidade como “public” ou “protected”.
26. 5º Criar a classe TestaFuncionario:
public class TestaFuncionario {
public static void main(String[] args) {
Gerente gerente = new Gerente();
gerente.setNome("Carlos Vieira");
gerente.setSalario(3000.58);
gerente.setUsuario("carlos.vieira");
gerente.setSenha("5523");
Funcionario funcionario = new Funcionario();
funcionario.setNome("Pedro Castelo");
funcionario.setSalario(1500);
Telefonista telefonista = new Telefonista();
telefonista.setNome("Luana Brana");
telefonista.setSalario(1300.00);
telefonista.setEstacaoDeTrabalho(20);
Secretaria secretaria = new Secretaria();
secretaria.setNome("Maria Ribeiro");
secretaria.setSalario(1125.25);
secretaria.setRamal(5);
30. • Poliformismo significa "muitas formas“.
• É o termo definido em linguagens orientadas
a objeto, como por exemplo Java, C# e C++,
que permite ao desenvolvedor usar o mesmo
elemento de formas diferentes;
• Polimorfismo denota uma situação na qual
um objeto pode se comportar de maneiras
diferentes ao receber uma mensagem, ou
seja, ocorre quando um método definido no
ancestral é redefinido no descendente com
um comportamento diferente.
31. As classes fazem a mesma operação
(método). Mas de forma diferente.
32.
33.
34. Exercício:
• Dos objetos a seguir, separe em grupos
aqueles que possuem “métodos” em
comum, mas que são executados de
forma diferente, ou seja, apresentam
poliformismo entre eles.
41. • A essência do poliformismo é que, em vez de
perguntar a um objeto qual é o seu tipo e
então chamar algum comportamento baseado
nessa resposta, você simplesmente chama o
comportamento.
• O objeto, dependendo do seu tipo, faz a coisa
certa.
42. • No Poliformismo temos dois tipos:
• O Poliformismo Estático;
• O Poliformismo Dinâmico;
43. • O Poliformismo Estático :
Se dá quando temos a mesma operação
implementada várias vezes na mesma classe.
A escolha de qual operação será chamada
depende da assinatura dos métodos
sobrecarregados.
49. • O Poliformismo Dinâmico:
Acontece na herança, quando a subclasse
sobrepõe o método original.
A escolha de qual método será chamado
depende do tipo do objeto que recebe a
mensagem.