Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouIsaque Samuel Canto Regueira Alterado mais de 8 anos atrás
1
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
2
Programação II – Prof. Mateus Raeder
Sumário Tipos abstratos de dados Classes Objetos Herança Polimorfismo Classes abstratas Interfaces Programação II – Prof. Mateus Raeder
3
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
4
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
5
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
6
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
7
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
8
Programação II – Prof. Mateus Raeder
Classes Exemplo 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; atributos métodos Programação II – Prof. Mateus Raeder
9
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
10
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(); System.out.println(t.getQuantCampeonatos() + “campeonatos”); Estadio e = new Estadio(“Olímpico”); e.setTime(t); } Programação II – Prof. Mateus Raeder
11
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
12
Programação II – Prof. Mateus Raeder
Classes - Exercício Crie a classe Universidade Atributos: String nome 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
13
Programação II – Prof. Mateus Raeder
Classe Universidade public class Universidade{ private String nome; private int quantProfessores; private int quantAlunos; public Universidade(String nome, int quantProfessores, int quantAlunos){ this.nome = nome; this.quantProfessores = quantProfessores; this.quantAlunos = quantAlunos; } public void setNome(String nome){ public void setQuantProfessores(int quantProfessores){ public void setQuantAlunos(int quantAlunos){ Programação II – Prof. Mateus Raeder
14
Programação II – Prof. Mateus Raeder
Classe Universidade public String getNome(){ return nome; } public int getQuantProfessores(){ return quantProfessores; public int getQuantAlunos(){ return quantAlunos; public void print(){ System.out.println("Universidade: "+nome+"\n"+ "Quantidade de alunos: "+quantAlunos+"\n"+ "Quantidade de professores: "+quantProfessores); Programação II – Prof. Mateus Raeder
15
Herança Idéia: derivar uma nova classe a partir de outra já existente
Por que o nome HERANÇA? Porque a subclasse HERDA atributos e métodos da superclasse + especializada + genérica Classe original: SUPERCLASSE Classe derivada: SUBCLASSE Programação II – Prof. Mateus Raeder
16
Programação II – Prof. Mateus Raeder
Herança IMPORTANTE: todo objeto da subclasse B também É UM objeto da superclasse A a subclasse B apresenta características ADICIONAIS e EXCLUSIVAS em relação àquelas da superclasse (por isso é mais especializada) A Superclasse B Subclasse Programação II – Prof. Mateus Raeder
17
Programação II – Prof. Mateus Raeder
Herança Funcionario Gerente é um tipo especial de Funcionário, com características adicionais e exclusivas Repare que o método exibeDados() é SOBRESCRITO, ou seja, REDEFINIDO O método nomeiaSecretario é EXCLUSIVO de Gerente -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) Programação II – Prof. Mateus Raeder
18
Sobrecarga x Sobreposição
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
19
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
20
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
21
Programação II – Prof. Mateus Raeder
Herança - Exercício O que vai ocorrer nas situações abaixo? ClasseA ClasseB b = new ClasseB(); b.metodo1(); b.metodo2(); b.metodo3(); b.metodo4(); +ClasseA( ) +metodo1( ) +metodo2( ) Chama método1() da Classe B Chama método2() da Classe A Chama método3() da Classe B ClasseB Erro de compilação +ClasseB( ) +metodo1( ) +metodo3( ) Programação II – Prof. Mateus Raeder
22
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
23
Herança 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: Funcionario -nome: String -salario: double -dependentes: int +Funcionario(n:String, s:double, d:int) +Funcionario(n:String, s:double) +exibeDados() +getNome():String +getSalario():double public void exibeDados() { System.out.println(“Nome: ”+nome); //erro System.out.println(“Salário: ”+salario);//erro System.out.println(“Secretário: ”+nomeSecretario); } Gerente -nomeSecretario: String +Gerente(n:String, s:double, d:int) +exibeDados() +nomeiaSecretario(n:String) Outra opção é definir os atributos na superclasse como protected Programação II – Prof. Mateus Raeder
24
Programação II – Prof. Mateus Raeder
Herança - Exercício Seja a classe Universidade criada 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
25
Programação II – Prof. Mateus Raeder
Herança - Exercício Implemente a classe Publica 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 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
26
Programação II – Prof. Mateus Raeder
Classe Publica public class Publica extends Universidade{ private int quantConcursados; public Publica(String nome,int quantProfessores,int quantAlunos,int quantConcursados){ super(nome, quantProfessores, quantAlunos); this.quantConcursados = quantConcursados; } public void setQuantConcursados(int quantConcursados){ public int getQuantConcursados(){ return quantConcursados; public void print(){ super.print(); System.out.println("Professores concursados: "+quantConcursados); Programação II – Prof. Mateus Raeder
27
Programação II – Prof. Mateus Raeder
Classe Privada public class Privada extends Universidade{ private double mensalidade; public Privada(String nome, int quantProfessores, int quantAlunos, double mensalidade){ super(nome, quantProfessores, quantAlunos); this.mensalidade = mensalidade; } public void setMensalidade(double mensalidade){ public double getMensalidade(){ return mensalidade; public void print(){ super.print(); System.out.println("Mensalidade: "+mensalidade); Programação II – Prof. Mateus Raeder
28
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” ClasseA +ClasseA( ) +metodo1( ) +metodo2( ) A instrução: 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
29
Polimorfismo Agora a, uma referência de superclasse, está apontando para um objeto de subclasse. Logo: ClasseA +ClasseA( ) +metodo1( ) +metodo2( ) 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 ClasseB +ClasseB( ) +metodo1( ) +metodo3( ) Regra 2: uma referência de superclasse só reconhece membros da superclasse, mesmo que aponte para um objeto da subclasse Programação II – Prof. Mateus Raeder
30
Programação II – Prof. Mateus Raeder
Polimorfismo Como acessar o metodo3() então? A resposta está no downcasting Logo: ClasseA Regra 3: a atribuição de um objeto de superclasse a uma referência de subclasse, sem coerção, não é permitida. +ClasseA( ) +metodo1( ) +metodo2( ) ClasseB b = a; //erro de compilação, pois A não é um B //devemos fazer a coerção (casting) ClasseB b = (ClasseB) a; b.metodo3(); ClasseB +ClasseB( ) +metodo1( ) +metodo3( ) Programação II – Prof. Mateus Raeder
31
Polimorfismo - Exercício
Crie a classe Veiculo Atributos: velocidade máxima e Preço Métodos: gets e imprimeInfo Crie a classe Carro (que herda Veiculo) Atributos: ano de fabricação Métodos: get e set para o ano e imprimeInfo Crie a classe Onibus (que herda Veiculo) Atributos: capacidade de passageiros Métodos: get e set para a capacidade e imprimeInfo Programação II – Prof. Mateus Raeder
32
Programação II – Prof. Mateus Raeder
Classe Veiculo public class Veiculo{ private double velocidadeMaxima; private double preco; public Veiculo(double velocidadeMaxima, double preco){ this.velocidadeMaxima = velocidadeMaxima; this.preco = preco; } public double getPreco(){ return preco; public double getVelocidadeMaxima(){ return velocidadeMaxima; public void imprimeInfo(){ System.out.println("Velocidade Máxima: "+velocidadeMaxima+"\n"+ "Preço: "+preco); Programação II – Prof. Mateus Raeder
33
Programação II – Prof. Mateus Raeder
Classe Carro public class Carro extends Veiculo{ private int ano; public Carro(double velocidadeMaxima, double preco, int ano){ super(velocidadeMaxima, preco); this.ano = ano; } public void setAno(int ano){ public int getAno(){ return ano; public void imprimeInfo(){ super.imprimeInfo(); System.out.println("Ano de fabricação: "+ano); Programação II – Prof. Mateus Raeder
34
Programação II – Prof. Mateus Raeder
Classe Onibus public class Onibus extends Veiculo{ private int quantPassageiros; public Onibus(double velocidadeMaxima, double preco, int quantPassageiros){ super(velocidadeMaxima, preco); this.quantPassageiros = quantPassageiros; } public void setQuantPassageiros(int quantPassageiros){ public int getQuantPassageiros(){ return quantPassageiros; public void imprimeInfo(){ super.imprimeInfo(); System.out.println("Capacidade: "+quantPassageiros); Programação II – Prof. Mateus Raeder
35
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
36
Programação II – Prof. Mateus Raeder
Classe TestaVeiculo public class TestaVeiculo{ public static void main(String args[]){ Veiculo v; v = new Carro(200, 30000, 2010); v.imprimeInfo(); v.setAno(2000); Programação II – Prof. Mateus Raeder
37
Programação II – Prof. Mateus Raeder
Classe TestaVeiculo public class TestaVeiculo{ public static void main(String args[]){ Veiculo v; v = new Carro(200, 30000, 2010); v.imprimeInfo(); //v.setAno(2000); Carro c = (Carro) v; v.setAno(2000); Programação II – Prof. Mateus Raeder
38
Programação II – Prof. Mateus Raeder
Classe TestaVeiculo public class TestaVeiculo{ public static void main(String args[]){ Veiculo v; v = new Carro(200, 30000, 2010); v.imprimeInfo(); //v.setAno(2000); Carro c = (Carro) v; c.setAno(2000); //System.out.println(“Novo ano do carro: "+v.getAno()); System.out.println("Novo ano do carro: "+c.getAno()); Programação II – Prof. Mateus Raeder
39
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
40
Classe TestaVeiculo (cont…)
Veiculo v2; v2 = new Onibus(170, 57000, 42); v2.imprimeInfo(); //v2.setQuantPassageiros(40); Onibus o = (Onibus) v2; o.setQuantPassageiros(40); //System.out.println("Nova capacidade: "+v2.getQuantPassageiros()); System.out.println("Nova capacidade: "+o.getQuantPassageiros()); } Programação II – Prof. Mateus Raeder
41
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
42
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
43
Programação II – Prof. Mateus Raeder
Classes abstratas Exemplo: Progressão Aritmética Geométrica Fibonacci Polígonos Triângulo Retângulo Quadrado Trapézio public abstract class Progressao{ //valor inicial protected int first; //valor corrente da progressão protected int cur; public Progressao(){ first = 0; cur = 0; } //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
44
Programação II – Prof. Mateus Raeder
Classes abstratas Exemplo: Progressão Aritmética Geométrica Fibonacci Polígonos Triângulo Retângulo Quadrado Trapézio public class Aritmetica extends Progressao{ //incremento da progressão public int inc; //construtor que recebe o incremento public Aritimetica(int inc){ this.inc = inc; } //calcula próximo valor protected int nextValue(){ cur = cur + inc; return cur; Programação II – Prof. Mateus Raeder
45
Programação II – Prof. Mateus Raeder
Classes Abstratas Exercícios Compile a classe abstrata Figura disponível na página da disciplina. crie a classe Retangulo, que possui dois atributos: base e altura crie a classe Circulo, que possui um raio crie a classe Triangulo, que possui uma base e uma altura crie uma classe Principal, que possui o método main. Crie uma figura de cada tipo, e imprima a área e o perímetro de cada uma delas Programação II – Prof. Mateus Raeder
46
Programação II – Prof. Mateus Raeder
Classes Abstratas Problema Criar um array de figuras diferentes Uma figura pode ser tanto um Circulo como um Retangulo Mas como guardar mais de um tipo em um array? Criar um array de Figura, onde cada posição pode ser ou um Circulo ou um Retangulo Como saber qual figura é? Utilizando instanceof Programação II – Prof. Mateus Raeder
47
Programação II – Prof. Mateus Raeder
Classes Abstratas public static void imprimeArea(Figura f){ if(f instanceof Retangulo){ Retangulo r = (Retangulo) f; System.out.println("Área do retângulo é:"+r.calculaArea()); } else if(f instanceof Circulo){ Circulo c = (Circulo) f; System.out.println("Área do círculo é:"+c.calculaArea()); public static void main(String[] args){ Figura[] figuras = new Figura[3]; figuras[0] = new Circulo(); figuras[1] = new Retangulo(); figuras[2] = new Retangulo(); for(int i=0; i<figuras.length; i++) imprimeArea(figuras[i]); Programação II – Prof. Mateus Raeder
48
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
49
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
50
Programação II – Prof. Mateus Raeder
Interfaces Definindo uma interface public interface MinhaInterface{ //constante double E = ; //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
51
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
52
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
53
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
54
Programação II – Prof. Mateus Raeder
Interfaces Exemplo: Programação II – Prof. Mateus Raeder
55
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.