classes e objetos poo - edisciplinas.usp.br

40
Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 1/40 Classes e Objetos POO Prof. Marcio Delamaro

Upload: others

Post on 19-Jul-2022

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 1/40

Classes e Objetos

POO

Prof. Marcio Delamaro

Page 2: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 2/40

POO (wikipedia)

● Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which are data structures that contain data, in the form of fields, often known as attributes; and code, in the form of procedures, often known as methods.

● A distinguishing feature of objects is that an object's procedures can access and often modify the data fields of the object with which they are associated

Page 3: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 3/40

Exemplo banalQuero representar os dados de uma pessoa

Page 4: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 4/40

Exemplo banalQuero representar os dados de uma pessoa

Data nascimento, peso, altura.

Page 5: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 5/40

Exemplo banalQuero representar os dados de uma pessoa

Data nascimento, sexo, peso, altura.

24/08/1963, M, 72, 172

Em cima desses dados, eu quero computar coisas que me interessam: idade, IMC, etc.

Page 6: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 6/40

Exemplo banalQuero representar os dados de uma pessoa

Data nascimento, sexo, peso, altura.

24/08/1963, M, 72, 172

Em cima desses dados, eu quero computar coisas que me interessam: idade, IMC, etc.

idade()imc()

Page 7: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 7/40

Exemplo banalQuero representar os dados de uma pessoa

Data nascimento, sexo, peso, altura.

24/08/1963, M, 72, 172

Em cima desses dados, eu quero computar coisas que me interessam: idade, IMC, etc.

idade()imc()

24/10/1980, F, 51, 165

idade()imc()

4/1/2000, F, 60, 155

idade()imc()

Page 8: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 8/40

Exemplo banalQuero representar os dados de uma pessoa

Data nascimento, sexo, peso, altura.

24/08/1963, M, 72, 172

Em cima desses dados, eu quero computar coisas que me interessam: idade, IMC, etc.

idade()imc()

24/10/1980, F, 51, 165

idade()imc()

4/1/2000, F, 60, 155

idade()imc()

53

36

17

Cada objeto possui os mesmos métodos (código) e dados diferentes.Ao invocar um método esse vai considerar os dados correspondentes ao seu objeto.Assim, os comportamentos (resultados) são diferentes para cada objeto.

Page 9: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 9/40

Classe

● Cada objeto possui os mesmos elementos● Atributos e métodos● Ao definirmos (programarmos) a estrutura de

um objeto, estamos definindo uma classe● Grosso modo, em uma classe definimos um

tipo de objetos, compostos por atributos (variáveis) e métodos (código).

Page 10: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 10/40

Exemplo não tão banal

● Vamos implementar um programa para selecionar números aleatórios para a mega-sena.

● Para isso vamos precisar de uma classes que gere números aleatórios.

● Vejamos como faremos.

Page 11: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 11/40

Geração de N.A.

● A geração começa com um inteiro x0 chamado de semente.

● Para calcular o próximo número aleatório, fazemos xi+1 = (a + m xi) mod p

● Vamos usar os seguintes valores: a = 453816693, m = 843314861 e p = 2147483648.

● Como semente usamos 1023.● Queremos implementar dois métodos: getRand() e getIntRand(int m)

Page 12: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 12/40

Atributos

● Quais seriam os atributos que compõem a minha classe?

Page 13: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 13/40

Atributos

● Quais seriam os atributos que compõem a minha classe?

● Justamente as variáveis que foram apresentadas no slide anterior

● Vamos criar uma classe Java e adicionar os atributos.

Page 14: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 14/40

Classe Random

public class Random {

}

Page 15: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 15/40

Classe Random

public class Random {

} Para que ele possa ser usada por outras classes. Métodos e atributos também podem ser públicos.

Page 16: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 16/40

Atributos da classe Random

public class Random {

    // esses são os parametros para geracao

    private long p = 2147483648l;

    private long m = 843314861;

    private long a = 453816693;

    private long xi = 1023; // essa eh a semente

}

Page 17: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 17/40

Métodos da classe Random

public double getRand() {

    // calcula o proximo valor xi

    // calcula valor entre 0 e 1,            dividindo por p

 }

Page 18: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 18/40

Métodos da classe Random

public double getRand() {

     xi = (a + m * xi) % p;

    double d = xi; // promove p/ double

    return d / p;

}

Page 19: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 19/40

Métodos da classe Random

public int getIntRand(int max)

{

   // gera valor entre [0 , 1)

   // multiplica por max 

}

Page 20: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 20/40

Métodos da classe Random

public int getIntRand(int max)

{

   double d = getRand() * max;

   return (int) d;

}

Page 21: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 21/40

Usando a classe

● Vamos escrever um pequeno programa que gera números para a megasena

● Todo código está dentro de uma classe● Antes de usar o gerador de números aleatórios

é preciso “instanciar um objeto”

Page 22: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 22/40

Classe MegaSena

public class MegaSena {

public static void main(String[] args) {

     // cria um objeto para gerar números aleatórios

   for (int i = 0; i < 6; i++) {

         // Pega um número aleatório entre 1 e 60

         // mostra o número

   }

  }

}

Page 23: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 23/40

Classe MegaSena

public class MegaSena {

public static void main(String[] args) {

     // cria um objeto para gerar números aleatórios

     Random r = new Random();

   for (int i = 0; i < 6; i++) {

         // Pega um número aleatório entre 1 e 60

         // mostra o número

   }

  }

}

Page 24: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 24/40

Classe MegaSena

public class MegaSena {

public static void main(String[] args) {

     // cria um objeto para gerar números aleatórios

     Random r = new Random();

 for (int i = 0; i < 6; i++) {

      // Pega um número aleatório entre 1 e 60

           int k = r.getIntRand(60) + 1;

      // mostra o número

           System.out.println(i+1 + "o. Numero: " + k);=

 }

  }

}

Page 25: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 25/40

Executando MegaSena

● 1o. Numero: 572o. Numero: 293o. Numero: 284o. Numero: 145o. Numero: 226o. Numero: 11

● Qual o problema com esse programa?

Page 26: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 26/40

Executando MegaSena

● 1o. Numero: 572o. Numero: 293o. Numero: 284o. Numero: 145o. Numero: 226o. Numero: 11

● Qual o problema com esse programa?– Todas as vezes, a sequência é a mesma

● Como resolver isso?

Page 27: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 27/40

Solução 1

● Vamos permitir que a classe usuária modifique a semente a ser usada

● A semente pode, por exemplo, ser fornecida pelo próprio usuário

● Para isso vamos dar acesso ao atributo da semente

● public long xi = 1023;

Page 28: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 28/40

Problema com solução 1

● O problema com essa solução é que ela dá acesso aos atributos internos da classe Random

● Uma das características de POO é ocultamento de informação

● Imagine, por exemplo que alguém precise mudar o nome da variável

● Uma classe deve ser acessada por meio da sua interface pública

Page 29: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 29/40

Solução 2

● Vamos criar uma interface pública para alterar a semente

● Criamos um método setSemente(int k) ● Em vez de acessar diretamente a variável,

invocamos esse método

Page 30: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 30/40

Solução 2

private long xi = 1023;

public void setSemente(int semente) {

       xi = semente;

}

Page 31: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 31/40

Solução 2 - MegaSena

public static void main(String[] args) throws Exception {

    Random r = new Random();

    System.out.print("Digite um número inteiro para semente: ");

    int semente = EntradaTeclado.leInt();

    r.setSemente(semente);

    ….......

Page 32: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 32/40

Construtor

● Quando criamos um objeto r = new Random();é chamado um método especial da classe

● Esse método serve para inicializar os atributos do objeto

● Como podemos usar isso na nossa classe Random?

Page 33: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 33/40

Construtor

● Quando criamos um objeto r = new Random();é chamado um método especial da classe

● Esse método serve para inicializar os atributos do objeto

● Como podemos usar isso na nossa classe Random?

● Podemos passar parâmetros para o construtor

Page 34: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 34/40

Construtor Random

public Random(int k)

{

   xi = k;

}

Page 35: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 35/40

Construtor Random

public static void main(String[] args) throws Exception {

    System.out.print("Digite um número inteiro para                          semente: ");

    int semente = EntradaTeclado.leInt();

    Random r = new Random(semente);

Page 36: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 36/40

Toda classe tem

● Toda classe tem um construtor● Se você não declarar, é criado um, que não faz

nada● Se vc declarar um, o que não faz nada, deixa

de existir● Você pode ter mais do que um

Page 37: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 37/40

Múltiplos construtores

public Random(int k)

{

   xi = k;

}

public Random() {

}

Page 38: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 38/40

Múltiplos construtores

public Random(int k)

{

   xi = k;

}

public Random() {

}

Random r = new Random(2048);

Random r = new Random();

Page 39: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 39/40

Exercícios

● Crie um programa que instancie dois objetos da classe Random, com duas sementes diferentes. Em seguida, vá gerando um número entre 0 e 500 com cada um deles, até que o número gerado seja o mesmo. Mostre qual é o número gerado e quantas iterações são necessárias.

● Modifique o construtor padrão da sua classe Random, de modo que se ele for usado para criar o objeto, então a semente vai ser inicializada com o valor aleatório dado por: Calendar.getInstance().getTimeInMillis();

Use essa nova versão em um dos objetos do programa anterior.

Page 40: Classes e Objetos POO - edisciplinas.usp.br

Programação Orientada a Objetos – Prof Marcio Delamaro – ICMC/USP 40/40

Exercício

● Implemente uma classe ObesidadePessoa com:● atributos: peso e altura (ambos do tipo double)● métodos:

– setPeso: recebe peso por parâmetro e atualiza o atributo

– setAltura: recebe altura por parâmetro e atualiza o atributo

– getPeso: devolve peso

– getAltura: devolve altura

– calculaIMC: devolve Índice de Massa Corporal. IMC = peso/altura2

– defineObesidade = chama o método calculaIMC e exibe mensagem na tela, de acordo com a seguinte regra:

● se IMC > 25, exibe “Risco de obesidade”, senão exibe “Não há risco de obesidade”