Introdução a Linguagem Java


  • Queremos introduzir a linguagem Java básica (sem uso de orientação a objeto) através de alguns exemplos simples
  • O aluno deve entender, neste momento, que Java é apenas uma outra linguagem de programação, mas possuindo de sintaxe diferente da linguagem vista em Programação I (Python, Pascal, ...)
  • Mais tarde, veremos que Java é, na realidade, substancialmente diferente de Python
  • Queremos ver como Java trata
    • Tipos básicos
    • Constantes
    • Decisões
    • Laços
    • Compilação e execução de programas
    • IDE - Integrated Development Environment (Eclipse)
  • Observe que não veremos chamadas de sub-programas (subrotinas ou funções) aqui
    • Este assunto é bem diferente em Java, devido à orientação a objeto, e será visto à frente
  • Importante! Você é responsável por aprender detalhes adicionais da linguagem Java. O que faremos em aula não é uma cobertura completa da linguagem.

Por que Java?

  • Linguagem muito poderosa embora simples
  • Permite portabilidade
  • Muito usada em programação em rede
    • Server Programming
    • Aplicações de e-commerce, e-business, etc.
    • Aplicações para acesso via Internet, intranet, etc.

Um primeiro programa: Hello, World!

package p2.exemplos;

// Todo programa tem um ponto de entrada: o "método" main de alguma "classe"
public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}
  • Observações segue ...
  • A linha ...
package p2.exemplos;
  • ... é usada para indicar que este programa faz parte de um "pacote" que pode conter vários programas
    • É uma forma de organizar vários programas, da mesma forma que "pastas" ou "diretórios" são usados para organizar arquivos num sistema de arquivos
  • Dois tipos de comentários (há mais um tipo a ser visto adiante)
  • Esqueça, por enquanto, o que significam "public", "classe", "static", "void" e "método"
    • "Método" é semelhante a "module" em Python
    • Outgros nomes: subrotina, função, procedimento, procedure, ...
  • O nome do programa é Hello
    • Por convenção, deve iniciar com uma letra maiúscula
    • Observe que o programa Hello está obrigatoriamente armazenado no arquivo Hello.java
    • Java é "case-sensitive" (reconhece diferença de caixa)
  • Até entender detalhes, sempre use as primeiras duas linhas de código do exemplo acima, trocando apenas o nome do programa (Hello)
  • "{" significa "BEGIN" e "}" significa "END"
  • Observe a forma de imprimir
  • Observe a formação de uma constante do tipo string ("Hello, world!")
  • Vamos compilar o programa (no Windows, UNIX, etc.)
    • Isso é desnecessário em Python que é interpretado
javac Hello.java
  • O comando javac é o compilador Java
    • O resultado deve estar no arquivo Hello.class (verifique)
  • Agora, vamos executar o programa:
java Hello
  • O comando java é a "Java Virtual Machine" (JVM) que sabe executar um programa Java compilado com o comando java e presente no arquivo Hello.class
    • Isso é diferente de outras linguagens (C, C++) que são diretamente executáveis após a compilação
    • Motivo: independência de plataforma: Um programa em Java executa em qualquer lugar onde houver uma JVM, sem recompilação
  • A saída é:
Hello, world!
  • Observe que a saída é "a caractere"
    • É possível fazer interfaces gráficas com Java mas não falaremos disso
    • A disciplina de laboratórios tratará do assunto
  • É possível usar ambientes integrados de desenvolvimento (IDE) para programar e depurar em Java
    • Eclipse é particularmente popular

Um segundo programa: entrada de dados, tipos básicos, variáveis, decisões simples

  • Ler 3 números inteiros da entrada, imprimir o menor e o maior.
  • A primeira solução está no arquivo MinMax1.java
package p2.exemplos;

import java.util.Scanner;


public class MinMax1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n1, n2, n3;

        System.out.print("Entre com o primeiro inteiro: ");
        n1 = sc.nextInt();
        System.out.print("Entre com o segundo inteiro: ");
        n2 = sc.nextInt();
        System.out.print("Entre com o terceiro inteiro: ");
        n3 = sc.nextInt();
        if (n1 > n2) {
            if (n1 > n3) {
                if (n2 < n3) {
                    System.out.println("O menor numero eh: " + n2);
                } else {
                    System.out.println("O menor numero eh: " + n3);
                }
                System.out.println("O maior numero eh: " + n1);
            } else {
                if (n1 < n2) {
                    System.out.println("O menor numero eh: " + n1);
                } else {
                    System.out.println("O menor numero eh: " + n2);
                }
                System.out.println("O maior numero eh: " + n3);
            }
        } else {
            if (n2 > n3) {
                if (n1 < n3) {
                    System.out.println("O menor numero eh: " + n1);
                } else {
                    System.out.println("O menor numero eh: " + n3);
                }
                System.out.println("O maior numero eh: " + n2);
            } else {
                if (n1 < n2) {
                    System.out.println("O menor numero eh: " + n1);
                } else {
                    System.out.println("O menor numero eh: " + n2);
                }
                System.out.println("O maior numero eh: " + n3);
            }
        }
    }
}
  • Como compilar e rodar o programa
javac MinMax1.java
java MinMax1
  • Uma saída típica:
Entre com o primeiro inteiro: 3
Entre com o segundo inteiro: 9
Entre com o terceiro inteiro: 123
O menor numero eh: 3
O maior numero eh: 123
  • A linha ...
import java.util.Scanner;
  • ... é usada para dizer ao Java que usaremos alguma coisa externa ao nosso programa (a "classe"Scanner )
  • A linha ...
Scanner sc = new Scanner(System.in);
  • ... cria um "Scanner" que é usado para ler dados da entrada
    • Os detalhes (o que significa "new", etc. serão explicados adiante)
  • A linha ...
    int n1, n2, n3;
  • ... declara três variáveis inteiras para uso posterior
    • Por convenção, variáveis iniciam com letra minúscula
  • A linha ...
    n1 = sc.nextInt();
  • ... lê um inteiro da entrada
  • Também poderíamos ter feito assim:
    int n1 = sc.nextInt();
  • As linhas ...
        if(n2 < n3) {
          System.out.println("O menor numero eh: " + n2);
        } else {
          System.out.println("O menor numero eh: " + n3);
        }
  • ... mostram uma decisão
  • Duas dessas linhas também mostram a concatenação de strings com o operador +
    • Falamos que, em Java, o operador "+" está overloaded porque ele significa adição de números e também concatenação de strings, dependendo dos seus operandos
    • É o único operador que sofre overload
  • Segue uma segunda versão do programa
package p2.exemplos;

import java.util.Scanner;


public class MinMax2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n1, n2, n3;

        System.out.print("Entre com o primeiro inteiro: ");
        n1 = sc.nextInt();
        System.out.print("Entre com o segundo inteiro: ");
        n2 = sc.nextInt();
        System.out.print("Entre com o terceiro inteiro: ");
        n3 = sc.nextInt();

        int mínimo;
        int máximo;
        if (n1 > n2) {
            if (n1 > n3) {
                if (n2 < n3) {
                    mínimo = n2;
                } else {
                    mínimo = n3;
                }
                máximo = n1;
            } else {
                if (n1 < n2) {
                    mínimo = n1;
                } else {
                    mínimo = n2;
                }
                máximo = n3;
            }
        } else {
            if (n2 > n3) {
                if (n1 < n3) {
                    mínimo = n1;
                } else {
                    mínimo = n3;
                }
                máximo = n2;
            } else {
                if (n1 < n2) {
                    mínimo = n1;
                } else {
                    mínimo = n3;
                }
                máximo = n3;
            }
        }
        System.out.println("O menor numero eh: " + mínimo);
        System.out.println("O maior numero eh: " + máximo);
    }
}
  • Observe que estamos usando acentuação variáveis com acentuação
    • Isso é possível porque Java usa Unicode como código de caracteres
  • Perguntas sobre o programa acima
    • Você achou o programa "bem escrito"?
    • É fácil de entender?
    • É fácil trocar as mensagenms de saída por outras?
    • É fácil assegurar-se de que não há bug?
      • Na realidade, um dos programas acima tem um bug: ache o!
    • É fácil estender para 4 números lidos na entrada?
  • Que tal o seguinte programa que resolve o mesmo problema:
package p2.exemplos;

import java.util.Scanner;

public class MinMax3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num;
        int mínimo = Integer.MAX_VALUE;
        int máximo = Integer.MIN_VALUE;

        System.out.print("Entre com o primeiro inteiro: ");
        num = sc.nextInt();
        if (num < mínimo) {
            mínimo = num;
        }
        if (num > máximo) {
            máximo = num;
        }

        System.out.print("Entre com o segundo inteiro: ");
        num = sc.nextInt();
        if (num < mínimo) {
            mínimo = num;
        }
        if (num > máximo) {
            máximo = num;
        }

        System.out.print("Entre com o terceiro inteiro: ");
        num = sc.nextInt();
        if (num < mínimo) {
            mínimo = num;
        }
        if (num > máximo) {
            máximo = num;
        }

        System.out.println("O menor numero eh: " + mínimo);
        System.out.println("O maior numero eh: " + máximo);
    }
}
  • É muito mais limpo, não é?
    • Explique por quê
  • Agora, vamos resolver a mesma coisa com um laço simples:
package p2.exemplos;

import java.util.Scanner;


public class MinMax4 {
    public static void main(String[] args) {
        final int NÚMEROS_A_LER = 3;
        Scanner sc = new Scanner(System.in);
        int mínimo = Integer.MAX_VALUE;
        int máximo = Integer.MIN_VALUE;

        for (int i = 0; i < NÚMEROS_A_LER; i++) {
            System.out.print("Entre com o proximo inteiro: ");
            int num = sc.nextInt();
            if (num < mínimo) {
                mínimo = num;
            }
            if (num > máximo) {
                máximo = num;
            }
        }

        System.out.println("O menor numero eh: " + mínimo);
        System.out.println("O maior numero eh: " + máximo);
    }
}
  • NÚMEROS_A_LER é declarado como "final" para indicar que é uma constante
    • Como "const" em Pascal ou C
    • Por convenção, usam-se letras maiúsculas para constantes (como em Python, C, C++)
    • Melhor usar constantes simbólicas do que contantes numéricas
      • Programa fica mais simples de entender
  • Observe como fazer um laço "for" na linha:
    for(int i = 0; i < NÚMEROS_A_LER; i++) {
  • A expressão ...
    i++
  • ... significa ...
    i = i + 1
  • Observe também onde a variável "num" foi declarada:
            int num = sc.nextInt();
  • De forma geral, é bom declarar uma variável perto de onde ela é usada
    • Fizemos a mesma coisa com a declaração da variável do laço (i)

Um terceiro programa: tipos primitivos, limites de representação, constantes, operadores e expressões

  • Primeiro, um pouco de teoria ...

Tipos primitivos, limites de representação e constantes

Tipo primitivoTamanhoMínimoMáximoExemplos de Constantes
boolean1 bit--true, false
char16 bitsUnicode 0Unicode 65.535'a' (letra a)
byte8 bits-128+12797, -23
0x65 (hexadecimal)
short16 bits-215 (-32.768)+215-1(32.767)17569, -21875
int32 bits-231
(uns -2 bi)
+231-1
(uns 2 bi)
1876345240, -2000000000
long64 bits-263
(uns -9 quintilhões)
+263-1
(uns 9 quintilhões)
123981723971982318273L,
-12381726387613678688L,
97L, -23L, 0L
(Observe o 'L' final)
float32 bitsaprox -1038
(6-7 dígitos significativos)
aprox +1038
(6-7 dígitos significativos)
-3.4F
45.78E+23F
(Observe o 'F' final)
double64 bitsaprox -10308
(15 dígitos significativos)
aprox +10308
(15 dígitos significativos)
-3.4
45.78E+23
void---indica ausência de tipo
(quando um "método" nada retorna)
  • A conversão entre tipos (quando possível) é feita com cast:
  double x = 8.89;
  int n = (int)x; // n terá valor 8

Operadores

  • Operadores matemáticos
    • + (soma)
    • - (subtração)
    • * (multiplicação)
    • / (divisão)
    • % (módulo)
    • Há operadores unários - e +
    • Operadores binários podem ser seguido de =, tal como na seguinte expressão:
  soma += nota*peso; // equivalente a soma = soma + nota*peso
  • Operador de String
    • + (overload do operador par concatenar strings)
  • Operadores de auto-incremento e auto-decremento
  númeroDeAlunos++; // equivalente a númeroDeAlunos = númeroDeAlunos + 1
  númeroDeAlunos--; // equivalente a númeroDeAlunos = númeroDeAlunos - 1
  if(númeroDeAlunos-- > 0) // equivalente a testar númeroDeAlunos e depois decrementar
  if(--númeroDeAlunos > 0) // equivalente a decrementar e depois testar númeroDeAlunos
  • Operadores relacionais
    • < (menor)
    • <= (menor ou igual)
    • > (maior)
    • >= (maior ou igual)
    • == (igual)
    • != (não igual)
  • Operadores lógicos
    • && (AND)
    • || (OR)
    • ! (NOT)
    • Exemplos:
  if(númeroDeAlunos > MAX_ALUNOS || númeroDeProfessores > MAX_PROFS) ...
  if(ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0) ... // ano bissexto
  • Operadores de bits e de deslocamento
    • &, &=, |, |=, ^, ^=, ~
    • Não falaremos deles aqui
  • Operador ternário
    • Para escrever uma operação condicional sem usar if-else
    • Exemplo segue
  // a linha seguinte
  média = númeroDeNotas == 0 ? 0.0 : soma/númeroDeNotas;
  // é equivalente às linhas seguintes
  if(númeroDeNotas == 0) {
    média = 0.0;
  } else {
    média = soma/númeroDeNotas;
  }
  • Expressões complexas e precedência de operadores
    • A precedência dos operadores pode ser vista na tabela abaixo, a qual não deve se decorada
    • Observe que a tabela contém operadores que ainda não mencionamos
OperadoresPrecedênciaAssociatividade
[] . ()Mais altadir.gif (503 bytes)
! ~ ++ -- + (unário) - (unário) (cast) new esq.gif (933 bytes)
* / % dir.gif (503 bytes)
+ - dir.gif (503 bytes)
<< >> >>> dir.gif (503 bytes)
< <= > >= instanceof dir.gif (503 bytes)
== != dir.gif (503 bytes)
& dir.gif (503 bytes)
^ dir.gif (503 bytes)
| dir.gif (503 bytes)
&& dir.gif (503 bytes)
|| dir.gif (503 bytes)
?: dir.gif (503 bytes)
= += -= *= /= %= &= |= ^= <<= >>= >>>=Mais baixaesq.gif (933 bytes)
  • De forma geral, as precedências "esperadas" funcionam, como mostra o exemplo abaixo
  // a linha seguinte
  if(númeroDeAlunos > MAX_ALUNOS || númeroDeProfessores > MAX_PROFS) ...
  // não precisa de parênteses, pois é equivalente a
  if((númeroDeAlunos > MAX_ALUNOS) || (númeroDeProfessores > MAX_PROFS)) ...
  • Na dúvida sobre precedências, use parênteses

Um programa exemplo

  • Segue um programa que ajuda a planejar sua aposentadoria (será que jovens de 18 anos pensam nisso???)
  • Esta solução está no arquivo Aposentadoria.java
package p2.exemplos;

import java.util.Scanner;


public class Aposentadoria {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double alvo;
        double juros;
        double contribuição;
        int anos = 0;
        double saldo = 0;

        // exercicio: verifique valores informados abaixo são aceitáveis
        System.out.print("Quanto dinheiro voce quer para se aposentar? ");
        alvo = sc.nextDouble();
        System.out.print("Quanto dinheiro voce vai contribuir todo ano?");
        contribuição = sc.nextDouble();
        System.out
                .print("Taxa de juros em % (exemplo: digite 7.5 para 7.5%): ");
        juros = sc.nextDouble() / 100;

        while (saldo < alvo) {
            saldo = (saldo + contribuição) * (1 + juros);
            anos++;
        }

        System.out.println("Voce pode se aposentar em " + anos + " anos.");
    }
}

Um quarto programa: arrays

  • Java tem arrays unidimensionais e multidimensionais
  • Segue um programa que lê 10 números e os imprime em ordem inversa
  • Esta solução está no arquivo Inverte.java
package p2.exemplos;

import java.util.Scanner;


public class Inverte {
    public static void main(String[] args) {
        final int NÚMEROS_A_LER = 10;
        Scanner sc = new Scanner(System.in);
        int[] números = new int[NÚMEROS_A_LER]; // criação do array de 10
                                                // inteiros

        for (int i = 0; i < números.length; i++) {
            System.out.print("Entre com o proximo inteiro: ");
            números[i] = sc.nextInt();
        }
        for (int i = números.length - 1; i >= 0; i--) {
            System.out.println(números[i]);
        }
    }
}
  • Observe que arrays são sempre indexados a partir de zero
  • Precisa saber o tamanho para criar o array
  • números.length é o número de elementos no array números
  • No laço, é preferível usar números.length a usar o número 10
    • Por quê?
  • Segue um programa que ecoa os argumentos de linha de comando
  • Esta solução está no arquivo Eco.java
package p2.exemplos;


public class Eco {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.print(args[i] + " ");
        }
        System.out.println();
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}
  • Observe que args é um array normal, composto de Strings
  • Segue um programa que mostra uma forma de inicializar arrays
  • Esta solução está no arquivo Dia.java
package p2.exemplos;


public class Dia {
    public static void main(String[] args) {
        final int DIAS_NA_SEMANA = 7;
        final String[] diasDaSemana = { "", "Domingo", "Segunda", "Terca",
                "Quarta", "Quinta", "Sexta", "Sabado" };
        if (args.length != 1) {
            System.err.println("Sintaxe: Dia numero");
            System.exit(1);
        }
        int dia = Integer.parseInt(args[0]);
        if (dia < 1 || dia > DIAS_NA_SEMANA) {
            System.err.println("O dia da semana deve estar entre 1 e "
                    + DIAS_NA_SEMANA);
            System.exit(1);
        }
        System.out.println(diasDaSemana[dia]);
    }
}
  • Observações
    • A inicialização do array diaDaSemana já calcula o tamanho necessário
    • É recomendado usar System.err em vez de System.out para imprimir erros
    • System.exit(0) é usado para terminar o programa "bem"
    • System.exit(1) é usado para terminar o programa "mal"
    • Integer.parseInt(xpto) converte o string xpto a um inteiro
  • Teste: retire o teste da seguinte linha ...
    if(dia < 1 || dia > 7) {
É isso ai galera! Até a próxima!

Comentários

Postagens mais visitadas deste blog

E Esse Tal de Nano Service?

Executar Audio em Java Swing

Validando Email em Java Com e Sem expressão Regular