SlideShare uma empresa Scribd logo
Curso de Java
PARTE 04
OO – Orientação a Objetos
Métodos/Atributos Estáticos
Classe, Objeto, Instanciação
Encapsulamento,
UML
Herança, Construtores,
Associação de Classes
Classes Abstratas/Finais
Sobrecarga/Sobrescrita de métodos
Coerção
Tratamento de Exceções
Interfaces
por: Mário Sergio
mariosergio30@gmail.com
linkedin.com/in/mario-sergio-a1125831
Declaração de Atributos
- Até agora utilizamos em nossos exemplos apenas variáveis
locais, dentro do método main.
- Se desejarmos que nossas variáveis sejam acessadas em
outras partes do nosso programa e não apenas dentro do
método main, precisamos declara-las como ATRIBUTOS.
public class Jogo {
String jogador;
int pontuacao;
public static void main(String args[]) {
. . .
}
}
Declarar no corpo da Classe (Global),
fora do método main,
ou de qualquer outro método
2
Declaração de Métodos
- Até agora utilizamos em nossos exemplos apenas o método main.
- Se desejarmos separar as instruções do nosso programa em
partes menores e fazer reuso de código, precidamos criar nossos
próprios METODOS.
public class Jogo {
public static void main(String args[]) {
. . .
}
void exibeCabecalho() {
System.out.println("<< Star Wars Game >>");
}
}
Declaração
Implementação
entre { }
3
Declaração de Métodos
- Assim como os atributos, os métodos devem possuir um tipo e um
identificador (nome). Além disso, os métodos precisam também:
- Os parenteses ( ), que podem ter declaração de parametros.
- Uma implementação entre chaves { } (exceto para metodos abstratos, veremos
depois).
void imprime(String mensagem) {
System.out.println("Aviso: " + mensagem);
}
double soma(double n1, double n2) {
return n1 + n2;
}
void somaPontos(int pontoGanho) {
pontuacao = pontuacao + pontoGanho;
}
Tipo de retorno nulo,
ou seja não retorna valor,
é similar a um procedimento.
Tipo de retorno,
é uma FUNÇÃO que retorna
um valor após sua execução
Argumentos que devem
ser passados como parametros
na chamada ao método.
4
Chamada de Métodos
- Em qualquer parte da classe Jogo poderemos acessar os seus atributos de classe, e
chamar (invocar) seus os métodos, conforme a seguir:
5
public static void main(String args[]) {
jogador = "Michael";
pontuacao = 0;
imprime("Somando dois números");
double resultado = soma(10,20);
}
static double soma(double n1, double n2) {
return n1 + n2;
}
static void imprime(String mensagem) {
System.out.println("Aviso: " + mensagem);
}
Chamada de Métodos
6
Escopo de declaração de atributos
public class Jogo {
static String jogador;
public static void main(String args[]) {
jogador = "Michael";
int pontuacao = 0;
exibeCabecalho();
imprime(jogador + " Boa Sorte !");
pontuacao = somaPontos(pontuacao,20);
imprime("Pontuação: " + pontuacao);
pontuacao = somaPontos(pontuacao, 80);
imprime("Pontuação: " + pontuacao);
pontuacao = somaPontos(pontuacao, 50);
imprime("Pontuação Final: " + pontuacao);
}
static void exibeCabecalho() {
System.out.println("<< Star Wars Game >>");
System.out.println("Jogador: " + jogador);
return;
}
static void imprime(String mensagem) {
System.out.println("Aviso: " + mensagem);
return;
}
static int somaPontos(int saldo, int pontoGanho) {
int novoScore = saldo + pontoGanho;
return novoScore;
}
}
7
Em breve conheceremos os
modificadores de acesso / diretivas de
encapsulamento:
public, private e protected.
Quando essa diretiva é omitida, o Java
assume que a visibilidade dos atributose
métodos é pública.
Atributo da Classe (escopo global)
Visível por todos os métodos dentro da classe
Variáveis de escopo Local
Só existem dentro do próprio
método em que são desclaradas
return retorna valor para o ponto de chamada do método
Mãos à Obra
8
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
Crie métodos (quantos forem necessários)
para separar as responsabilidades de entrada de
dados, cálculo, e saída de dados.
Assim é possível dividir o programa em partes
menores, fazer reuso, e melhorar a legibilidade
do código fonte.
Discussão
9https://www.leepoint.net/JavaBasics/methods/method-commentary/methcom-30-multiple-return.html
Saber mais:
Purists vs Simplifiers
O qualificador Static
- O qualificador static no início da declaração de atributos e métodos indica que este é
um atributo ou método de classe, permitindo assim que possamos utilizá-los sem
precisar criar um objeto para isso.
public class Jogo {
static String jogador;
static void imprime(String mensagem) {
System.out.println("Aviso: " + mensagem);
}
static double soma(double n1, double n2) {
return n1 + n2;
}
static int somaPontos(int pontoGanho) {
return = pontuacao + pontoGanho;
}
}
10
Dessa forma, temos
Atributos e Métodos de
Classe
obs: por enquanto, ainda não
queremos usar o operador new para
criar objetos, por isso precisamos
declarar como estáticos.
Lembrando que:
-Um método é acionado (invocado) por uma chamada. Essa
chamada pode ser feita diretamente à classe (no caso dos métodos
estáticos)
-Isso significa que não é necessário instanciar um objeto (operador
new) para utilizá-lo. Podendo chamá-lo da seguinte maneira:
NomeDaClasse.metodo();
-Por exemplo o método println da classe System é estático, é por
isso o utilizamos assim: System.out.println()
Métodos de Classe (ou Estáticos)
classe
11
Chamando o método println() diretamente a partir da própria Classe,
pois na classe System, ele foi declarado com static
Iniciando a Separação em Classes
public class Applicacao {
public static void main(String args[]) {
// usa métodos e atributos da classe Jogo
. . .
Jogo.imprime("Pontuação: " + pontuacao);
. . .
}
}
12
métodos static dispensam
o uso de “new”, indicando-se apenas
o nome da classe que possui o método
.
- Em um projeto de software de alto nível é fundamental que o código fonte esteja
estruturado baseado no princípio da separação de responsabilidades.
- Assim, o exemplo “Jogo” poderia ser dividido em 2 classes, como segue:
public class Jogo {
// atributos e métodos Estáticos
static void imprime(String mensagem)
...
}
Mãos à Obra
13
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
Começaremos a perceber a necessidade de
organizar nosso projeto, em princípio dividiremos
em 2 classes distintas, da seguinte forma:
public class Applicacao {
public static void main(String args[])
1- pergunta quantas notas a escola
utiliza para calculo da média
2- chama classe Escola
3- exibe relatório final de alunos
}
}
public class Escola {
Lista de alunos…
matricularAlunos()
digitarDadosdoAluno()
calcularMedia()
. . .
Do paradigma Estruturado para OO
14
A solução é:
utilizar Objetos
para separar atributos
e dividir responsabiliddes
public class Escola {
static String nomeAluno;
static int idade;
static String nomeFuncionario;
static String usuarioFuncionario;
static String senhaFuncionario;
static Double resultadoCalculo;
static List<String> listNome = new ArrayList<String>();
static List<Integer> listIdade = new ArrayList<Integer>();
static List<Double> listMedia = new ArrayList<Double>();
static void realizaMatricula() {
nomeAluno = JoptionPane.showInputDialog("Novo Aluno: ");
...
}
static void loginSistema() {
lusuarioFuncionario = JoptionPane.showInputDialog("Usuario:");
senhaFuncionario = JoptionPane.showInputDialog("Senha:");
...
}
static void imprime(String mensagem) {
System.out.println("Aviso: " + mensagem);
}
static double soma(double n1, double n2) {
return n1 + n2;
}
static double divide(double n1, double n2) {
return n1 / n2;
}
static double multiplica(double n1, double n2) {
return n1 * n2;
}
..............
Como resolver esta bagunça ?
15
- Separação de responsabilidades: através da criação de classes para
representar objetos com caracteristicas (atributos) e
comportamentos (métodos) comuns (uma Abstração do mundo real).
- Ocultação de informações, através do controle de acesso aos atributos e médodos
(Encapsulamento)
- Possibilita o reuso de código através de uma hierarquia de Classes (Herança)
- Um mesmo objeto pode se comportar de diferentes maneiras, tornando os objetos
mais flexível (Polimorfismo)
Pilares / Benefícios do paradigma OO:
Orientação a Objetos - OO
Classe: A palavra classe vem da taxonomia da biologia, que classifica seres
com características semelhantes.
Classe em JAVA: é a estrutura fundamental para representar uma abstração de
um objeto do mundo real (um molde para objetos).
16
Orientação a Objetos - OO
Classe – Um molde para um objeto
17
Os atributos privados,
juntamente com os
métodos get e set
garantem o
encapsulamento
Criando Classes para Objetos
18
public class Aluno {
//atributos
String nome
int idade;
Double media;
Escolaridade escolaridade;
//métodos
incrementarIdade(int ano) { }
calcularMedia(soma,qtd) { }
}
public class Funcionario {
//atributos
String nome;
int idade;
double salario;
String departamento;
//métodos
reajustarSalario(...) { }
}
public public class Venda {
//atributos
double valor;
//métodos
totalizar(...) { }
}
Em princípio, poderiamos dividir as classes do nosso exemplo da
seguinte maneira para resolver a bagunça:
Instanciação: operador new
19
Para usarmos uma classe precisamos declarar uma variável ou atributo utilizando
a classe como tipo.
Declaração: 3 atributos (objetos) das classes Pessoa, Aluno e Funcionario.
Pessoa pessoa1;
Aluno jose;
Funcionario fulano;
Instanciação: Diferentemente dos tipos primitivos, para instanciar/inicializar
uma variável/atributo cujo tipo é uma classe, é preciso utilizar a palavra reservada
new
pessoa1 = new Pessoa();
jose = new Aluno();
fulano = new Funcionario();
A partir desse momento cada objeto (indivíduo) passa a ter um espaço individual
na memoria para armazenanar seus dados:
pessoa1.setNome("Elvis Presley");
pessoa1.setIdade(29);
20
Instanciação: operador new
21
Declaração e Instanciação tudo na mesma linha:
Aluno aluno1 = new Aluno();
Instanciação: operador new
Aluno aluno1 = new Aluno();
aluno1.nome = "Daniel";
aluno1.idade = 18;
Aluno jose = new Aluno();
jose.nome = "Jose";
jose.idade = 22;
List<Aluno> listAlunos = new ArrayList<Aluno>();
listAlunos.add(aluno1);
listAlunos.add(jose);
Então, podemos ter uma Lista de Alunos, por exemplo:
Adicionando alunos na Lista
Métodos de Objeto (ou de Instância)
Aluno a1 = new Aluno();
Aluno a2 = new Aluno();
Dizemos que a1 e a2 são:
Objetos do tipo Aluno
ou
Instâncias da classe Aluno
22
Na verdade, queremos chamar o método incrementaIdade(int ano) para CADA UM DOS alunos (lembrando que cada
aluno possuirá todos os métodos da classe Aluno)
Aluno.incrementaIdade(2);
Para isso, basta OMITIR a palavra reservada static na declaração do método:
public void incrementaIdade(int ano) {
// SEU CODIGO
}
- Assim como os métodos nextLine(), nextInt() ... da classe
Scanner, que já vimos antes, não queremos que os métodos da
classe Aluno sejam chamados diretamente a partir da Classe:
a1.incrementaIdade(2);
a2.incrementaIdade(1);
Caso contrário, uma chamada direta a Aluno.incrementaIdade(2), incrementaria a
idade de TODAS as instâncias da classe (todos os alunos, t1, t2, …) de uma só vez.
Obs: o mesmo conceito também serve para atributos.
Mãos à Obra
23
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
- Crie uma classe Aluno, que deverá conter
todos os atributos/metodos relacionados a um
aluno.
Observe que você passará a ter apenas uma
lista do tipo Aluno para o cadastro dos alunos
da escola.
24
Compreendendo: Referências de Memoria
Aluno aluno;
aluno = new Aluno();
aluno.nome = "Daniel";
aluno.idade = 18;
Memória
Endereço Valor
00010000 Aluno (Daniel,18)
List<Aluno> listAlunos = new ArrayList<Aluno>();
public class Classe {
} ...
public void metodo() {
25
Compreendendo: Referências de Memoria
Aluno aluno;
aluno = new Aluno();
aluno.nome = "Daniel";
aluno.idade = 18;
listAlunos.add(aluno);
Memória
Endereço Valor
00010000 Aluno (Daniel,18)
List<Aluno> listAlunos = new ArrayList<Aluno>();
public class Classe {
} ...
public void metodo() {
26
Compreendendo: Referências de Memoria
Aluno aluno;
aluno = new Aluno();
aluno.nome = "Daniel";
aluno.idade = 18;
listAlunos.add(aluno);
aluno = new Aluno();
aluno.nome = "Jose";
aluno.idade = 51;
Memória
Endereço Valor
00010000 Aluno (Daniel,18)
10010010 Aluno (Jose,51)
List<Aluno> listAlunos = new ArrayList<Aluno>();
public class Classe {
} ...
public void metodo() {
27
Compreendendo: Referências de Memoria
Aluno aluno;
aluno = new Aluno();
aluno.nome = "Daniel";
aluno.idade = 18;
listAlunos.add(aluno);
aluno = new Aluno();
aluno.nome = "Jose";
aluno.idade = 51;
listAlunos.add(aluno);
Memória
Endereço Valor
00010000 Aluno (Daniel,18)
10010010 Aluno (Jose,51)
List<Aluno> listAlunos = new ArrayList<Aluno>();
public class Classe {
} ...
public void metodo() {
28
Compreendendo: Referências de Memoria
Aluno aluno;
aluno = new Aluno();
aluno.nome = "Daniel";
aluno.idade = 18;
listAlunos.add(aluno);
aluno = new Aluno();
aluno.nome = "Jose";
aluno.idade = 51;
listAlunos.add(aluno);
aluno = new Aluno();
aluno.nome = “Neymar";
aluno.idade = 25;
Memória
Endereço Valor
00010000 Aluno (Daniel,18)
10010010 Aluno (Jose,51)
10110011 Aluno (Neymar,25)
List<Aluno> listAlunos = new ArrayList<Aluno>();
public class Classe {
} ...
public void metodo() {
29
Compreendendo: Referências de Memoria
Aluno aluno;
aluno = new Aluno();
aluno.nome = "Daniel";
aluno.idade = 18;
listAlunos.add(aluno);
aluno = new Aluno();
aluno.nome = "Jose";
aluno.idade = 51;
listAlunos.add(aluno);
aluno = new Aluno();
aluno.nome = “Neymar";
aluno.idade = 25;
listAlunos.add(aluno);
Memória
Endereço Valor
00010000 Aluno (Daniel,18)
10010010 Aluno (Jose,51)
10110011 Aluno (Neymar,25)
List<Aluno> listAlunos = new ArrayList<Aluno>();
public class Classe {
} ...
public void metodo() {
30
Compreendendo: Referências de Memoria
Aluno aluno;
Memória
Endereço Valor
00010000 Aluno (Daniel,18)
10010010 Aluno (Jose,51)
10110011 Aluno (Neymar,25)
List<Aluno> listAlunos = new ArrayList<Aluno>();
public class Classe {
} ...
public void metodo() {
- Ao fim do método, o identificador local aluno deixará de existir. Mas o atributo
listAlunos continuará referenciando os 3 endereços de memória que contém
as instâncias (objetos) da classe Aluno.
- Somente quando listAlunos deixar de existir é que o CG (Carbage Colletion)
atuará para liberar o espaço na memória que contém os 3 alunos.
31
Herança
A Herança possibilita que as classes compartilhem seus
atributos, métodos e outros membros da classe entre si, com
objetivo de reuso de código.
Para a ligação entre as classes, a herança adota um relacionamento
esquematizado hierarquicamente.
Classes Especializadas
32
SuperClasse
(Genérica)
Possui atributos e
comportamentos
comuns aos mamíferos
Herança
Indica o relacionamento
de Herança em UML
Classe Especialiada
(Derivada)
Herda os atributos e
comportamentos da
classe mãe, e também
pode acrescentá-los.
Herança é considerada um relacionamento “É UM”
Assim: Homem É UM Animal
Cão É UM Animal
Gato É UM Animal
Criando uma SuperClasse
33
Observe que as classes Aluno e Funcionário do “Sistema Escolar” possuem
caracteristicas comuns (nome e idade), e o comportamento de incremento
da idade, isso nos permite criar de uma Classe Genérica que poderiamos
chamar de Pessoa.
Depois disso, podemos fazer REUSO de código da classe Genérica
Pessoa a partir do conceito de Herança.
Ou seja, podemos criar duas classes Especializadas (filhas: Aluno, Funcionário)
que herdam as caracteristicas e métodos da classe Genérica (Mãe),
e também acrescentam suas caracteristicas próprias.
Isso garante o REUSO de código da Classe Genérica Pessoa.
public class Pessoa {
String nome;
int idade;
void incrementarIdade(int ano) { }
}
• Superclasse (Genérica): é classe pai que fornece atributos e comportamento
para outras classes;
• Subclasse (Especializada): são especializações de determinada SuperClasse,
elas herdam todos atributos e métodos da SuperClasse.
public class Pessoa {
String nome;
int idade;
//métodos
incrementarIdade(int ano) { }
}
public class Funcionario extends Pessoa {
double salario;
String departamento;
//métodos
reajustarSalario(...) { }
}
”extends” é a
palavra
reservada que
indica que uma
classe
(subclasse) está
herdando as
características de
outra classe
(superclasse)
Pessoa
Paciente Médico Funcionário
Aluno
34
Herança – Criando uma Classe Especializada
Mãos à Obra
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
- Crie uma classe genérica Pessoa,.
migrando para essa SuperClasse todos os
atributos e comportamentos comuns a uma
pessoa.
- Aluno deverá herdar Pessoa, além disso
precisamos cadastrar os funcionários, assim
iremos criar também a classe Funcionário.
Quais atributos próprios específicos de Aluno e
de Funcionário podemos ter ???
35
Qualificadores em JAVA
36
Na frente da declaração de Classes, Atributos e Métodos,
podem aparecer palavras chaves que são seus qualificadores
(também chadamas de diretivas)
Modificadores de Acesso/Visibilidade
ou Diretivas de Encapsulamento
(são mutuamente exclusivos, somente
Um deles deve aparecer)
Qualificadores Gerais
Esse qualificadores podem ser Classificados em:
36
Os qualificadores e sua sintaxe
37
Sintaxe para emprego qualificadores:
Declaração de
Classes
Declaração de
Atributos
Declaração de
Métodos
Declaração de
Classes
ver
pags: 42/43
ver pag: 45
ver pag: 65
constantes
Atributos de Classe pg: 10
Método de Classe pg: 10
37
Qualificadores: Modificador de Acesso
38
Efeitos de modificadores de acesso em Classes, Atributos e Métodos:
38
Encapsulamento para ocultação de informações
39
Boa Prática:
- Todos os atributos de uma classe devem ser definidos com o modificador private.
- Devem ser criados seus respectivos métodos publicos get e set quando necessário (para
atributos que precisam ser acessados partir de outras classes).
Para booleanos:
usamos is
ao invés de de get
No eclipse acesse:
Menu suspenso source:
OBS: Quando nenhum modificador (public, private..) é especificado, o java considera
por padrão o acesso packge-private (visibilidade para classes do mesmo no pacote)
O operador this
40
Nesse exemplo, o atributo
private int idade recebe o valor
do parâmetro idade
que é passado ao método
setIdade(int idade)
O operador this serve para referenciar um atributo de uma instância do
objeto, e não uma variável local ou um parâmetro de um método.
public class Pessoa {
private int idade;
public void setIdade(int idade)
{
this.idade = idade;
}
}
Mãos à Obra
41
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
- Garanta o encapsulamento dos atributos das
classes Aluno e Funcionario
Tornado uma Classe Abstrata
42
Assim:
Na nossa aplicação “Sistema Escolar” não queremos lidar com uma “pessoa
qualquer”, desejamos que toda pessoa seja de um dos tipos das classes
especializadas de Pessoa. Para isso precisamos informar que a classe Pessoa é
abstrata utilizando o qualificador abstract.
public abstract class Pessoa
Assim, não será mais possível instanciar um objeto do tipo Pessoa com o
operador new . Ou seja, a classe Pessoa agora tem o único papel de ser
herdada por uma classe especializada.
Pessoa pessoa1 = new Pessoa();
public class Aluno extends Pessoa OK
Definimos uma classe como Abstrata
quando queremos impedir que ela seja instanciada,
e desejamos que ela seja utilizada apenas como uma SuperClasse.
Uma classe que não pode ter filhos: Classe Final
43
Se não quisermos que a classe especializada Aluno seja utilizada para criar alunos
mais especializados, como por exemplo: AlunoFundamental, AlunoSuperior...
Então, precisamos informar que ela é uma classe final, para isso utilizamos o
qualificador final.
public final class Aluno
public class AlunoSuperior extends Aluno
Aluno aluno1 = new Aluno(); OK
versão final da
classe Aluno
Uma classe final é o inverso da classe abstrata, ela não pode
ser herdada por outra classe (ou seja, não é uma
superclasse), podendo apenas ser instanciada com new.
Mãos à Obra
44
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
- Garanta que um objeto jamais seja instanciado
simplemente como uma Pessoa (Pessoa tenha o
único papel de ser uma SuperClasse)
- Garanta que Aluno jamais seja especializado
(Aluno tenha o único papel de ser uma classe
especiaizada final, para instanciação de objetos)
- Estamos precisando categorizar os funcionários em
Diretor, Secretário e Professor. Portanto, garanta
que Funcionario, tenha apenas a finalidade de ser
uma SuperClasse assim como fizemos com
Pessoa.
Métodos Abstratos
45
- Classe abstratas podem possuir métodos Abstratos que não possuem uma
implementação padrão, possuem apenas uma assinatura (declaração).
Exemplo:
public abstract class FiguraGeometrica {
abstract public double calculaArea();
abstract public double calculaPerimetro();
...
Exemplo:
public class Triangulo extends FiguraGeometrica {
public double calculaArea() {
return (this.getBase() * this.getAltura())/2;
}
public double calculaPerimetro() {
return this.getLado1() + this.getLado2() + this.getBase();
}
...
-Toda classe especializada precisa obrigatoriamente IMPLEMENTAR os métodos
ABSTRATOS, se estes estiverem declarados na superclasse.
Apenas Declaração (assinatura)
sem implementação
Implementação
(Corpo)
http://www.guj.com.br/t/criar-super-classe-e-heranca/73349
Saber mais:
Mãos à Obra
46
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
- Temos a prática de enviar um cartão de aniversário
para todas as pessoas no dia do seu aniversário.
Precisamos que o Sistema imprima esses cartões.
Mas fazemos questão de que esses cartões sejam
personalizados de acordo com o papel que essa
pessoa representa em nossa escola (alunos,
professores, e funcionários em geral).
Dica: crie um método abstrato na classe Pessoa, e o
implemente nas classes especializadas, para atender a
esse requisito da escola:
public abstract void imprimirCartaoAniversario()
47
Compreendendo: Passagem de Parâmetros por Valor VS por Referência
Memória
Endereço Escopo Identificador Valor
10010010 local: main nome "Lula"
00011110 local: metodo1 nome "Dilma"
public void metodo1(String nome) {
nome = "Dilma";
}
public static void main(String[] args) {
String nome = "Lula";
metodo1(nome);
}
nome = "Lula"
Primitivos e String (sempre por VALOR)
48
Compreendendo: Passagem de Parâmetros por Valor VS por Referência
Memória
Endereço Escopo Identificador Valor
10010010 local: main nome "Lula"
00011110 local: metodo1 nome "Dilma"
00010111 local: main presidente Presidente: "Obama"
public void metodo1(String nome) {
nome = "Dilma";
}
public static void main(String[] args) {
String nome = "Lula";
metodo1(nome);
Presidente presidente = new Presidente();
presidente.setNome("Obama");
metodo2(presidente);
}
nome = "Lula"
Primitivos e String (sempre por VALOR)
49
Compreendendo: Passagem de Parâmetros por Valor VS por Referência
Memória
Endereço Escopo Identificador Valor
10010010 local: main nome "Lula"
00011110 local: metodo1 nome "Dilma"
00010111 local: main presidente Presidente: "Donald"
public void metodo1(String nome) {
nome = "Dilma";
}
public void metodo2(Presidente p) {
p.setNome("Donald");
}
public static void main(String[] args) {
String nome = "Lula";
metodo1(nome);
Presidente presidente = new Presidente();
presidente.setNome("Obama");
metodo2(presidente);
}
p -> 00010111
Objetos (sempre por REFERÊNCIA)
nome = "Lula"
Primitivos e String (sempre por VALOR)
Construtores
50
Instanciamos um objeto com new new, na verdade estamos chamando o construtor
do objeto.
pessoa1 = new Pessoa();
Instanciando um objeto com construtor SEM parâmetros Construtor padrão (nem precisa declarar)
public Pessoa() {
}
pessoa1 = new Pessoa("Fausto Silva", 55);
Instanciando um objeto com construtor sobrecarregado, COM parâmetros
public Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}
Declaração de um novo construtor COM parâmetros
Assim, o objeto pessoa1 já é criado
com um nome e uma idade
sem que haja a necessidade da
chamada posterior aos métodos
setNome e setIDade
Construtor assemelha-se a um “método sem retorno”
que possui o mesmo nome da Classe;
public class Milionario extends Pessoa {
private Double fortuna;
public Milionario(String nome, int idade, Double fortuna) {
super(nome,idade);
this.fortuna = fortuna;
}
...
Construtores
51
Agora suponha que precisamos de uma classe especializada que herda a
classe Pessoa, para representar os milionários:
milionario1 = new Milionario("Eike Batista", 62, 1283254895.52);
Novo construtor da classe Milionario
super referencia a SuperClasse
Chamada ao construtor da SuperClasse Pessoa
Instanciando um objeto do tipo Milionario
Construtores
52
Mãos à Obra
53
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
- Garanta que uma Pessoa jamais seja
instanciada sem possuir um nome.
Associação de Classes – Relacionamento TEM UM
54
A Associação é um Relacionamento
TEM UM (ou TEM VÁRIOS)
Então:
Pedido TEM UM Cliente
Pedido TEM VÁRIOS Itens
Item TEM UM Livro
Associação de Classes – Relacionamento TEM UM
55
Associação de Classes – Relacionamento TEM UM
56
Como escrever os
relacionamentos em java:
Pedido TEM UM Atributo do tipo Cliente
private Cliente cliente;
Pedido TEM VÁRIOS Atributos do tipo ItemPedido
List<ItemPedido> itens = new ArrayList<>();
Item TEM UM Livro
private Livro livro;
Diagramas UML para Projetos OO
57
http://www.ilovefreesoftware.com/22/webware/free-websites-to-create-uml-online.html
Saber mais:
https://www.uml-diagrams.org/class-reference.html
https://www.ateomomento.com.br/uml-classes-agregacao/
Excelente editor UML
on line:
https://www.draw.io/
58
Diagrama UML do “Sistema Escolar”:
Projeto Exemplo: Versão Atual
Mãos à Obra
59
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
Implemente conforme o diagrama atualizado
do projeto:
- Nossa classe escola já possui um
relacionamento TEM-VARIOS com a classe
Aluno.
- Implemente a nova classe Pais que herda
Pessoa.
- Inclua 2 novos atributos do tipo Pais para
representar o pai e a mãe do aluno, de
maneira que a classe Aluno passe a ter
relação TEM-UM com a classe Pais.
Polimofismo: Sobrecarga e Sobrescrita de métodos
60
Polimofismo : Permite que um mesmo objeto se comporte de diferentes maneiras.
A Sobrecarga e Sobrescrita de métodos são recursos que nos permitem
fazer uso de Polimorfismo.
https://data-flair.training/blogs/overloading-vs-overriding/
Saber mais:
Há mais de um método
com o mesmo nome,
mas com assinaturas diferentes,
dentro da mesma classe,
ou nas classes especializadas.
Ocorre
quando:
Há mais de um método
com o mesmo nome,
e com mesma assinatura,
sendo um na super-classe
e outros nas classes especializadas.
61
public class Soma {
int add(int n1, int n2) {
return n1+n2;
}
int add(int n1, int n2, int n3) {
return n1+n2+n3;
}
int add(int n1, int n2, int n3, int n4)
{
return n1+n2+n3+n4;
}
public static void main(String args[])
{
System.out.println("Sum of two numbers: "+obj.add(20, 21));
System.out.println("Sum of three numbers: "+obj.add(20, 21, 22));
System.out.println("Sum of four numbers: "+obj.add(20, 21, 22, 23));
}
}
Exemplos:
Método calcularPerimetro sobrecarregado
Método add sobrecarregado
Polimofismo: Sobrecarga de métodos
Mãos à Obra
62
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
Implemente na classe Aluno o método
calculaMedia sobrecarregado, sendo:
-cacularMedia(double nota1, double nota2)
-cacularMedia(List<Double> notas)
63
Exemplos:
Métodos reproduce() e sleep
sobrescritos
Método sppedLimit sobrecarregado
na classe especializada
Polimofismo: Sobrescrita de métodos
public class Ford extends CarClass {
@Override
public int speedLimit() {
return 150;
}
}
public class CarClass {
public int speedLimit() {
return 100;
}
}
Importante: só é possível haver sobrescrita quando há herança.
anotação
64
Polimofismo: Sobrescrita de métodos
https://www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#reescrita-de-mtodo
Saber mais:
65
- Métodos Finais possuem assinatura e implementação, e NÃO PODEM ser sobrescritos em
classe especializadas.
Métodos Finais
- Os Métodos Finais são o contrário dos métodos abstratos (que não possuem uma
implementação, e precisam obrigatoriamente ser implementados nas classes especializadas).
public class Pessoa {
final public void incrementarIdade(int ano) {
this.idade = this.idade + ano;
}
...
public class Aluno extends Pessoa {
public void incrementarIdade(int ano) {
this.idade = this.idade + ano + ...;
}
...
- Os Métodos Finais podem estar presente em classes Finais ou Abstratas
Qualificador final
Mãos à Obra
66
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
1-A classe Funcionario deverá ser uma superclasse contendo:
-pid
-email
-salario
-reajustarSalario(double perc)
Nota: A implementação padrão desse método deve levar em consideração apenas o salário atual e
percentual passado por parâmetro
Mãos à Obra
67
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
2-Implemente uma classe especializada Porteiro
contendo:
-turno (domínio:NOTURNO, DIURNO)
@Override
-reajustarSalario(double perc)
3- Garanta que o método incrementarIdade de Pessoa
jamais sejam sobrescrito por suas classe especializadas
Nota: Será preciso sobrescrever esse método,
pois o trabalho noturno deve ser levado em
consideração no reajuste salarial
68
public class Ford extends CarClass {
@Override
public int speedLimit() {
return 150;
}
}
public class CarClass {
public int speedLimit() {
return 100;
}
}
Polimofismo: Coerção
public static void main(String args[]) {
Ford carFusion = new Ford();
int num;
num = carFusion.speedLimit();
System.out.println("Speed Ford Limit is: "+ num);
num= ((CarClass)carFusion).speedLimit();
System.out.println("Speed Original Limit is: "+ num);
reportSpeed(carFusion);
}
public static void reportSpeed(CarClass car) {
int num= car.speedLimit();
System.out.println("Speed Original Limit is: "+ num);
}
Chamada de sppedLimit
sobrecarregado
Chamada de sppedLimit
da super-classe, por Coerção:
Coerção forçada
por Passagem
de parâmetro
69
public class Ford extends CarClass {
@Override
public int speedLimit() {
return 150;
}
}
public class CarClass {
public int speedLimit() {
return 100;
}
}
Polimofismo: Coerção
num= ((CarClass)carFusion).speedLimit();
CarClass carSemMarca = (CarClass)carFusion;
num= carSemMarca.speedLimit();
Coerção forçada direta
Ford carFusion = new Ford();
Coerção forçada nomeada
=
https://medium.com/@victorvoid/6-tipos-de-polimorfismo-7787080e8857
Saber mais:
Mãos à Obra
70
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
1-Simule qual seria o aumento de salário de um porteiro como se
ele não tivesse nenhuma regra especial para aumento de salário.
Dica: use Coerção.
Tratamento de Exceções (try / catch)
71
Uma exceção representa uma situação de anomalia, representa um
erro inesperado do sistema.
Um bloco “try” é chamado de bloco “protegido” porque, caso ocorra algum
problema com os comandos dentro do bloco, a execução desviará para
os blocos “catch” correspondentes.
Tratamento de Exceções (try / catch)
72
String[] arrayTratamento = {"Senhor","Senhora","Doutor"};
Double divisao = 0.0;
try {
int nindice = Integer.parseInt(JOptionPane.showInputDialog("Tratamento (0,1,2):"));
System.out.println(arrayTratamento[nindice] + " Boa noite !");
Double n = Double.parseDouble(JOptionPane.showInputDialog("Digite um Valor:"));
Double nDivisor = Double.parseDouble(JOptionPane.showInputDialog("Digite um Divisor:"));
divisao = n / nDivisor;
} catch (NumberFormatException e) {
System.out.println("Valor Inválido, msg: " + e.getMessage());
} catch (ArithmeticException e) {
System.out.println("Operação não permitida, msg: " + e.getMessage());
} catch (IndexOutOfBoundsException e) {
System.out.println("Erro de acesso ao array, msg : " + e.getMessage());
} catch (Exception ex) {
System.out.println("Uma exceção Generica Ocorreu !");
} finally {
System.out.println(“Obrigatóriamente Ocorrerá, mesmo que não hava erros !!!!!!!!!");
}
System.out.println("O valor da operação foi: " + divisao);
Herança Múltipla ?
73
O Recurso de Herança nos permite Herdar atributos e comportamentos de uma
SuperClasse (APENAS UMA):
Herança Múltipla ?
74
Mas, o que acontece se precisarmos que uma Classe especializada
apresente caracteristicas de mais de uma SuperClasse ?
- Uma classe pode herdar APENAS UMA superclasse, NÃO EXISTE HERANÇA MULTIPLA.
Interfaces
75
Essas “características extras” devem ser definidas por um Contrato: A Interface.
Gavião e Morcego IMPLEMENTAM Voador
- A Interface só expõe o que o objeto deve fazer, e não ”como ele faz”, nem ”o que ele tem”. ”Como ele
faz” vai ser definido em uma implementação dessa interface.
- Ela estabelece um “contrato” onde a classe que a implementa deve obrigatoriamente obedecer.
- Uma classe herda apenas uma superclasse, mas pode implementar varias interfaces simultenamente.
Interfaces
76
Perceba que os métodos na interface não têm corpo,
apenas assinatura. Agora temos um “contrato” que
deve ser seguido, caso alguém a implemente
Uma interface pode conter a assinatura/declaração
de vários métodos, mas nunca conter implementação
deles.
public interface Voador {
public void pousar();
public void voar();
}
public class Gaviao extends Ave implements Voador {
int
String porte;
public void pousar() {
System.out.println("Pára com as batidas de Asa");
System.out.println("Inicia fase de desaceleração");
. . .
}
public void voar() {
System.out.println("Primeiramente posiciona as patas para trás");
System.out.println("Depois inicia batidas rápidas das Asas");
. . .
}
public void cacar() { .......
Interfaces: Utilidade
77https://www.caelum.com.br/apostila-java-orientacao-objetos/interfaces/
Saber mais:
- Garante o desacoplamento entre classes
- Largamente empregada para integração com bibliotecas e Frameworks de terceiros.
package zoologico;
public class Viveiro {
public Viveiro(Voador animalQueVoa) {
animalQueVoa.voar();
animalQueVoa.pousar();
}
}
Exemplo: suponha que você precisará integrar sua aplicação
(que possui as classes do diagrama “animais”) ao framework
de terceiros “zoológico”.
Esse framework determina que só é possível colocar no
“viveiro” animais que voam, e na “lagoa” animais que
nadam.
package zoologico;
public class Lagoa {
public Lagoa(Nadador animalQueNada) {
animalQueNada.nadar();
animalQueNada.mergulhar();
}
}
Precisariamos de outro contrato(Nadador) !!!
Voador é um Contrato que permite usar um “viveiro”
public interface Voador {
public void pousar();
public void voar();
}
public class Gaviao extends Ave implements Voador {
int
String porte;
public void voar() {
System.out.println("Primeiramente posiciona as patas para trás");
System.out.println("Depois inicia batidas rápidas das Asas");
. . .
}
public void pousar() {
System.out.println("Pára com as batidas de Asa");
System.out.println("Inicia fase de desaceleração");
. . .
}
public void cacar() { .......
Framework “zoológico”
78
Exemplos de Uso:
Interfaces: Utilidade
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class MinhaClasse implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Você Clicou");
}
@Override
public void mouseEntered(MouseEvent e) {
...
}
@Override
public void mouseExited(MouseEvent e) {
...
}
@Override
public void mousePressed(MouseEvent e) {
...
}
@Override
public void mouseReleased(MouseEvent e) {
...
}
}
79
public class java.util.ArrayList extends java.util.AbstractList implements java.util.List, java.util.RandomAccess,
java.lang.Cloneable, java.io.Serializable {
IMPLEMENTAÇÃO DE TODOS OS MÉTODOS DAS INTERFACES IMPLEMENTADAS ACIMA....
}
public abstract interface java.util.List extends java.util.Collection {
public abstract boolean add(java.lang.Object arg0);
public abstract boolean remove(java.lang.Object arg0);
public abstract boolean contains(java.lang.Object arg0);
public abstract java.lang.Object get(int arg0);
public abstract int size();
public abstract boolean isEmpty();
. . .
}
List<Aluno> listAlunos = new ArrayList<Aluno>();
A Interface List
ArrayList: Uma das implementações da Interface List
Assim, ao declarar List<Aluno>, sabemos
que o objeto a ser instanciado possue (implementa)
todos as características da interface List.
Interfaces: Utilidade
Mãos à Obra
80
Com base no exercício anterior,
melhore seu “Sistema Escolar”:
• O sistema de segurança por login e senha não deve mais ser um cadastro hard-code (com uso de Map).
Precisamos que apenas Secretaria, Professor e Aluno sejam usuários e se autentiquem no sistema.
• Mas as regras de acesso variam, todos os usuários devem possuir uma senha, mas seu login deve ser
como segue: matricula para Aluno, pid para Professor, e email para Secretário(a).
Passos:
1- desenhe o projeto da funcionalidade em um diagrama UML usando: https://www.draw.io/
- crie uma interface Autenticavel que possua a assinatura do método autenticar(String login, String senha)
- crie um método login na classe Escola, que receberá um objeto do tipo Autenticavel
- garanta que Secretaria, Professor e Aluno implementam o método autentica (ou seja, que assinem o
contrato Autenticavel)
2- Implemente a funcionalidade do diagrama no seu projeto “Sistema Escolar”
81
Diagrama UML do “Sistema Escolar”:
Projeto Exemplo: Versão Final
Sugestão de Conteúdo
http://www.idocode.com.br/blog/programacao/sites-para-ser-programador/
Obrigado
Referências
Programação de computadores em Java
Rui Rossi dos Santos
Java 8: Programação de Computadores - Guia Prático de Introdução,
Orientação e Desenvolvimento - José Augusto N. G. Manzano
Slides do Prof. Roberto Pacheco INE – CTC – UFSC
Slides do Prof. Rui Silva
Escola Naútica D. Henrique
Site: https://www.devmedia.com.br/

Mais conteúdo relacionado

PDF
Curso de Java (Parte 3)
PPTX
Programmazione ad oggetti
PDF
Programação Orientada a Objetos
ODP
Mutexes, Monitores e Semáforos
PDF
Curso de Java (Parte 2)
PDF
Swift5 vs objective c
PPT
Introdução à análise orientada a objetos parte 1
PPT
Introdução à análise orientada a objetos parte 1
Curso de Java (Parte 3)
Programmazione ad oggetti
Programação Orientada a Objetos
Mutexes, Monitores e Semáforos
Curso de Java (Parte 2)
Swift5 vs objective c
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1

Semelhante a Curso de Java (Parte 4) (20)

PDF
ebook-completo c# o melhor para começar no c#
PPT
Aula5
PPTX
Curso de Java 4 - (Orientação a Objetos).pptx
PPTX
Java - Visão geral e Exercícios
PDF
Java aprendendo linguagem.ppt
PDF
Programacao II Aula 7 Heranca-Diagrama Classe [Autosaved].pdf
PPTX
Construtores_Sobrecarga.pptx
PPTX
Curso Java Básico - Aula02
PPT
Introdução à análise orientada a objetos parte 2
PPT
Aula 1 - Linguagem III
PPTX
Curso Java Básico - Aula 03
DOCX
Tutorial Java: Herança
DOCX
04 modelagem classes
PPTX
PDF
Capítulo 04 - Persistência de dados com SQLite
PPT
Aula5
DOCX
Exercicios professor marcos monteiro (1)
PPTX
Programação Orientada a Objetos - Uso da O.O. em Java
PDF
Curso java 03 - métodos e parâmetros
ebook-completo c# o melhor para começar no c#
Aula5
Curso de Java 4 - (Orientação a Objetos).pptx
Java - Visão geral e Exercícios
Java aprendendo linguagem.ppt
Programacao II Aula 7 Heranca-Diagrama Classe [Autosaved].pdf
Construtores_Sobrecarga.pptx
Curso Java Básico - Aula02
Introdução à análise orientada a objetos parte 2
Aula 1 - Linguagem III
Curso Java Básico - Aula 03
Tutorial Java: Herança
04 modelagem classes
Capítulo 04 - Persistência de dados com SQLite
Aula5
Exercicios professor marcos monteiro (1)
Programação Orientada a Objetos - Uso da O.O. em Java
Curso java 03 - métodos e parâmetros
Anúncio

Mais de Mario Sergio (12)

PDF
Curso Java (Parte 8) Web Service REST
PDF
Curso de Java (Parte 7) Web Application
PDF
Curso de Java (Parte 6) Introdução a Front-end
PDF
Curso de Java (Parte 5)
PDF
Introdução a Banco de Dados (Parte 3)
PDF
Introdução a Banco de Dados (Parte 2)
PDF
Introdução a Banco de Dados (Parte 1)
PDF
Comparação Sintaxe Portugol vs Java
PDF
Curso de Java (Parte 1)
PDF
Introdução à Programação
PDF
Bancode dados modelagem conceitual
ODP
Educação Tecnológica com Raspberry Pi
Curso Java (Parte 8) Web Service REST
Curso de Java (Parte 7) Web Application
Curso de Java (Parte 6) Introdução a Front-end
Curso de Java (Parte 5)
Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 2)
Introdução a Banco de Dados (Parte 1)
Comparação Sintaxe Portugol vs Java
Curso de Java (Parte 1)
Introdução à Programação
Bancode dados modelagem conceitual
Educação Tecnológica com Raspberry Pi
Anúncio

Último (20)

PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Aula sobre desenvolvimento de aplicativos
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PPTX
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
COBITxITIL-Entenda as diferença em uso governança TI
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Aula sobre desenvolvimento de aplicativos
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
Apple Pippin Uma breve introdução. - David Glotz
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
COBITxITIL-Entenda as diferença em uso governança TI

Curso de Java (Parte 4)

  • 1. Curso de Java PARTE 04 OO – Orientação a Objetos Métodos/Atributos Estáticos Classe, Objeto, Instanciação Encapsulamento, UML Herança, Construtores, Associação de Classes Classes Abstratas/Finais Sobrecarga/Sobrescrita de métodos Coerção Tratamento de Exceções Interfaces por: Mário Sergio mariosergio30@gmail.com linkedin.com/in/mario-sergio-a1125831
  • 2. Declaração de Atributos - Até agora utilizamos em nossos exemplos apenas variáveis locais, dentro do método main. - Se desejarmos que nossas variáveis sejam acessadas em outras partes do nosso programa e não apenas dentro do método main, precisamos declara-las como ATRIBUTOS. public class Jogo { String jogador; int pontuacao; public static void main(String args[]) { . . . } } Declarar no corpo da Classe (Global), fora do método main, ou de qualquer outro método 2
  • 3. Declaração de Métodos - Até agora utilizamos em nossos exemplos apenas o método main. - Se desejarmos separar as instruções do nosso programa em partes menores e fazer reuso de código, precidamos criar nossos próprios METODOS. public class Jogo { public static void main(String args[]) { . . . } void exibeCabecalho() { System.out.println("<< Star Wars Game >>"); } } Declaração Implementação entre { } 3
  • 4. Declaração de Métodos - Assim como os atributos, os métodos devem possuir um tipo e um identificador (nome). Além disso, os métodos precisam também: - Os parenteses ( ), que podem ter declaração de parametros. - Uma implementação entre chaves { } (exceto para metodos abstratos, veremos depois). void imprime(String mensagem) { System.out.println("Aviso: " + mensagem); } double soma(double n1, double n2) { return n1 + n2; } void somaPontos(int pontoGanho) { pontuacao = pontuacao + pontoGanho; } Tipo de retorno nulo, ou seja não retorna valor, é similar a um procedimento. Tipo de retorno, é uma FUNÇÃO que retorna um valor após sua execução Argumentos que devem ser passados como parametros na chamada ao método. 4
  • 5. Chamada de Métodos - Em qualquer parte da classe Jogo poderemos acessar os seus atributos de classe, e chamar (invocar) seus os métodos, conforme a seguir: 5 public static void main(String args[]) { jogador = "Michael"; pontuacao = 0; imprime("Somando dois números"); double resultado = soma(10,20); } static double soma(double n1, double n2) { return n1 + n2; } static void imprime(String mensagem) { System.out.println("Aviso: " + mensagem); }
  • 7. Escopo de declaração de atributos public class Jogo { static String jogador; public static void main(String args[]) { jogador = "Michael"; int pontuacao = 0; exibeCabecalho(); imprime(jogador + " Boa Sorte !"); pontuacao = somaPontos(pontuacao,20); imprime("Pontuação: " + pontuacao); pontuacao = somaPontos(pontuacao, 80); imprime("Pontuação: " + pontuacao); pontuacao = somaPontos(pontuacao, 50); imprime("Pontuação Final: " + pontuacao); } static void exibeCabecalho() { System.out.println("<< Star Wars Game >>"); System.out.println("Jogador: " + jogador); return; } static void imprime(String mensagem) { System.out.println("Aviso: " + mensagem); return; } static int somaPontos(int saldo, int pontoGanho) { int novoScore = saldo + pontoGanho; return novoScore; } } 7 Em breve conheceremos os modificadores de acesso / diretivas de encapsulamento: public, private e protected. Quando essa diretiva é omitida, o Java assume que a visibilidade dos atributose métodos é pública. Atributo da Classe (escopo global) Visível por todos os métodos dentro da classe Variáveis de escopo Local Só existem dentro do próprio método em que são desclaradas return retorna valor para o ponto de chamada do método
  • 8. Mãos à Obra 8 Com base no exercício anterior, melhore seu “Sistema Escolar”: Crie métodos (quantos forem necessários) para separar as responsabilidades de entrada de dados, cálculo, e saída de dados. Assim é possível dividir o programa em partes menores, fazer reuso, e melhorar a legibilidade do código fonte.
  • 10. O qualificador Static - O qualificador static no início da declaração de atributos e métodos indica que este é um atributo ou método de classe, permitindo assim que possamos utilizá-los sem precisar criar um objeto para isso. public class Jogo { static String jogador; static void imprime(String mensagem) { System.out.println("Aviso: " + mensagem); } static double soma(double n1, double n2) { return n1 + n2; } static int somaPontos(int pontoGanho) { return = pontuacao + pontoGanho; } } 10 Dessa forma, temos Atributos e Métodos de Classe obs: por enquanto, ainda não queremos usar o operador new para criar objetos, por isso precisamos declarar como estáticos.
  • 11. Lembrando que: -Um método é acionado (invocado) por uma chamada. Essa chamada pode ser feita diretamente à classe (no caso dos métodos estáticos) -Isso significa que não é necessário instanciar um objeto (operador new) para utilizá-lo. Podendo chamá-lo da seguinte maneira: NomeDaClasse.metodo(); -Por exemplo o método println da classe System é estático, é por isso o utilizamos assim: System.out.println() Métodos de Classe (ou Estáticos) classe 11 Chamando o método println() diretamente a partir da própria Classe, pois na classe System, ele foi declarado com static
  • 12. Iniciando a Separação em Classes public class Applicacao { public static void main(String args[]) { // usa métodos e atributos da classe Jogo . . . Jogo.imprime("Pontuação: " + pontuacao); . . . } } 12 métodos static dispensam o uso de “new”, indicando-se apenas o nome da classe que possui o método . - Em um projeto de software de alto nível é fundamental que o código fonte esteja estruturado baseado no princípio da separação de responsabilidades. - Assim, o exemplo “Jogo” poderia ser dividido em 2 classes, como segue: public class Jogo { // atributos e métodos Estáticos static void imprime(String mensagem) ... }
  • 13. Mãos à Obra 13 Com base no exercício anterior, melhore seu “Sistema Escolar”: Começaremos a perceber a necessidade de organizar nosso projeto, em princípio dividiremos em 2 classes distintas, da seguinte forma: public class Applicacao { public static void main(String args[]) 1- pergunta quantas notas a escola utiliza para calculo da média 2- chama classe Escola 3- exibe relatório final de alunos } } public class Escola { Lista de alunos… matricularAlunos() digitarDadosdoAluno() calcularMedia() . . .
  • 14. Do paradigma Estruturado para OO 14 A solução é: utilizar Objetos para separar atributos e dividir responsabiliddes public class Escola { static String nomeAluno; static int idade; static String nomeFuncionario; static String usuarioFuncionario; static String senhaFuncionario; static Double resultadoCalculo; static List<String> listNome = new ArrayList<String>(); static List<Integer> listIdade = new ArrayList<Integer>(); static List<Double> listMedia = new ArrayList<Double>(); static void realizaMatricula() { nomeAluno = JoptionPane.showInputDialog("Novo Aluno: "); ... } static void loginSistema() { lusuarioFuncionario = JoptionPane.showInputDialog("Usuario:"); senhaFuncionario = JoptionPane.showInputDialog("Senha:"); ... } static void imprime(String mensagem) { System.out.println("Aviso: " + mensagem); } static double soma(double n1, double n2) { return n1 + n2; } static double divide(double n1, double n2) { return n1 / n2; } static double multiplica(double n1, double n2) { return n1 * n2; } .............. Como resolver esta bagunça ?
  • 15. 15 - Separação de responsabilidades: através da criação de classes para representar objetos com caracteristicas (atributos) e comportamentos (métodos) comuns (uma Abstração do mundo real). - Ocultação de informações, através do controle de acesso aos atributos e médodos (Encapsulamento) - Possibilita o reuso de código através de uma hierarquia de Classes (Herança) - Um mesmo objeto pode se comportar de diferentes maneiras, tornando os objetos mais flexível (Polimorfismo) Pilares / Benefícios do paradigma OO: Orientação a Objetos - OO
  • 16. Classe: A palavra classe vem da taxonomia da biologia, que classifica seres com características semelhantes. Classe em JAVA: é a estrutura fundamental para representar uma abstração de um objeto do mundo real (um molde para objetos). 16 Orientação a Objetos - OO
  • 17. Classe – Um molde para um objeto 17 Os atributos privados, juntamente com os métodos get e set garantem o encapsulamento
  • 18. Criando Classes para Objetos 18 public class Aluno { //atributos String nome int idade; Double media; Escolaridade escolaridade; //métodos incrementarIdade(int ano) { } calcularMedia(soma,qtd) { } } public class Funcionario { //atributos String nome; int idade; double salario; String departamento; //métodos reajustarSalario(...) { } } public public class Venda { //atributos double valor; //métodos totalizar(...) { } } Em princípio, poderiamos dividir as classes do nosso exemplo da seguinte maneira para resolver a bagunça:
  • 19. Instanciação: operador new 19 Para usarmos uma classe precisamos declarar uma variável ou atributo utilizando a classe como tipo. Declaração: 3 atributos (objetos) das classes Pessoa, Aluno e Funcionario. Pessoa pessoa1; Aluno jose; Funcionario fulano; Instanciação: Diferentemente dos tipos primitivos, para instanciar/inicializar uma variável/atributo cujo tipo é uma classe, é preciso utilizar a palavra reservada new pessoa1 = new Pessoa(); jose = new Aluno(); fulano = new Funcionario(); A partir desse momento cada objeto (indivíduo) passa a ter um espaço individual na memoria para armazenanar seus dados: pessoa1.setNome("Elvis Presley"); pessoa1.setIdade(29);
  • 21. 21 Declaração e Instanciação tudo na mesma linha: Aluno aluno1 = new Aluno(); Instanciação: operador new Aluno aluno1 = new Aluno(); aluno1.nome = "Daniel"; aluno1.idade = 18; Aluno jose = new Aluno(); jose.nome = "Jose"; jose.idade = 22; List<Aluno> listAlunos = new ArrayList<Aluno>(); listAlunos.add(aluno1); listAlunos.add(jose); Então, podemos ter uma Lista de Alunos, por exemplo: Adicionando alunos na Lista
  • 22. Métodos de Objeto (ou de Instância) Aluno a1 = new Aluno(); Aluno a2 = new Aluno(); Dizemos que a1 e a2 são: Objetos do tipo Aluno ou Instâncias da classe Aluno 22 Na verdade, queremos chamar o método incrementaIdade(int ano) para CADA UM DOS alunos (lembrando que cada aluno possuirá todos os métodos da classe Aluno) Aluno.incrementaIdade(2); Para isso, basta OMITIR a palavra reservada static na declaração do método: public void incrementaIdade(int ano) { // SEU CODIGO } - Assim como os métodos nextLine(), nextInt() ... da classe Scanner, que já vimos antes, não queremos que os métodos da classe Aluno sejam chamados diretamente a partir da Classe: a1.incrementaIdade(2); a2.incrementaIdade(1); Caso contrário, uma chamada direta a Aluno.incrementaIdade(2), incrementaria a idade de TODAS as instâncias da classe (todos os alunos, t1, t2, …) de uma só vez. Obs: o mesmo conceito também serve para atributos.
  • 23. Mãos à Obra 23 Com base no exercício anterior, melhore seu “Sistema Escolar”: - Crie uma classe Aluno, que deverá conter todos os atributos/metodos relacionados a um aluno. Observe que você passará a ter apenas uma lista do tipo Aluno para o cadastro dos alunos da escola.
  • 24. 24 Compreendendo: Referências de Memoria Aluno aluno; aluno = new Aluno(); aluno.nome = "Daniel"; aluno.idade = 18; Memória Endereço Valor 00010000 Aluno (Daniel,18) List<Aluno> listAlunos = new ArrayList<Aluno>(); public class Classe { } ... public void metodo() {
  • 25. 25 Compreendendo: Referências de Memoria Aluno aluno; aluno = new Aluno(); aluno.nome = "Daniel"; aluno.idade = 18; listAlunos.add(aluno); Memória Endereço Valor 00010000 Aluno (Daniel,18) List<Aluno> listAlunos = new ArrayList<Aluno>(); public class Classe { } ... public void metodo() {
  • 26. 26 Compreendendo: Referências de Memoria Aluno aluno; aluno = new Aluno(); aluno.nome = "Daniel"; aluno.idade = 18; listAlunos.add(aluno); aluno = new Aluno(); aluno.nome = "Jose"; aluno.idade = 51; Memória Endereço Valor 00010000 Aluno (Daniel,18) 10010010 Aluno (Jose,51) List<Aluno> listAlunos = new ArrayList<Aluno>(); public class Classe { } ... public void metodo() {
  • 27. 27 Compreendendo: Referências de Memoria Aluno aluno; aluno = new Aluno(); aluno.nome = "Daniel"; aluno.idade = 18; listAlunos.add(aluno); aluno = new Aluno(); aluno.nome = "Jose"; aluno.idade = 51; listAlunos.add(aluno); Memória Endereço Valor 00010000 Aluno (Daniel,18) 10010010 Aluno (Jose,51) List<Aluno> listAlunos = new ArrayList<Aluno>(); public class Classe { } ... public void metodo() {
  • 28. 28 Compreendendo: Referências de Memoria Aluno aluno; aluno = new Aluno(); aluno.nome = "Daniel"; aluno.idade = 18; listAlunos.add(aluno); aluno = new Aluno(); aluno.nome = "Jose"; aluno.idade = 51; listAlunos.add(aluno); aluno = new Aluno(); aluno.nome = “Neymar"; aluno.idade = 25; Memória Endereço Valor 00010000 Aluno (Daniel,18) 10010010 Aluno (Jose,51) 10110011 Aluno (Neymar,25) List<Aluno> listAlunos = new ArrayList<Aluno>(); public class Classe { } ... public void metodo() {
  • 29. 29 Compreendendo: Referências de Memoria Aluno aluno; aluno = new Aluno(); aluno.nome = "Daniel"; aluno.idade = 18; listAlunos.add(aluno); aluno = new Aluno(); aluno.nome = "Jose"; aluno.idade = 51; listAlunos.add(aluno); aluno = new Aluno(); aluno.nome = “Neymar"; aluno.idade = 25; listAlunos.add(aluno); Memória Endereço Valor 00010000 Aluno (Daniel,18) 10010010 Aluno (Jose,51) 10110011 Aluno (Neymar,25) List<Aluno> listAlunos = new ArrayList<Aluno>(); public class Classe { } ... public void metodo() {
  • 30. 30 Compreendendo: Referências de Memoria Aluno aluno; Memória Endereço Valor 00010000 Aluno (Daniel,18) 10010010 Aluno (Jose,51) 10110011 Aluno (Neymar,25) List<Aluno> listAlunos = new ArrayList<Aluno>(); public class Classe { } ... public void metodo() { - Ao fim do método, o identificador local aluno deixará de existir. Mas o atributo listAlunos continuará referenciando os 3 endereços de memória que contém as instâncias (objetos) da classe Aluno. - Somente quando listAlunos deixar de existir é que o CG (Carbage Colletion) atuará para liberar o espaço na memória que contém os 3 alunos.
  • 31. 31 Herança A Herança possibilita que as classes compartilhem seus atributos, métodos e outros membros da classe entre si, com objetivo de reuso de código. Para a ligação entre as classes, a herança adota um relacionamento esquematizado hierarquicamente.
  • 32. Classes Especializadas 32 SuperClasse (Genérica) Possui atributos e comportamentos comuns aos mamíferos Herança Indica o relacionamento de Herança em UML Classe Especialiada (Derivada) Herda os atributos e comportamentos da classe mãe, e também pode acrescentá-los. Herança é considerada um relacionamento “É UM” Assim: Homem É UM Animal Cão É UM Animal Gato É UM Animal
  • 33. Criando uma SuperClasse 33 Observe que as classes Aluno e Funcionário do “Sistema Escolar” possuem caracteristicas comuns (nome e idade), e o comportamento de incremento da idade, isso nos permite criar de uma Classe Genérica que poderiamos chamar de Pessoa. Depois disso, podemos fazer REUSO de código da classe Genérica Pessoa a partir do conceito de Herança. Ou seja, podemos criar duas classes Especializadas (filhas: Aluno, Funcionário) que herdam as caracteristicas e métodos da classe Genérica (Mãe), e também acrescentam suas caracteristicas próprias. Isso garante o REUSO de código da Classe Genérica Pessoa. public class Pessoa { String nome; int idade; void incrementarIdade(int ano) { } }
  • 34. • Superclasse (Genérica): é classe pai que fornece atributos e comportamento para outras classes; • Subclasse (Especializada): são especializações de determinada SuperClasse, elas herdam todos atributos e métodos da SuperClasse. public class Pessoa { String nome; int idade; //métodos incrementarIdade(int ano) { } } public class Funcionario extends Pessoa { double salario; String departamento; //métodos reajustarSalario(...) { } } ”extends” é a palavra reservada que indica que uma classe (subclasse) está herdando as características de outra classe (superclasse) Pessoa Paciente Médico Funcionário Aluno 34 Herança – Criando uma Classe Especializada
  • 35. Mãos à Obra Com base no exercício anterior, melhore seu “Sistema Escolar”: - Crie uma classe genérica Pessoa,. migrando para essa SuperClasse todos os atributos e comportamentos comuns a uma pessoa. - Aluno deverá herdar Pessoa, além disso precisamos cadastrar os funcionários, assim iremos criar também a classe Funcionário. Quais atributos próprios específicos de Aluno e de Funcionário podemos ter ??? 35
  • 36. Qualificadores em JAVA 36 Na frente da declaração de Classes, Atributos e Métodos, podem aparecer palavras chaves que são seus qualificadores (também chadamas de diretivas) Modificadores de Acesso/Visibilidade ou Diretivas de Encapsulamento (são mutuamente exclusivos, somente Um deles deve aparecer) Qualificadores Gerais Esse qualificadores podem ser Classificados em: 36
  • 37. Os qualificadores e sua sintaxe 37 Sintaxe para emprego qualificadores: Declaração de Classes Declaração de Atributos Declaração de Métodos Declaração de Classes ver pags: 42/43 ver pag: 45 ver pag: 65 constantes Atributos de Classe pg: 10 Método de Classe pg: 10 37
  • 38. Qualificadores: Modificador de Acesso 38 Efeitos de modificadores de acesso em Classes, Atributos e Métodos: 38
  • 39. Encapsulamento para ocultação de informações 39 Boa Prática: - Todos os atributos de uma classe devem ser definidos com o modificador private. - Devem ser criados seus respectivos métodos publicos get e set quando necessário (para atributos que precisam ser acessados partir de outras classes). Para booleanos: usamos is ao invés de de get No eclipse acesse: Menu suspenso source: OBS: Quando nenhum modificador (public, private..) é especificado, o java considera por padrão o acesso packge-private (visibilidade para classes do mesmo no pacote)
  • 40. O operador this 40 Nesse exemplo, o atributo private int idade recebe o valor do parâmetro idade que é passado ao método setIdade(int idade) O operador this serve para referenciar um atributo de uma instância do objeto, e não uma variável local ou um parâmetro de um método. public class Pessoa { private int idade; public void setIdade(int idade) { this.idade = idade; } }
  • 41. Mãos à Obra 41 Com base no exercício anterior, melhore seu “Sistema Escolar”: - Garanta o encapsulamento dos atributos das classes Aluno e Funcionario
  • 42. Tornado uma Classe Abstrata 42 Assim: Na nossa aplicação “Sistema Escolar” não queremos lidar com uma “pessoa qualquer”, desejamos que toda pessoa seja de um dos tipos das classes especializadas de Pessoa. Para isso precisamos informar que a classe Pessoa é abstrata utilizando o qualificador abstract. public abstract class Pessoa Assim, não será mais possível instanciar um objeto do tipo Pessoa com o operador new . Ou seja, a classe Pessoa agora tem o único papel de ser herdada por uma classe especializada. Pessoa pessoa1 = new Pessoa(); public class Aluno extends Pessoa OK Definimos uma classe como Abstrata quando queremos impedir que ela seja instanciada, e desejamos que ela seja utilizada apenas como uma SuperClasse.
  • 43. Uma classe que não pode ter filhos: Classe Final 43 Se não quisermos que a classe especializada Aluno seja utilizada para criar alunos mais especializados, como por exemplo: AlunoFundamental, AlunoSuperior... Então, precisamos informar que ela é uma classe final, para isso utilizamos o qualificador final. public final class Aluno public class AlunoSuperior extends Aluno Aluno aluno1 = new Aluno(); OK versão final da classe Aluno Uma classe final é o inverso da classe abstrata, ela não pode ser herdada por outra classe (ou seja, não é uma superclasse), podendo apenas ser instanciada com new.
  • 44. Mãos à Obra 44 Com base no exercício anterior, melhore seu “Sistema Escolar”: - Garanta que um objeto jamais seja instanciado simplemente como uma Pessoa (Pessoa tenha o único papel de ser uma SuperClasse) - Garanta que Aluno jamais seja especializado (Aluno tenha o único papel de ser uma classe especiaizada final, para instanciação de objetos) - Estamos precisando categorizar os funcionários em Diretor, Secretário e Professor. Portanto, garanta que Funcionario, tenha apenas a finalidade de ser uma SuperClasse assim como fizemos com Pessoa.
  • 45. Métodos Abstratos 45 - Classe abstratas podem possuir métodos Abstratos que não possuem uma implementação padrão, possuem apenas uma assinatura (declaração). Exemplo: public abstract class FiguraGeometrica { abstract public double calculaArea(); abstract public double calculaPerimetro(); ... Exemplo: public class Triangulo extends FiguraGeometrica { public double calculaArea() { return (this.getBase() * this.getAltura())/2; } public double calculaPerimetro() { return this.getLado1() + this.getLado2() + this.getBase(); } ... -Toda classe especializada precisa obrigatoriamente IMPLEMENTAR os métodos ABSTRATOS, se estes estiverem declarados na superclasse. Apenas Declaração (assinatura) sem implementação Implementação (Corpo) http://www.guj.com.br/t/criar-super-classe-e-heranca/73349 Saber mais:
  • 46. Mãos à Obra 46 Com base no exercício anterior, melhore seu “Sistema Escolar”: - Temos a prática de enviar um cartão de aniversário para todas as pessoas no dia do seu aniversário. Precisamos que o Sistema imprima esses cartões. Mas fazemos questão de que esses cartões sejam personalizados de acordo com o papel que essa pessoa representa em nossa escola (alunos, professores, e funcionários em geral). Dica: crie um método abstrato na classe Pessoa, e o implemente nas classes especializadas, para atender a esse requisito da escola: public abstract void imprimirCartaoAniversario()
  • 47. 47 Compreendendo: Passagem de Parâmetros por Valor VS por Referência Memória Endereço Escopo Identificador Valor 10010010 local: main nome "Lula" 00011110 local: metodo1 nome "Dilma" public void metodo1(String nome) { nome = "Dilma"; } public static void main(String[] args) { String nome = "Lula"; metodo1(nome); } nome = "Lula" Primitivos e String (sempre por VALOR)
  • 48. 48 Compreendendo: Passagem de Parâmetros por Valor VS por Referência Memória Endereço Escopo Identificador Valor 10010010 local: main nome "Lula" 00011110 local: metodo1 nome "Dilma" 00010111 local: main presidente Presidente: "Obama" public void metodo1(String nome) { nome = "Dilma"; } public static void main(String[] args) { String nome = "Lula"; metodo1(nome); Presidente presidente = new Presidente(); presidente.setNome("Obama"); metodo2(presidente); } nome = "Lula" Primitivos e String (sempre por VALOR)
  • 49. 49 Compreendendo: Passagem de Parâmetros por Valor VS por Referência Memória Endereço Escopo Identificador Valor 10010010 local: main nome "Lula" 00011110 local: metodo1 nome "Dilma" 00010111 local: main presidente Presidente: "Donald" public void metodo1(String nome) { nome = "Dilma"; } public void metodo2(Presidente p) { p.setNome("Donald"); } public static void main(String[] args) { String nome = "Lula"; metodo1(nome); Presidente presidente = new Presidente(); presidente.setNome("Obama"); metodo2(presidente); } p -> 00010111 Objetos (sempre por REFERÊNCIA) nome = "Lula" Primitivos e String (sempre por VALOR)
  • 50. Construtores 50 Instanciamos um objeto com new new, na verdade estamos chamando o construtor do objeto. pessoa1 = new Pessoa(); Instanciando um objeto com construtor SEM parâmetros Construtor padrão (nem precisa declarar) public Pessoa() { } pessoa1 = new Pessoa("Fausto Silva", 55); Instanciando um objeto com construtor sobrecarregado, COM parâmetros public Pessoa(String nome, int idade) { this.nome = nome; this.idade = idade; } Declaração de um novo construtor COM parâmetros Assim, o objeto pessoa1 já é criado com um nome e uma idade sem que haja a necessidade da chamada posterior aos métodos setNome e setIDade Construtor assemelha-se a um “método sem retorno” que possui o mesmo nome da Classe;
  • 51. public class Milionario extends Pessoa { private Double fortuna; public Milionario(String nome, int idade, Double fortuna) { super(nome,idade); this.fortuna = fortuna; } ... Construtores 51 Agora suponha que precisamos de uma classe especializada que herda a classe Pessoa, para representar os milionários: milionario1 = new Milionario("Eike Batista", 62, 1283254895.52); Novo construtor da classe Milionario super referencia a SuperClasse Chamada ao construtor da SuperClasse Pessoa Instanciando um objeto do tipo Milionario
  • 53. Mãos à Obra 53 Com base no exercício anterior, melhore seu “Sistema Escolar”: - Garanta que uma Pessoa jamais seja instanciada sem possuir um nome.
  • 54. Associação de Classes – Relacionamento TEM UM 54 A Associação é um Relacionamento TEM UM (ou TEM VÁRIOS) Então: Pedido TEM UM Cliente Pedido TEM VÁRIOS Itens Item TEM UM Livro
  • 55. Associação de Classes – Relacionamento TEM UM 55
  • 56. Associação de Classes – Relacionamento TEM UM 56 Como escrever os relacionamentos em java: Pedido TEM UM Atributo do tipo Cliente private Cliente cliente; Pedido TEM VÁRIOS Atributos do tipo ItemPedido List<ItemPedido> itens = new ArrayList<>(); Item TEM UM Livro private Livro livro;
  • 57. Diagramas UML para Projetos OO 57 http://www.ilovefreesoftware.com/22/webware/free-websites-to-create-uml-online.html Saber mais: https://www.uml-diagrams.org/class-reference.html https://www.ateomomento.com.br/uml-classes-agregacao/ Excelente editor UML on line: https://www.draw.io/
  • 58. 58 Diagrama UML do “Sistema Escolar”: Projeto Exemplo: Versão Atual
  • 59. Mãos à Obra 59 Com base no exercício anterior, melhore seu “Sistema Escolar”: Implemente conforme o diagrama atualizado do projeto: - Nossa classe escola já possui um relacionamento TEM-VARIOS com a classe Aluno. - Implemente a nova classe Pais que herda Pessoa. - Inclua 2 novos atributos do tipo Pais para representar o pai e a mãe do aluno, de maneira que a classe Aluno passe a ter relação TEM-UM com a classe Pais.
  • 60. Polimofismo: Sobrecarga e Sobrescrita de métodos 60 Polimofismo : Permite que um mesmo objeto se comporte de diferentes maneiras. A Sobrecarga e Sobrescrita de métodos são recursos que nos permitem fazer uso de Polimorfismo. https://data-flair.training/blogs/overloading-vs-overriding/ Saber mais: Há mais de um método com o mesmo nome, mas com assinaturas diferentes, dentro da mesma classe, ou nas classes especializadas. Ocorre quando: Há mais de um método com o mesmo nome, e com mesma assinatura, sendo um na super-classe e outros nas classes especializadas.
  • 61. 61 public class Soma { int add(int n1, int n2) { return n1+n2; } int add(int n1, int n2, int n3) { return n1+n2+n3; } int add(int n1, int n2, int n3, int n4) { return n1+n2+n3+n4; } public static void main(String args[]) { System.out.println("Sum of two numbers: "+obj.add(20, 21)); System.out.println("Sum of three numbers: "+obj.add(20, 21, 22)); System.out.println("Sum of four numbers: "+obj.add(20, 21, 22, 23)); } } Exemplos: Método calcularPerimetro sobrecarregado Método add sobrecarregado Polimofismo: Sobrecarga de métodos
  • 62. Mãos à Obra 62 Com base no exercício anterior, melhore seu “Sistema Escolar”: Implemente na classe Aluno o método calculaMedia sobrecarregado, sendo: -cacularMedia(double nota1, double nota2) -cacularMedia(List<Double> notas)
  • 63. 63 Exemplos: Métodos reproduce() e sleep sobrescritos Método sppedLimit sobrecarregado na classe especializada Polimofismo: Sobrescrita de métodos public class Ford extends CarClass { @Override public int speedLimit() { return 150; } } public class CarClass { public int speedLimit() { return 100; } } Importante: só é possível haver sobrescrita quando há herança. anotação
  • 64. 64 Polimofismo: Sobrescrita de métodos https://www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#reescrita-de-mtodo Saber mais:
  • 65. 65 - Métodos Finais possuem assinatura e implementação, e NÃO PODEM ser sobrescritos em classe especializadas. Métodos Finais - Os Métodos Finais são o contrário dos métodos abstratos (que não possuem uma implementação, e precisam obrigatoriamente ser implementados nas classes especializadas). public class Pessoa { final public void incrementarIdade(int ano) { this.idade = this.idade + ano; } ... public class Aluno extends Pessoa { public void incrementarIdade(int ano) { this.idade = this.idade + ano + ...; } ... - Os Métodos Finais podem estar presente em classes Finais ou Abstratas Qualificador final
  • 66. Mãos à Obra 66 Com base no exercício anterior, melhore seu “Sistema Escolar”: 1-A classe Funcionario deverá ser uma superclasse contendo: -pid -email -salario -reajustarSalario(double perc) Nota: A implementação padrão desse método deve levar em consideração apenas o salário atual e percentual passado por parâmetro
  • 67. Mãos à Obra 67 Com base no exercício anterior, melhore seu “Sistema Escolar”: 2-Implemente uma classe especializada Porteiro contendo: -turno (domínio:NOTURNO, DIURNO) @Override -reajustarSalario(double perc) 3- Garanta que o método incrementarIdade de Pessoa jamais sejam sobrescrito por suas classe especializadas Nota: Será preciso sobrescrever esse método, pois o trabalho noturno deve ser levado em consideração no reajuste salarial
  • 68. 68 public class Ford extends CarClass { @Override public int speedLimit() { return 150; } } public class CarClass { public int speedLimit() { return 100; } } Polimofismo: Coerção public static void main(String args[]) { Ford carFusion = new Ford(); int num; num = carFusion.speedLimit(); System.out.println("Speed Ford Limit is: "+ num); num= ((CarClass)carFusion).speedLimit(); System.out.println("Speed Original Limit is: "+ num); reportSpeed(carFusion); } public static void reportSpeed(CarClass car) { int num= car.speedLimit(); System.out.println("Speed Original Limit is: "+ num); } Chamada de sppedLimit sobrecarregado Chamada de sppedLimit da super-classe, por Coerção: Coerção forçada por Passagem de parâmetro
  • 69. 69 public class Ford extends CarClass { @Override public int speedLimit() { return 150; } } public class CarClass { public int speedLimit() { return 100; } } Polimofismo: Coerção num= ((CarClass)carFusion).speedLimit(); CarClass carSemMarca = (CarClass)carFusion; num= carSemMarca.speedLimit(); Coerção forçada direta Ford carFusion = new Ford(); Coerção forçada nomeada = https://medium.com/@victorvoid/6-tipos-de-polimorfismo-7787080e8857 Saber mais:
  • 70. Mãos à Obra 70 Com base no exercício anterior, melhore seu “Sistema Escolar”: 1-Simule qual seria o aumento de salário de um porteiro como se ele não tivesse nenhuma regra especial para aumento de salário. Dica: use Coerção.
  • 71. Tratamento de Exceções (try / catch) 71 Uma exceção representa uma situação de anomalia, representa um erro inesperado do sistema. Um bloco “try” é chamado de bloco “protegido” porque, caso ocorra algum problema com os comandos dentro do bloco, a execução desviará para os blocos “catch” correspondentes.
  • 72. Tratamento de Exceções (try / catch) 72 String[] arrayTratamento = {"Senhor","Senhora","Doutor"}; Double divisao = 0.0; try { int nindice = Integer.parseInt(JOptionPane.showInputDialog("Tratamento (0,1,2):")); System.out.println(arrayTratamento[nindice] + " Boa noite !"); Double n = Double.parseDouble(JOptionPane.showInputDialog("Digite um Valor:")); Double nDivisor = Double.parseDouble(JOptionPane.showInputDialog("Digite um Divisor:")); divisao = n / nDivisor; } catch (NumberFormatException e) { System.out.println("Valor Inválido, msg: " + e.getMessage()); } catch (ArithmeticException e) { System.out.println("Operação não permitida, msg: " + e.getMessage()); } catch (IndexOutOfBoundsException e) { System.out.println("Erro de acesso ao array, msg : " + e.getMessage()); } catch (Exception ex) { System.out.println("Uma exceção Generica Ocorreu !"); } finally { System.out.println(“Obrigatóriamente Ocorrerá, mesmo que não hava erros !!!!!!!!!"); } System.out.println("O valor da operação foi: " + divisao);
  • 73. Herança Múltipla ? 73 O Recurso de Herança nos permite Herdar atributos e comportamentos de uma SuperClasse (APENAS UMA):
  • 74. Herança Múltipla ? 74 Mas, o que acontece se precisarmos que uma Classe especializada apresente caracteristicas de mais de uma SuperClasse ? - Uma classe pode herdar APENAS UMA superclasse, NÃO EXISTE HERANÇA MULTIPLA.
  • 75. Interfaces 75 Essas “características extras” devem ser definidas por um Contrato: A Interface. Gavião e Morcego IMPLEMENTAM Voador - A Interface só expõe o que o objeto deve fazer, e não ”como ele faz”, nem ”o que ele tem”. ”Como ele faz” vai ser definido em uma implementação dessa interface. - Ela estabelece um “contrato” onde a classe que a implementa deve obrigatoriamente obedecer. - Uma classe herda apenas uma superclasse, mas pode implementar varias interfaces simultenamente.
  • 76. Interfaces 76 Perceba que os métodos na interface não têm corpo, apenas assinatura. Agora temos um “contrato” que deve ser seguido, caso alguém a implemente Uma interface pode conter a assinatura/declaração de vários métodos, mas nunca conter implementação deles. public interface Voador { public void pousar(); public void voar(); } public class Gaviao extends Ave implements Voador { int String porte; public void pousar() { System.out.println("Pára com as batidas de Asa"); System.out.println("Inicia fase de desaceleração"); . . . } public void voar() { System.out.println("Primeiramente posiciona as patas para trás"); System.out.println("Depois inicia batidas rápidas das Asas"); . . . } public void cacar() { .......
  • 77. Interfaces: Utilidade 77https://www.caelum.com.br/apostila-java-orientacao-objetos/interfaces/ Saber mais: - Garante o desacoplamento entre classes - Largamente empregada para integração com bibliotecas e Frameworks de terceiros. package zoologico; public class Viveiro { public Viveiro(Voador animalQueVoa) { animalQueVoa.voar(); animalQueVoa.pousar(); } } Exemplo: suponha que você precisará integrar sua aplicação (que possui as classes do diagrama “animais”) ao framework de terceiros “zoológico”. Esse framework determina que só é possível colocar no “viveiro” animais que voam, e na “lagoa” animais que nadam. package zoologico; public class Lagoa { public Lagoa(Nadador animalQueNada) { animalQueNada.nadar(); animalQueNada.mergulhar(); } } Precisariamos de outro contrato(Nadador) !!! Voador é um Contrato que permite usar um “viveiro” public interface Voador { public void pousar(); public void voar(); } public class Gaviao extends Ave implements Voador { int String porte; public void voar() { System.out.println("Primeiramente posiciona as patas para trás"); System.out.println("Depois inicia batidas rápidas das Asas"); . . . } public void pousar() { System.out.println("Pára com as batidas de Asa"); System.out.println("Inicia fase de desaceleração"); . . . } public void cacar() { ....... Framework “zoológico”
  • 78. 78 Exemplos de Uso: Interfaces: Utilidade import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MinhaClasse implements MouseListener { @Override public void mouseClicked(MouseEvent e) { System.out.println("Você Clicou"); } @Override public void mouseEntered(MouseEvent e) { ... } @Override public void mouseExited(MouseEvent e) { ... } @Override public void mousePressed(MouseEvent e) { ... } @Override public void mouseReleased(MouseEvent e) { ... } }
  • 79. 79 public class java.util.ArrayList extends java.util.AbstractList implements java.util.List, java.util.RandomAccess, java.lang.Cloneable, java.io.Serializable { IMPLEMENTAÇÃO DE TODOS OS MÉTODOS DAS INTERFACES IMPLEMENTADAS ACIMA.... } public abstract interface java.util.List extends java.util.Collection { public abstract boolean add(java.lang.Object arg0); public abstract boolean remove(java.lang.Object arg0); public abstract boolean contains(java.lang.Object arg0); public abstract java.lang.Object get(int arg0); public abstract int size(); public abstract boolean isEmpty(); . . . } List<Aluno> listAlunos = new ArrayList<Aluno>(); A Interface List ArrayList: Uma das implementações da Interface List Assim, ao declarar List<Aluno>, sabemos que o objeto a ser instanciado possue (implementa) todos as características da interface List. Interfaces: Utilidade
  • 80. Mãos à Obra 80 Com base no exercício anterior, melhore seu “Sistema Escolar”: • O sistema de segurança por login e senha não deve mais ser um cadastro hard-code (com uso de Map). Precisamos que apenas Secretaria, Professor e Aluno sejam usuários e se autentiquem no sistema. • Mas as regras de acesso variam, todos os usuários devem possuir uma senha, mas seu login deve ser como segue: matricula para Aluno, pid para Professor, e email para Secretário(a). Passos: 1- desenhe o projeto da funcionalidade em um diagrama UML usando: https://www.draw.io/ - crie uma interface Autenticavel que possua a assinatura do método autenticar(String login, String senha) - crie um método login na classe Escola, que receberá um objeto do tipo Autenticavel - garanta que Secretaria, Professor e Aluno implementam o método autentica (ou seja, que assinem o contrato Autenticavel) 2- Implemente a funcionalidade do diagrama no seu projeto “Sistema Escolar”
  • 81. 81 Diagrama UML do “Sistema Escolar”: Projeto Exemplo: Versão Final
  • 84. Referências Programação de computadores em Java Rui Rossi dos Santos Java 8: Programação de Computadores - Guia Prático de Introdução, Orientação e Desenvolvimento - José Augusto N. G. Manzano Slides do Prof. Roberto Pacheco INE – CTC – UFSC Slides do Prof. Rui Silva Escola Naútica D. Henrique Site: https://www.devmedia.com.br/