Programação II
Prof. Mateus Raeder
Universidade do Vale do Rio dos Sinos
- São Leopoldo -
Sumário
•
•
•
•
•
•
•
•
Introdução
Tipos abstratos de dados
Classes
Objetos
Herança
Polimorfismo
Classes abstratas
Interfaces
Programação II – Prof. Mateus Raeder
Introdução
• Orientação à Objetos
– Década de 60
– Recursos de software e hardware estavam
tornando-se cada vez mais complexos
– Proposta para solucionar problemas comuns ao
desenvolvimento de software através da
reutilização de unidades lógicas de
programação
Programação II – Prof. Mateus Raeder
Tipos abstratos de dados
• Conjunto de dados e operações que são
aplicadas sobre estes dados
• Conceito independente de linguagem de
programação
• Dois papéis:
– Descrever os dados para o resto do programa
– Permitir que o programa altere estes dados
Programação II – Prof. Mateus Raeder
Tipos abstratos de dados
• Vantagens
– Ocultação de detalhes de implementação
– Interfaces mais informativas
– Permite lidar com entidades do mundo real
– Reutilização de código
Programação II – Prof. Mateus Raeder
Tipos abstratos de dados
Tipo abstrato de dado
Operações
Tanque de gasolina
Encher o tanque
Esvaziar o tanque
Obter a capacidade do tanque
Obter a quantidade de gasolina
Elevador
Subir um andar
Descer um andar
Exibir andar corrente
Arquivo
Abrir o arquivo
Fechar o arquivo
Escrever no arquivo
Setar posição corrente
Obter tamanho do arquivo
Obter nome do arquivo
Programação II – Prof. Mateus Raeder
Abstração
• Habilidade de se concentrar nos aspectos
essenciais de um contexto qualquer,
ignorando características menos
importantes
• Uma classe é uma abstração de alguma
entidade existente no domínio da
aplicação sendo desenvolvida
Programação II – Prof. Mateus Raeder
Classes
• Define características de um objeto
– Estado do objeto
• Através dos atributos
– Comportamento
• Através dos métodos
• Fábrica a partir da qual objetos serão
criados
Programação II – Prof. Mateus Raeder
Classes
• Exemplo
public class Time{
public String nome;
atributos
public int quantCampeonatos;
public Time(String nome, int quantCampeonatos){
this.nome = nome;
this.quantCampeonatos = quantCampeonatos;
}
métodos
public void ganhaCampeonato(){
quantCampeonatos++;
}
public int getQuantCampeonatos(){
return quantCampeonatos;
}
}
Programação II – Prof. Mateus Raeder
Objetos
• Instância de uma classe
• Capaz de:
– Armazenar estado
– Enviar e reagir a mensagens
Programação II – Prof. Mateus Raeder
Objetos
public class TestaTime{
public static void main(String args[]){
Time t = new Time(“Grêmio”, 1000);
t.ganhaCampeonato();
t.ganhaCampeonato();
t.ganhaCampeonato();
System.out.println(t.getQuantCampeonatos() + “campeonatos”);
Estadio e = new Estadio(“Olímpico”);
e.setTime(t);
}
}
Programação II – Prof. Mateus Raeder
Classes x Objetos
• Classe
– Entidade estática que pode ser visualizada
através do código do programa
• Objeto
– Entidade específica existente em tempo de
execução
public class Time{
public String nome;
public int quantCampeonatos;
public Time(String nome, int quantCampeonatos){
this.nome = nome;
this.quantCampeonatos = quantCampeonatos;
}
public void ganhaCampeonato(){
quantCampeonatos++;
}
public int getQuantCampeonatos(){
return quantCampeonatos;
}
}
Programação II – Prof. Mateus Raeder
Herança
• Idéia: derivar uma nova classe a partir de outra já existente
+ especializada
+ genérica
Classe original: SUPERCLASSE
Classe derivada: SUBCLASSE
• Por que o nome HERANÇA?
– Porque a subclasse HERDA atributos e métodos da superclasse
Programação II – Prof. Mateus Raeder
Herança
• IMPORTANTE:
A
B
Superclasse
Subclasse
– todo objeto
também
É
superclasse A
da
UM
subclasse B
objeto
da
– a
subclasse
B
apresenta
características
ADICIONAIS
e
EXCLUSIVAS em relação àquelas
da superclasse (por isso é mais
especializada)
Programação II – Prof. Mateus Raeder
Herança
Funcionario
-nome: String
-salario: double
-dependentes: int
+Funcionario(n:String, s:double, d:int)
+Funcionario(n:String, s:double)
+exibeDados()
+getNome():String
+getSalario():double
• Gerente é um tipo especial
de Funcionário, com
características adicionais e
exclusivas
• Repare que o método
exibeDados() é
SOBRESCRITO, ou seja,
REDEFINIDO
Gerente
-nomeSecretario: String
+Gerente(n:String, s:double, d:int)
+exibeDados()
+nomeiaSecretario(n:String)
• O método nomeiaSecretario
é EXCLUSIVO de Gerente
Programação II – Prof. Mateus Raeder
Sobrecarga x Sobreposição
• Sobrecarga
– Métodos com mesmo nome, mas assinaturas
diferentes
– Não necessita herança
• Sobreposição (sobrescrita)
– Métodos com mesmo nome e assinatura
– Necessita de herança
Programação II – Prof. Mateus Raeder
Herança
• Mas como dizer que uma classe herda outra?
– Com a utilização da palavra reservada extends
• Exemplo:
public class Gerente extends Funcionario
{
.
.
.
}
Programação II – Prof. Mateus Raeder
Herança
• Quando um objeto da subclasse chama um método, algumas
situações podem ocorrer:
– se o método foi sobrescrito pela subclasse, o da subclasse é
acionado
– se o método só existe na superclasse, o da superclasse será
acionado
– se o método é exclusivo da subclasse, este será acionado
– se o método não existe nem na superclasse e nem na subclasse,
ocorre um erro
Programação II – Prof. Mateus Raeder
Herança - Exercício
• O que vai ocorrer nas situações abaixo?
ClasseA
ClasseB b = new ClasseB();
+ClasseA( )
+metodo1( )
+metodo2( )
b.metodo1();
Chama método1() da Classe B
b.metodo2();
Chama método2() da Classe A
b.metodo3();
Chama método3() da Classe B
b.metodo4();
Erro de compilação
ClasseB
+ClasseB( )
+metodo1( )
+metodo3( )
Programação II – Prof. Mateus Raeder
Herança
• Construtores da subclasse
– os construtores da superclasse não são herdados, logo, a
subclasse deverá possuir seus próprios construtores para inicializar
os seus atributos
– devemos, todavia, inicializar os atributos da classe que está
sendo herdada, chamando algum construtor da superclasse com
a utilização da chamada super(...)
public Gerente(String n, double s, int d)
{
super(n, s, d); //chama o construtor da superclasse
nomeSecretario = “Alfredo”;
}
Programação II – Prof. Mateus Raeder
Herança
Funcionario
-nome: String
-salario: double
-dependentes: int
+Funcionario(n:String, s:double, d:int)
+Funcionario(n:String, s:double)
+exibeDados()
+getNome():String
+getSalario():double
Gerente
-nomeSecretario: String
+Gerente(n:String, s:double, d:int)
+exibeDados()
+nomeiaSecretario(n:String)
• Quais atributos de sua superclasse uma
subclasse pode acessar?
– os atributos do tipo private são
acessíveis diretamente apenas para a
classe que o possuir. Qualquer outra
classe somente tem acesso a estes
atributos utilizando os métodos de
acesso públicos (GET, por exemplo).
Logo:
public void exibeDados()
{
System.out.println(“Nome: ”+nome); //erro
System.out.println(“Salário: ”+salario);//erro
System.out.println(“Secretário:
”+nomeSecretario);
}
Outra opção é definir os atributos na superclasse
como protected
Programação II – Prof. Mateus Raeder
Herança - Exercício
• Implemente a classe Universidade
– Atributos:
• String nome
• String endereco
• int quantidadeAlunos
• int quantProfessores
– Métodos:
• Métodos de acesso get e set dos atributos
• Método print que imprime todas as informações da
Universidade
Programação II – Prof. Mateus Raeder
Herança - Exercício
• Implemente a classe Pública que herda
Universidade
– Esta classe possui um atributo chamado
quantConcursados, que indica a quantidade de
professores concursados
– Possui os métodos:
• get e set para a quantidade de concursados
• Um método que aumenta quantConcursados em 1
• Um método print que imprime todas as informações da
Universidade
Programação II – Prof. Mateus Raeder
Herança - Exercício
• Implemente a classe Privada que herda
Universidade
– Esta classe possui um atributo mensalidade, que
indica o preço médio do valor a ser pago
– Possui os métodos:
• get e set para o valor da mensalidade
• Um método que adiciona um preço X (recebido por
parâmetro) na mensalidade
• Um método print que imprime todas as informações da
Universidade
Programação II – Prof. Mateus Raeder
Polimorfismo
• Idéia: realizar uma tarefa de formas diferentes
(poli = muitas; morphos = formas)
• O objeto “assume a forma de outro”
A instrução:
ClasseA
+ClasseA( )
+metodo1( )
+metodo2( )
ClasseA a;
declara a como uma referência da superclasse ClasseA.
Regra 1: podemos atribuir um objeto da subclasse a
uma referência da superclasse (upcasting)
a = new ClasseB(); //razoável, pois
ClasseB É UM ClasseA
ClasseB
+ClasseB( )
+metodo1( )
+metodo3( )
Programação II – Prof. Mateus Raeder
Polimorfismo
• Agora a, uma referência de superclasse, está
apontando para um objeto de subclasse.
• Logo:
a.metodo1(); //chama metodo1() de ClasseB,
pois este foi sobrescrito
a.metodo2(); //chama metodo2() de ClasseA
a.metodo3(); //ERRO
tentativa de acessar através de uma referência de uma
superclasse um método exclusivo da subclasse
Regra 2: uma referência de superclasse só
reconhece membros da superclasse, mesmo
que aponte para um objeto da subclasse
ClasseA
+ClasseA( )
+metodo1( )
+metodo2( )
ClasseB
+ClasseB( )
+metodo1( )
+metodo3( )
Programação II – Prof. Mateus Raeder
Polimorfismo
• Como acessar o metodo3() então?
• A resposta está no downcasting
Regra 3: a atribuição de um objeto de superclasse a
uma referência de subclasse, sem coerção, não é
permitida.
ClasseA
+ClasseA( )
+metodo1( )
+metodo2( )
• Logo:
ClasseB b = a; //erro de compilação,
pois A não é um B
ClasseB
//devemos fazer a coerção (casting)
ClasseB b = (ClasseB) a;
b.metodo3();
+ClasseB( )
+metodo1( )
+metodo3( )
Programação II – Prof. Mateus Raeder
Polimorfismo - Exercício
• Crie a classe Veiculo
– Atributos:
• Velocidade máxima
• Preço
– Métodos:
• gets para os atributos
• Um método para imprimir as informações do veículo
Programação II – Prof. Mateus Raeder
Polimorfismo - Exercício
• Crie a classe Carro
– Atributos
• O ano de fabricação
– Métodos
• get e set para o ano
• Método para imprimir as informações do Carro
Programação II – Prof. Mateus Raeder
Polimorfismo - Exercício
• Crie a classe Onibus
– Atributos:
• A capacidade de passageiros do ônibus
– Métodos:
• get e set para a capacidade
• Método para imprimir as informações do Onibus
Programação II – Prof. Mateus Raeder
Polimorfismo - Exercício
• Crie a classe TestaVeiculo
• Crie o método main e nele faça o que
segue (nesta ordem):
–
–
–
–
–
Crie um Veículo v
Diga que este veículo é um Carro
Imprima as informações do Carro
Altere o ano para 2000
Imprima somente o ano do carro
Programação II – Prof. Mateus Raeder
Polimorfismo - Exercício
• Ainda no main e faça o que segue (nesta
ordem):
–
–
–
–
–
Crie um Veiculo v2
Diga que este veículo é um Onibus
Imprima as informações do ônibus
Altere a capacidade do ônibus para 40 lugares
Imprima somente a capacidade do ônibus que
foi alterada
Programação II – Prof. Mateus Raeder
Classes abstratas
• Método abstrato: um método que não tem implementação
– Como informar ao método que ele é abstrato?
public abstract void teste();
• Classes abstratas: são classes que possuem pelo menos 1 método
abstrato
– Como informar que uma classe é abstrata?
public abstract class Pessoa
Programação II – Prof. Mateus Raeder
Classes abstratas
• Uma classe abstrata é uma classe que não pode ser
instanciada. Deve ser obrigatoriamente herdada.
• Serve como um molde para as subclasses.
• Os métodos abstratos possuem apenas as assinaturas, sem a
implementação.
A implementação deve ser realizada OBRIGATORIAMENTE
Nas subclasses que herdam a superclasse abstrata
Programação II – Prof. Mateus Raeder
Classes abstratas
• Exemplo:
– Progressão
• Aritmética
• Geométrica
• Fibonacci
public abstract class Progressao{
//valor inicial
protected int first;
//valor corrente da progressão
protected int cur;
public Progressao(){
first = 0;
cur = 0;
}
– Polígonos
• Triângulo
• Retângulo
• Quadrado
• Trapézio
//método abstrato para próximo valor
protected abstract int nextValue();
//imprime valor da posição corrente
public void imprimeCur(){
System.out.println(“Valor: ”+cur);
}
}
Programação II – Prof. Mateus Raeder
Classes abstratas
• Exemplo:
– Progressão
public class Aritmetica extends Progressao{
//incremento da progressão
public int inc;
• Aritmética
• Geométrica
• Fibonacci
//construtor que recebe o incremento
public Aritimetica(int inc){
this.inc = inc;
}
– Polígonos
• Triângulo
• Retângulo
• Quadrado
• Trapézio
//calcula próximo valor
protected int nextValue(){
cur = cur + inc;
return cur;
}
}
Programação II – Prof. Mateus Raeder
Interfaces
• Não contêm nenhuma implementação
• Todos os métodos são abstratos
• Todos os métodos são públicos
• Todos os atributos são constantes
• Pode ser vista como um “contrato” que as
classes que implementam devem seguir
Programação II – Prof. Mateus Raeder
Interfaces
• As classes que implementam uma (ou mais)
interfaces devem implementar todos os
métodos definidos
• Uma interface não pode ser instanciada
• Uma classe pode implementar diversas
interfaces
Programação II – Prof. Mateus Raeder
Interfaces
• Definindo uma interface
public interface MinhaInterface{
//constante
double E = 2.718282;
//double E; -> erro de compilação
//métodos abstratos
double soma(double x, double y);
double subtrai(double x, double y);
double multiplica(double x, double y);
double divide(double x, double y);
}
Programação II – Prof. Mateus Raeder
Interfaces
• Implementando uma interface
– Utiliza-se a palavra reservada implements
public class Calculadora implements MinhaInterface{
//método para somar
public double soma(double x, double y){
return x + y;
}
//método para subtrair
public double subtrai(double x, double y){
return x - y;
}
//método para multiplicar
public double multiplica(double x, double y){
return x * y;
}
//método para dividir
public double divide(double x, double y){
return x / y;
}
}
Programação II – Prof. Mateus Raeder
Interfaces
• Implementando mais de uma interface
– Todos os métodos de todas as interfaces devem
ser implementados
public class Calculadora implements MinhaInterface,
MinhaInterface2,
Banana{
//implementar todos os métodos de todas as interfaces
...
}
Programação II – Prof. Mateus Raeder
Interfaces
• Exemplo:
public class Calculadora extends Padrao implements MinhaInterface,
MinhaInterface2,
Banana{
//implementar todos os métodos de todas as interfaces
...
}
Programação II – Prof. Mateus Raeder
Interfaces x Classes abstratas
• Qual a diferença entre interfaces e classes
abstratas?
– Classes abstratas
• Pode existir implementação de métodos
• Declaração de variáveis
• Uma classe só pode herdar UMA única classe
– Interfaces:
• Não existe implementação
• Atributos são sempre constantes
• Uma classe pode implementar diversas interfaces
“Herança” múltipla
Programação II – Prof. Mateus Raeder
Download

ClasseA - Unisinos