1 / 57

Orientação a Objetos usando Java

Orientação a Objetos usando Java. Patricia A. Jaques Contribuições: Luiz Gonzaga Jr. Classes e Objetos.

Download Presentation

Orientação a Objetos usando Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Orientação a Objetos usando Java Patricia A. Jaques Contribuições: Luiz Gonzaga Jr

  2. Classes e Objetos • Para entendermos os conceitos de orientação a objetos é necessário entendermos o que é um objeto. Por exemplo, consideremos objetos do mundo real: seu cachorro, seu computador, sua bicicleta. • Os objetos do mundo real tem duas características: eles tem estado e comportamento. Por exemplo, cachorros tem estados (nome, cor, tamanho) e comportamentos (latir, andar, correr). • Objetos de software, assim como, objetos do mundo real possuem estado (variáveis) e comportamento (métodos). Podemos representar objetos do mundo real através de objetos de software (por exemplo, um livro), assim como, também podemos modelar conceitos abstratos (por exemplo, uma ação do usuário em uma interface gráfica).

  3. Classes: descrevem as informações armazenadas e os serviços providos por um objeto • especificação de objetos • Objetos: cada uma das instâncias de uma classe. • Por exemplo: cada uma das contas vai ser um objeto • existe apenas em tempo de execução?! Correntista #Nome:string #Saldo: float +verificaSaldo ( ); +depositaValor ( ); +retiraValor ( );

  4. Definindo uma classe em Java class ContaCorrente { }

  5. Definindo uma classe em Java Variável de Classe class ContaCorrente { static float montanteTotal; float saldo; String nome; // Definição dos métodos } Variáveis de Instância Variáveis: definem o comportamento estático do objeto.

  6. Definindo uma classe em Java Classe ContaCorrente montanteTotal: 600 Maria 100 João 200 Joana 300

  7. Definindo uma classe em Java • Métodos: definem os serviços que podem ser solicitados a uma instância (objeto), ou seja, o comportamento dinâmico de um objeto. • Por exemplo, na classe ContaCorrente podem ser definidos os métodos: - verificaSaldo: retorna o saldo da conta corrente; - depositaValor: deposita um valor especificado x na conta; - retiraValor: retira um valor especificado x da conta;

  8. Os métodos determinam o comportamento dos objetos de uma classe. • Quando um método é invocado, se diz que o objeto está recebendo uma mensagem (para executar uma ação). • No jargão da OO, um objeto chamar um método de outro é: • um objeto cliente enviar uma mensagem a um objeto servidor. • Um objeto pode nunca manipular os dados internos de outros objetos. • A manipulação pode ocorrer através de chamada de métodos do objeto que está tendo os valores de seus dados modificados.

  9. Definição de Métodos <modificador> <tipo de retorno> <nome> (lista de argumentos) { <bloco de código> } Mutator Methods public void setData (int d, int m, int a) { ... } Acessor Methods public int getDay () { ...} public void exibeData ( ) { System.out.println (d+”/”+m+”/”+a); }

  10. Definindo uma classe em Java class ContaCorrente { static float montanteTotal; float saldo; String nome; float verificaSaldo ( ) { return saldo; } void depositaValor (float valor) { saldo = saldo + valor; montanteTotal += valor; } void retiraValor (float valor) { if (saldo>=valor) { saldo = saldo – valor; montanteTotal -= valor; } } }

  11. Criando um objeto • Objeto é uma instância de uma classe; • Usamos o operador new para criar um objeto. Variável que conterá uma referência a um objeto ContaCorrente minhaConta; minhaConta = new ContaCorrente ( ); Criação do objeto ContaCorrente minhaConta = new ContaCorrente ( );

  12. Acessando variáveis e métodos de um objetoOperador ponto (.) class AcessaContaCorrente { public static void main (String args [ ]) { ContaCorrente minhaConta = new ContaCorrente ( ); minhaConta.nome = “Maria”; float saldo; saldo = minhaConta.verificaSaldo ( ); minhaConta.depositaValor (200); saldo = minhaConta.verificaSaldo ( ); ContaCorrente outraConta = new ContaCorrente ( ); outraConta.nome = “Joao”; saldo = outraConta.verificaSaldo ( ); } } Nome: Maria Saldo: 0 Saldo: 200 Nome: Joao Saldo: 0

  13. Exercício 1 – Criando Objeto ContaCorrente • Implemente a classe ContaCorrente da seção 3.1.2 • Implemente um método print() que exiba na tela os dados do dono da conta corrente. • Crie uma outra classse que se chama AcessaContaJoao • No método main(), crie uma conta para o “João da Silva” com saldo = 1000. • Exiba os dados da conta chamando o método print( ). • Faça um saque de 135. • Exiba novamente os dados.

  14. Método Construtor • Método que é automaticamente executado ao ser criado o objeto; • É usado para inicialização de variáveis ou para a chamada de outros métodos; • Os métodos construtores tem o mesmo nome que a classe; • Não é obrigatório criar um construtor. Caso não exista a declaração de um construtor, o compilador gera automaticamente um construtor default. • Pode haver mais de um método construtor mas eles tem que ter número de parâmetros diferentes ou tipos de parâmetros diferentes.

  15. Método Construtor class ContaCorrente { static float montanteTotal; float saldo; String nome; public ContaCorrente (String nomeDono) { nome = nomeDono; saldo = 0; } float verificaSaldo ( ) { return saldo; } // restante do código }

  16. Acessando variáveis e métodos de um objetoOperador ponto (.) class AcessaContaCorrente { public static void main (String args [ ]) { ContaCorrente minhaConta = new ContaCorrente (“Maria”); minhaConta.nome = “Maria”; float saldo; saldo = minhaConta.verificaSaldo ( ); minhaConta.depositaValor (200); saldo = minhaConta.verificaSaldo ( ); ContaCorrente outraConta = new ContaCorrente (“Joao”); outraConta.nome = “Joao”; saldo = outraConta.verificaSaldo ( ); } } Nome: Maria Saldo: 0 Saldo: 200 Nome: Joao Saldo: 0

  17. Operador this • Java inclui um valor de referência especial, chamado this, que é usado dentro de qualquer método para referir-se ao objeto corrente. • O valor de this refere-se ao objeto do qual o método corrente foi chamado.

  18. Operador this class TestaThis { int var1 = 4; public void metodo () { int var1 = 8; System.out.println (var1); } } class TestaThis { int var1 = 4; public void metodo () { int var1 = 8; System.out.println (this.var1); } } var1=8; var1=4;

  19. Operador this class ContaCorrente { static float montanteTotal; float saldo; String nome; public ContaCorrente (String nome) { this.nome = nome; saldo = 0; } ... // restante do código }

  20. Estrutura Variáveis membro class ContaCorrente { } void retiraValor (float valor) { if (saldo>=valor) { saldo = saldo – valor; montanteTotal -= valor; } } static float montanteTotal; float saldo; String nome; public ContaCorrente (String nome) { this.nome = nome; saldo = 0; } Método Construtor public static void main (String args [ ]) { ContaCorrente minhaConta = new ContaCorrente ("Maria"); minhaConta.depositaValor (200); float saldo = minhaConta.verificaSaldo ( ); System.out.println (saldo); } Métodos floatverificaSaldo ( ) { return saldo; } voiddepositaValor (float valor) { saldo = saldo + valor; montanteTotal += valor; } Método Main

  21. Exercício 2 – Classe Pessoa • Implemente a classe Pessoa • Uma pessoa possui: • um nome; • uma data de nascimento; • um endereço; • implemente o método print ( ) : exibe na tela os dados da Pessoa. • No método public static void main : • crie dois objetos do tipo Pessoa: um que represente você e outro que represente o colega do lado.

  22. Sobrecarga de Métodos • É possível criar métodos com mesmo nome, mas lista de parâmetros diferentes. • Isto é chamado de sobrecarga de métodos (ou overloading). • É reconhecido em tempo de compilação. • É devido a esta propriedade que podemos ter dois métodos construtores com parâmetros diferentes.

  23. Sobrecarga de Métodos class ContaCorrente { static float montanteTotal; float saldo; String nome; public ContaCorrente (String nome) { this.nome = nome; saldo = 0; } public ContaCorrente (String nome, float saldo) { this.nome = nome; this.saldo = saldo; } ... // restante do código }

  24. Exercício 2 – Classe Pessoa • Na classe Pessoa • Crie um método construtor que crie um objeto Pessoa recebendo como parâmetro o nome da Pessoa e outro que não receba nada como parâmetro. • No método public static void main : • crie dois objetos do tipo Pessoa: • um que represente você, não passando nada para o método construtor; • outro que represente o colega do lado: passando o nome do colega como parâmetro.

  25. Passagem de Parâmetros por Valor • Passagem de Argumentos para Métodos em Java: • Java passa somente argumentos por Valor • O argumento passado para outro método não pode ser alterado • Não há passagem de argumentos por referência • Se um argumento passado for um objeto (instância de uma classe): • as variáveis membros deste objeto poderão ser alteradas; • Mas a referência do próprio objeto não pode ser alterada.

  26. Passagem de Parâmetros por Valor class TestaPassagemParametros{ public static void trocaValorPrimitivo (int num){ num = num +6; } public static void trocaValorObjeto (ContaCorrente c) { c.saldo = 300; } public static void trocaReferenciaObjeto (ContaCorrente c){ c = new ContaCorrente ("Mulher Maravilha", 200); }

  27. public static void main (String args [ ]) { int val = 11; trocaValorPrimitivo (val); System.out.println ("val = "+val); ContaCorrente minhaConta = new ContaCorrente ("SuperHomem"); System.out.println (minhaConta.saldo); trocaValorObjeto (minhaConta); System.out.println (minhaConta.saldo); trocaReferenciaObjeto (minhaConta); System.out.println (minhaConta.nome); } } val=11 saldo=0 saldo=300 nome=SuperHomem

  28. Exercicio • Implemente o exercício anterior, porém tentando passar como parâmetro para um novo método uma String. • Neste método faça a variável String receber a referência para um outro parâmetro. public static void trocaReferenciaString (String str){ str = “azul”; } O que acontece? Por quê?

  29. Modificadores de Acesso

  30. Encapsulamento public void depositaValor (float valor) { saldo = saldo + valor; montanteTotal += valor; } public void retiraValor (float valor) { if (saldo >= valor) saldo = saldo – valor; montanteTotal -= valor; } public static float obtemTotalBanco ( ) { return montanteTotal; } } class ContaCorrente { private static float montanteTotal; private float saldo; private String nome; publicContaCorrente (StringnomeDono) { nome = nomeDono; saldo = 0; } publicfloatverificaSaldo ( ) { return saldo; }

  31. Encapsulamento • Vantagem: Quando alterar os tipos dos dados de uma classe não é necessário alterar as classes que acessam essa classe. class Pessoa { public String nome; } class AcessaPessoa { public static void main (String args [ ]) { Pessoa p = new Pessoa ( ); p.nome = "Patty"; } } public String data; p.data = "4/4/1976";

  32. class Pessoa { public String nome; } class AcessaPessoa { public static void main (String args [ ]) { Pessoa p = new Pessoa ( ); p.nome = "Patty"; } } public int dia; public int mes; public int ano; p.dia = 4; p.mes = 4; p.ano = 4;

  33. class AcessaPessoa { public static void main (String args [ ]) { Pessoa p = new Pessoa ( ); p.setNome ("Joao"); p.setData ("3/4/1967"); } } class Pessoa { private String nome; private String data; public setNome (String nome) { this.nome = nome; } public setData (String data) { this.data = data; } public String getNome () { return nome; } public String getData () { return data; } }

  34. class AcessaPessoa { public static void main (String args [ ]) { Pessoa p = new Pessoa ( ); p.setNome ("Joao"); p.setData ("3/4/1967"); } } class Pessoa { private String nome; private int dia; private int mes; private int ano; public setNome (String nome) { this.nome = nome; } public setData (String data) { int v [] = separaData (data); dia = v[0]; mes = v[1]; ano = v[2]; } public String getNome () { return nome; } public String getData () { String data = dia + "/" + mes + "/" + ano; return data; } }

  35. Exercício 3 - Encapsulamento • Agora que você aprendeu o conceito de encapsulamento, encapsule os atributos da classe Pessoa: • Os dados são private e seus valores podem ser acessados e modificado pelos métodos mutator (set...) e acessor (get...);

  36. Herança • Chamamos de herança quando novas classes herdam propriedades (dados e métodos) de outras classes existentes. • Esse é um importante recurso da orientação a objetos que permite a reutilização de código. • As classes que herdam as propriedades são chamadas subclasses; • A classe pai é chamada superclasse.

  37. class Ponto { int x, y; public Ponto (int x, int y) { this.x = x; this.y = y; } public Ponto ( ) { this (-1, -1); // o this também pode ser usado para chamar // construtores } public void print ( ) { System.out.print (“\n”+x +", "+ y); } }

  38. super class Ponto3D extends Ponto { int z; public Ponto3D (int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public Ponto3D ( ) { this (-1, -1, -1); } } super (x, y); Código igual na classe pai e filho Chamando construtor da classe pai

  39. class Ponto3D extends Ponto { int z; public Ponto3D (int x, int y, int z) { super (x, y); // chama o construtor Ponto (x, y) this.z = z; } public Ponto3D ( ) { this (-1, -1, -1); } public void printPonto3D ( ) { print ( ); System.out.print (", "+z); } } Chama método print( ) da classe pai

  40. class Herança { public static void main (String args [ ]) { Ponto p1 = new Ponto (1,1); Ponto3D p2 = new Ponto3D (2,2,2); p1.print ( ); p2.printPonto3D ( ); } } 1, 1 2, 2, 2

  41. Exercício 4 - Herança • Implemente a classe Aluno • A classe Aluno é subclasse da classe Pessoa • A classe Aluno, além de conter os dados de uma pessoa, vai ter uma nota e uma turma. • Crie métodos acessor e mutator para os atributos nota e turma. • Escreva um método print2() que chame o método print() da classe pai (Pessoa) que irá exibir nome, data de nasc e endreço do aluno e exiba na tela a nota e a turma do aluno. • No método public static void main: • crie 1 objeto aluno que represente voce como aluno do curso Java. Que nota você se dá? :o)

  42. Sobreposição (Overloading) class Ponto3D extends Ponto { int z; public Ponto3D (int x, int y, int z) { super (x, y); // chama o construtor Ponto (x, y) this.z = z; } public Ponto3D ( ) { this (-1, -1, -1); } public void printPonto3D ( ) { print ( ); System.out.print (", "+z); } } Chama método print( ) da classe pai print super.

  43. Polimorfismo class Polimorfismo { public static void main (String args [ ]) { Ponto p1 = new Ponto (1,1); Ponto3D p2 = new Ponto3D (2,2,2); Ponto p3 = new Ponto3D (3,3,3); p1.print ( ); p2.print ( ); p3.print ( ); } } 1, 1 3, 3, 3 2, 2, 2 A capacidade de um objeto decidir qual método aplicará para si na hierarquia de heranças é chamada de polimorfismo. A idéia do polimorfismo é que embora a mensagem seja a mesma, os objetos poderão ter comportamentos diferentes.

  44. Dinamic Binding Ponto3D p3 = new Ponto ( ); Ponto3D p1 = new Ponto3D ( ); Ponto p2 = new Ponto3D ( ); Ponto p2 = new Ponto3D ( ); Ponto3D p4 = (Ponto3D) p2; Se não usar casting é gerado erro em tempo de compilação

  45. Um método não pode ser menos acessível que o método que ele sobrescreve (na classe pai). class Ponto { private void print ( ) { ... } } class Ponto3D extends Ponto { public void print ( ) { ... } }

  46. Exercício 5 – sobreposição • Na classe Aluno (criada no exercício anterior) faça a sobreposição do método print da classe pai (classe Pessoa) , substituindo o método print2( ) .

  47. Classes Abstratas • Problema: • Queremos construir um array de Polígonos. • Um polígono pode ser um Retângulo, um Quadrado, uma Elipse ou um Triângulo. E terão dois métodos básicos: area ( ) e circunferencia ( ). • Mas um array só guarda objetos do mesmo tipo? • Solução: criar uma classe abstrata que declare os métodos area() e circunferencia(), mas não os implementando, pois a área de um Triângulo é diferente da área de um Quadrado.

  48. Classes Abstratas abstract class Shape { String cor; public abstract double area ( ); public abstract double circunference ( ); public String getType () { Class c = this.getClass(); return c.getName(); } } Enquanto o programa executa, Java mantém o que é chamado de identificação do tipo em tempo de execução (RTTI). Permite saber a qual classe um objeto pertence. Podemos acessar essa informação usando a classe Class.

  49. Classes Abstratas class Rectangle extends Shape { protected double w, h; public Rectangle (double w, double h) { this.w = w; this.h = h; } public double getWidth () { return w; } public double getHeight () { return h; } public double area () { return w*h; } public double circunference () { return 2*(w+h); } } // da class Rectangle class Circle extends Shape { public static final double PI = 3.141592656358979323846; protected double r; public Circle (double r) { this.r = r; } public double getRadius () { return r; } public double area () { return PI*r*r; } public double circunference () { return 2*PI*r; } } // da class Circle

  50. Classes Abstratas • Apenas métodos podem ser abstratos; • Se uma classe contiver pelo menos um método abstract, ela deve ser declarada como abstract; • Uma classe abstrata não pode ser instanciada. Só podem ser instanciadas as classes filhas que implementarem os métodos abstracts; • Se uma subclasse não implementar os métodos abstracts da classe abstract, ela também será abstract. • Classes abstratas podem ter variáveis e métodos não abstratos, ou seja, implementados. • Métodos abstract não podem ser private, static e final.

More Related