A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Universidade do Vale do Rio dos Sinos - São Leopoldo -

Apresentações semelhantes


Apresentação em tema: "Universidade do Vale do Rio dos Sinos - São Leopoldo -"— Transcrição da apresentação:

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


Carregar ppt "Universidade do Vale do Rio dos Sinos - São Leopoldo -"

Apresentações semelhantes


Anúncios Google