Linguagem Java e Orientação a Objetos

LPOO 1 - Java


Prof. Rodrigo Noll @ IFRS Canoas



Versão para impressão

Classes e Objetos

Classes e Objetos

Classes e Objetos

Em Java, a declaração de novas classes é feita através da construção class.


Estrutura Geral de Classe Java

Estrutura Geral de Classe Java


[package pacote;]
[import bibliotecas;]

[modificador] class NomeClasse {
	[modificador] [tipo] nomeAtributo;

	[modificador] [tipoRetorno] nomeMetodo ( [parametros] ) {
		// corpo do metodo
	}
}
                                

Estrutura Geral de Classe Java

A palavra-chave “package”:


package pacote;
public class Classe{
    ...
}
                        

Estrutura Geral de Classe Java

A palavra-chave “import”:


import java.util.ArrayList;
public class Classe{
		ArrayList lista;
		...
}
                        

Atributos

  • Java é uma linguagem fortemente tipada, isto é, toda a variável possui um tipo que não pode ser alterado
  • Variáveis são sempre declaradas dentro de blocos
  • Podem ser declaradas em qualquer ponto do programa

Atributos

São exemplos de atributos válidos:

  • AvgTemp count a4 $test this_is_ok

São exemplos de atributos inválidos:

  • 2cont high-temp not/ok

Métodos

Um método em Java é equivalente a uma função, subrotina ou procedimento em outras linguagens de programação. Não existe em Java o conceito de métodos globais, portanto todos os métodos pertencem a uma classe.


[modificador] [tipoRetorno] nomeMetodo ( [parametros] ) {
    // corpo do metodo
}
                        

Comentários

Palavras Reservadas

Java Keywords

Atributos e atribuição

Atributos e atribuição

A linha a seguir é a tradução de “idade deve valer agora quinze”.


                        idade = 15;
                        

O código a seguir declara novamente a variável idade com valor 15 e imprime seu valor na saída padrão através da chamada a System.out.println:


                        //declara a idade
                        int idade; idade = 15;
                        // imprime a idade
                        System.out.println(idade);
                        

Atributos e atribuição

Pode-se utilizar o valor de uma variável para algum outro propósito, como alterar ou definir uma segunda variável:


                            //gera a idade no ano seguinte
                            int idadeNoAnoQueVem;
                            idadeNoAnoQueVem = idade + 1;
                            

Pode-se declarar uma variável a iniciando:


                            int idade = 15;
                            

Pode-se usar os operadores +, -, /, * e %:


                            int quatro = 2 + 2;
                            int tres = 5 – 2;
                            int oito = 4 * 2;
                            int dezesseis = 64 / 4;
                            int um = 5 % 2;
                            

Atributos e atribuição


...
int i;
int j;

i = j + 5;
...
                                


A instrução i = j + 5; irá gerar um erro de compilação

Tipos primitivos e valores

Um tipo primitivo em Java armazena o real conteúdo da variável (o operador de atribuição “=” copia o valor)


                            int i = 5;
                            int j = i;
                            i = i + 1;
                        

Qual o valor das variáveis i e j?

i = 6 e j = 5

Casting e promoção

Analise o código:


                            double d = 3.1415;
                            int i = d;
                            i = 3.14;
                                

O que pode acontecer?

  • Erro de compilação, tentar atribuir um número real a um inteiro

E se alterarmos para?


                                    double d = 5;
                                    int i = d;
                                    
  • O compilador não tem como saber que d possui um inteiro em tempo de execução (o valor pode ser alterado durante a execução do programa).

Casting e promoção

Analise o código:


                            float x = 0.0;
                        

O que pode acontecer?

  • O código não vai compilar pois Java considera todos os números com ponto flutuante como double
  • Para funcionar, pode-se fazer o seguinte:

                            float x = 0.0f;
                            /*letra f (maiusc ou minusc.) indica que o literal deve ser tratado como float)*/
                        

Casting e promoção

  • Impl = implícito/automático
  • Tipo boolean não pode ser convertido para nenhum outro

Tamanhos dos Tipos

Tipo Precisão (bit)
boolean 1
byte 8
int 32
short 16
long 64
float 32
double 64
char 16

EXERCÍCIO

Crie uma classe Java e declare e imprima variáveis inteiras, com ponto flutuante (tipo double), valores verdadeiro e falso (tipo boolean) e caracteres (tipo char)

Operadores

Operadores Aritméticos

Operador Resultado
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Módulo

Resultado de Operações Aritméticas

Operadores Resultado
Pelo menos um operando é long e nenhum é float ou double long
Nenhum operando é float, double ou long int
Pelo menos um operando é double double
Pelo menos um operando é float, nenhum é double float

Operadores Unários

Operador Resultado
++ Incremento
-- Decremento
+ Indica que o valor é positivo
- Indica que o valor é negativo
! Inverte o valor de um boleano
~ Inverte um padrão de bits
() Organiza a precedência em uma operação

Operadores Relacionais

Operador Resultado
== Igual a
!= Diferente de
> Maior que
< Menor que
>= Maior que ou igual a
<= Menor que ou igual a
instanceof instância de

Operadores Lógicos

Operador Resultado
&& AND
|| OR
& Bitwise AND
| Bitwise OR

Comando de atribuição


                            identificador = valor
                        

Exemplo:


                            x = 10;
                            x = y = 15;
                        

Operação com atribuição

Operador Resultado Exemplo Operação Equivalente
+= Adição com atribuição x += y x = x + y
-= Subtração com atribuição x -= y x = x - y
*= Multiplicação com atribuição x *= y x = x * y
/= Divisão com atribuição x /= y x = x / y
%= Módulo com atribuição x %= y x = x % y

Operador Ternário


                            expr1 ? expr2 :  expr3
                        

Exemplo:


                            razao = denom == 0 ? 0 : num / denom;
                        

O operador “?” não é propriamente um comando, mas um operador que realiza avaliação seletiva de seus operandos mediante o valor de uma expressão booleana semelhante a do comando if-else. Se esta expressão for true, então um primeiro operando é avaliado; se for false, então o segundo operando é avaliado.

Precedência de Operadores

Comandos de Controle de Fluxo

Comandos de Controle de Fluxo

  • Comandos de Seleção
    • if-else
    • switch
  • Comandos de Repetição
    • while
    • do-while
    • for
  • Comandos de Desvio
    • break
    • continue

Comando de Seleção - IF


if (condição) {
     bloco
} else if (condição) {
    bloco
} else {
    bloco
}
                        

A forma mais simples de controle de fluxo é o comando if-else. Ele é empregado para executar seletivamente ou condicionalmente um outro comando mediante um critério de seleção. Este critério é dado por uma expressão, cujo valor resultante deve ser um dado do tipo booleano, isto é, true ou false. Se esse valor for true, então o outro comando é executado; se for false, a execução do programa segue adiante.

Comando de Seleção - IF

Exemplo:


if (x>10) a = 2;
else b = 5;
                        

if ((y >= 10) && (x < 5))
      b = 5;
else {
   a = 5; b *=b;
}
                        

Comando de Seleção - IF


int idade = 15;
boolean amigoDoDono = true;
if (idade < 18 & amigoDoDono == false) {
    System.out.println("Não pode entrar");
}
else {
    System.out.println("Pode entrar");
}
                            

Operador && e &

    Operadores && e || funcionam como seus operadores irmãos, porém eles funcionam da maneira mais rápida possível:
    • quando percebem que a resposta não mudará mais, eles param de verificar as outras condições booleanas.
    • Por isso, eles são chamados de operadores de curto circuito (short circuit operators).

    Exemplo:
    • if (true | algumaCoisa) { // ... }
      • O valor de algumaCoisa será analisado,
    • if (true || algumaCoisa) { // ... }
      • Neste caso o algumaCoisa não será analisado.

Comando de Seleção - SWITCH


    switch ([expressão])
    {  
        case [constante 1] :  [comando1]
            break;
        case [constante 2] :  [comando 2]
            break;
        ...
        case [constante n] :  [comando n]
            break;
        default :       [comando]
    }
                            

Comando de Repetição – WHILE


                            int idade = 15;
                            while(idade < 18) {
                                System.out.println(idade);
                                idade = idade + 1;
                            }
                            

                            int i = 0;
                            while(i < 10) {
                                System.out.println(i);
                                i = i + 1;
                            }
                            

Comando de Repetição – DO-WHILE


do {
	j++;
	n = j * 6;
} while ( n < 0 );

                            

Comando de Repetição – FOR


for (int i = 0; i < 10; i++) {
    n += i;	
}
                        
É equivalente à:

int i = 0;
while(i< 10) {
    n += i;
	i++;
}
                        

Comando de Repetição – FOR


for (int i = 0; i < 10; i++)  n += i;	
                            

	boolean achou= false;
	for (a = 1; !achou; a ++) {
		// comandos
		if ( a == 10) achou = true;
	}
                            

Pós e Pré incremento

Quanto vale x e i?


int i = 5;
int x = i++;

                        

E agora?


	int i = 5;
    int x = ++i;
                        

Comandos de Desvio - BREAK

  • Utilizado cancelar a iteração do loop;
  • Desvia a execução para o próximo comando (primeiro comando após o loop).

Comandos de Desvio - CONTINUE

  • Avança para a próxima iteração do loop sem executar o código subsequente.

    while (a != 10) {
		// comandos
		b++;
		if (b % 2 == 0)
			continue;
		a++;
	}

                        

Controlando Loops

BREAK


for (int i = x; i < y; i++) {
 if (i % 19 == 0{
  System.out.println("Achei um número divisível por 19 entre x e y");
  break;
 }
}
                            
Quais números os códigos irão imprimir?

Escopo das Variáveis

Pode-se declarar variáveis a qualquer momento, mas vale após a declaração

//aqui a variável i não existe
int i = 5;
// a partir daqui ela existe
                        
O que acontece quando tenta acessar a variável for a do seu escopo? Tente imprimir o J após o bloco.

Escopo das Variáveis

O que acontece com?

if (algumBooleano) {
    int i = 5;
}
else {
    int i = 10;
}
System.out.println(i);
                        
E com?

for (int i = 0; i < 10; i++) { System.out.println("olá!");}
System.out.println(i);
                        
Corrija os erros.

EXERCÍCIO

Exercícios sobre a linguagem Java

Orientação a Objetos

Orientação a Objetos (OO)

Orientação a objetos é uma maneira de programar que ajuda na organização e resolve muitos problemas enfrentados pela programação procedural, como a distribuição e/ou replicação da lógica em diversos pontos do código fonte.

A OO busca uma solução ideal para concentrar todas características e responsabilidades em um único lugar (classe) e não espalhadas no código.

Orientação a Objetos (OO)

    Orientação a objetos vai ajudar em:
  • Se organizar e escrever menos
  • Concentrar as responsabilidades nos pontos certos
  • Flexibilizar sua aplicação, encapsulando a lógica de negócios.


  • Outra enorme vantagem é o polimorfismo das referências, que veremos posteriormente.

Criando um tipo

Pode-se considerar a entidade Conta como importante dentro de um sistema bancário.

    Para esse sistema, é importante:
  • número da conta,
  • tipo de conta,
  • nome do cliente,
  • saldo,
  • limite

Mas dessa especificação, não se pode acessar saldo de ninguém, é preciso primeiro criar uma conta específica para depois solicitar algo dela.

Criando um Tipo

Com isso, definimos a classe (especificação):
A qual pode criar objetos reais (contas de verdade) que podem de armazenar valores:

Definição de Classe

    Vem da taxonomia da biologia
    • Representa que todas as entidades de uma mesma classe compartilham uma série de atributos e comportamentos
    • Nem todas as entidades de uma classe são iguais, podem variar os valores de atributos e como realizam os comportamentos
    Exemplo:
    • Não se pode fazer com que um Carro ande, é preciso primeiro construir um carro específico (instanciar) para depois da construção solicitar que ele ande.
    • Uma receita de bolo não é comestível, é uma especificação. O que se come é o quando essa receita é executada criando o bolo a partir das instruções.


Pergunta: A planta de uma casa é uma classe ou um objeto? Por quê?

Um classe em Java

Revendo a conta anterior:

                            class Conta {
                            int numero;
                            String nome;
                            double saldo;
                            double limite;

                            // ..
                            }
                            

Criação de Objetos como Atributos de Classe

Criação e Uso de Objetos

  • Digamos que uma classe chamada Programa.java deve utilizar a conta criada
  • Para usar, é necessário criar (construir, instanciar) e, para isso, basta usar a palavra chave new com os parênteses (mais tarde falaremos disso)

        class Programa {
            public static void main(String[] args) {
                new Conta();
            }
        }

                                
  • Esse código cria a conta, mas não é possível a acessar depois disso, portanto precisamos de um objeto para a referenciar:

Métodos

Métodos

Métodos são utilizados para definir os comportamentos (funções) de uma classe – o que ela faz! Exemplo: como é realizado o saque?

class Conta {
	int numero;
	String nome;
	double saldo;
	double limite;

	void saca(double quantidade) {
	    double novoSaldo =
               this.saldo - quantidade;
	    this.saldo = novoSaldo;
	}
}
                        

Métodos

Exemplo: como é realizado o depósito?

class Conta {
	int numero;
	String nome;
	double saldo;
	double limite;

	void saca(double quantidade) {
	    double novoSaldo =
               this.saldo - quantidade;
	    this.saldo = novoSaldo;
	}
	void deposita(double quantidade) {
	    this.saldo += quantidade;
	}
}

                            

Métodos

Para mandar uma mensagem ao objeto e pedir que ele execute um método, usamos o ponto (invocação do método):

class SacaEDepositaTest {
    public static void main(String[] args) {
      // criando a conta
      Conta minhaConta;
      minhaConta = new Conta();

      // alterando os valores de minhaConta
      minhaConta.nome = "Rodrigo";
      minhaConta.saldo = 1000;
      minhaConta.saca(200); // saca 200 reais
      minhaConta.deposita(500); //deposita 500 reais
      System.out.println(minhaConta.saldo);
    }
}
                            
Qual é o resultado da execução do código acima?
1300.0

Métodos

Um método sempre tem que retornar alguma coisa, nem que essa coisa seja nada (void). Observe o retorno dos métodos

class SacaEDeposita {
    public static void main(String[] args) {
      // criando a conta
      Conta minhaConta = new Conta();
      minhaConta.saldo = 1000;
      System.out.println(minhaConta.saca(2000));
    }
}
                            

Objetos e Referências

Objetos e Referências

Quando declaramos uma variável para associar a um objeto, na verdade, essa variável não guarda o objeto, e sim uma maneira de acessá-lo, chamada de referência. É por esse motivo que, diferente dos tipos primitivos como int e long, precisamos dar new depois de declarada a variável:

É correto dizer que minhaConta se refere a um objeto e não que é um objeto.

Lembre-se, uma variável nunca é um objeto

Objetos e Referências

Objetos e Referências

Objetos e Referências

Método transfere()

  • Como realizar uma trasferência?
    • Criando um método transfere(Conta conta1, Conta conta2, double valor)?
    • Essa é uma solução procedural. Ao chamar o método transfere, já existe um objeto do tipo Conta (o this), portanto o método recebe apenas um parâmetro do tipo Conta, a Conta destino (além do valor)

Método transfere()

Para realizar a transferência:

class Programa {
  public static void main(String[] args) {
    // criando a conta
    Conta minhaConta;
    minhaConta = new Conta();
    minhaConta.nome="Rodrigo";
    minhaConta.saldo=1000;

    Conta outraConta = new Conta();
    outraConta.nome="Rodrigo";
    outraConta.saldo=1000;

    //minhaConta transfere para outraConta 100 reais
    minhaConta.transfere(outraConta, 100);
    System.out.println("Saldo da Minha Conta = "+minhaConta.saldo);
    System.out.println("Saldo da Outra Conta = "+outraConta.saldo);
  }
}
//Saldo da Minha Conta = 900.0
//Saldo da Outra Conta = 1100.0

                            

Atributos de Classe

Atributos de Classe

  • As variáveis do tipo atributo, diferentemente das variáveis temporárias (declaradas dentro de um método), recebem um valor padrão.
    • Valores numéricos recebem 0
    • Valores boolean recebem false
    • Objetos recebem null para as referências (null indica uma referência para nenhum objeto)
  • Você também pode dar valores default, como segue:

public class Conta {
  int numero=1234;
  String nome="Rodrigo";
  double saldo=1000;
  double limite=1000;
}
                        

Atributos de Classe

  • Se começamos a aumentar nossa classe Conta e adicionar nome, sobrenome e cpf do cliente dono da conta, começaríamos a ter muitos atributos...
    • Se você pensar direito, uma Conta não tem nome, nem sobrenome nem cpf, quem tem esses atributos é um Cliente.


public class Conta{
  int numero;
  double saldo;
  double limite;
  Cliente titular;
}
                        

Atributos de Classe

  • Um sistema orientado a objetos é um grande conjunto de classes que vai se comunicar, delegando responsabilidades para quem for mais apto a realizar determinada tarefa.
    • A classe Banco usa a classe Conta que usa a classe Cliente, que usa a classe Endereco.
    • Dizemos que esses objetos colaboram, trocando mensagens entre si.
      • Por isso acabamos tendo muitas classes em nosso sistema, e elas costumam ter um tamanho relativamente curto.

Atributos de Classes


class Programa {
  public static void main(String[] args) {
    // criando a conta
    Conta minhaConta = new Conta();
    Cliente cliente = new Cliente();

    minhaConta.titular = cliente;
    minhaConta.titular.nome = "Rodrigo";
    cliente.nome = "Fulano";
    System.out.println(minhaConta.titular.nome);

  }
}
                            
  • Altere o programa comentando a instanciação do cliente. O que acontece?
  • Se tentar acessar um atributo ou método de alguém que está null, você receberá um erro durante a execução (NullPointerException).

Atributos de Classes

  • Para criar um cliente para cada nova Conta sem necessidade de instanciar esse cliente toda vez que criar uma conta, pode-se utilizar o código abaixo.
    • Ele significa COMPOSIÇÃO, isto é, para toda nova Conta você terá um novo Cliente. Apagando a conta, apaga o cliente.

public class Conta{
  int numero;
  double saldo;
  double limite;
  Cliente titular = new Cliente();
}
                            

Exercício

Exercício

Exercícios sobre Orientação a Objetos

Linguagem Java e Orientação a Objetos

Exercícios sobre a linguagem Java

Exercícios sobre Orientação a Objetos


LPOO 1 - Java