Skip to content

Latest commit

 

History

History
936 lines (622 loc) · 21.6 KB

File metadata and controls

936 lines (622 loc) · 21.6 KB

Java

2 - Conceitos Fundamentais de Programação

2.1 - Comentários

Comentários em linguagens de programação são trechos de texto que não são executados pelo computador, mas desempenham um papel essencial na clareza e documentação do código. Eles são usados para explicar o propósito de partes do código, fornecer informações úteis aos programadores, facilitar a depuração de erros e, às vezes, desativar temporariamente seções do código. Comentários são uma prática fundamental para tornar o código mais compreensível, colaborativo e fácil de manter.

Acesse o código

Maneira 1

Permite comentar apenas uma linha

// Comentário

Maneira 2

Permite comentar várias linhas

/*

Comentário

*/

Maneira 3

Comentários de documentação são usados para gerar documentação automática usando ferramentas como o Javadoc.

/**

Este é um comentário de documentação.
@param var_int -> variavel de número inteiro

*/

2.2 - Tipos, Variáveis e Atribuições simples

Tipos referem-se às categorias de dados, como inteiros, strings ou booleanos, determinando como os valores são armazenados e manipulados.

Variáveis são contêineres que mantêm valores desses tipos, permitindo aos programadores armazenar informações e manipulá-las dinamicamente no código.

Atribuições são ações que associam um valor a uma variável, possibilitando o armazenamento de dados e a execução de cálculos, facilitando o controle e a manipulação das informações dentro de um programa.

Os tipos de dados em Java são inferidos estaticamente, o que significa que o tipo de uma variável deve ser declarado explicitamente no momento da criação da variável e é verificado em tempo de compilação. Alguns dos tipos mais comuns:

Acesse o código

public class Java_02_00_00 {
  public static void main(String[] args) {

    //Armazena valores inteiros de 8 bits
    byte var_byte = 5;

    //Armazena valores inteiros de 16 bits
    short var_short = 5;

    //Armazena valores inteiros de 32 bits
    int var_int = 5;

    //Armazena valores inteiros de 64 bits
    long var_long = 5;

    //Armazena valores de ponto flutuante de precisão simples
    float var_float = 1.5;

    //Armazena valores de ponto flutuante de precisão dupla
    double var_double = 10.55;

    //Armazena valores verdadeiros ou falsos
    boolean var_boolean = true;

    //Armazena sequências de caracteres
    String var_string = "nome";

    //Armazena apenas 1 caractere
    char var_char = "A";

    //Armazena coleções de elementos do mesmo tipo
    Array var_array = [0,1,2,3,4,5];
  }
}

Em Java, a tipagem é forte e estática.

Tipagem Forte

A "tipagem forte" significa que a linguagem impõe regras rígidas para a conversão de tipos, garantindo que as operações sejam realizadas apenas entre tipos compatíveis, o que pode ajudar a prevenir erros de tipo durante a execução do programa.

Acesse o código

public class Java_02_01_00 {
  public static void main(String[] args) {

    //Atribui-se o tipo inteiro "int" a variavel "var_int" e "var_result"
    int var_int = 5;
    int var_result;

    //Atribui-se o tipo string "String" a variavel "var_string"
    String var_string = "10";

    //Busca-se somar um inteiro com uma string
    var_result = var_int + var_string;

    System.out.println(var_result);
  }
}
Saída:

Erro de Tipos. Falha na Compilação. Isto pois não se permite realizar operações com tipos diferentes.


Tipagem Estática

Já a "tipagem estática" obriga que se declare o tipo de uma variável no momento da criação, com esse tipo sendo verificado em tempo de compilação. Isso significa que o tipo da variável não pode mudar durante a execução do programa.

Acesse o código

public class Java_02_01_01 {
  public static void main(String[] args) {

    //Atribui-se o tipo inteiro
    int var_int = 5;
    int var_result;

    //Atribui-se o tipo string
    String var_string = "10";

    //Não é permitido alterar a variavel, ao mudar atribuição de String para Inteiro
    var_string = 10;

    //E não se pode realizar o calculo
    var_result = var_int + var_string

    System.out.println(var_result);
  }
}
Saída:

Ocorrem dois Erros de tipos incompatíveis. Um ao tentar armazenar um inteiro numa variavel String e outro ao tentar somar inteiro com string.


2.3 - Operadores

Duas maneiras de operar

Acesse o código

public class Java_03_00_00 {
  public static void main(String[] args) {
    double var_double = 10.0; //para permitir casas depois da virgula
    int var_int = 3;

    //Soma com variaveis
    System.out.println(var_int1 + var_int2);

    //Soma direta
    System.out.println(10 + 3);
  }
}
Saída:

13.0
13.0

Operadores Aritméticos

Acesse o código

public class Java_03_01_00 {
  public static void main(String[] args) {

    //Soma
    System.out.println(10.0 + 3);

    //Subtração
    System.out.println(10.0 - 3);

    //Multiplicação
    System.out.println(10.0 * 3);

    //Divisão, obtendo o divisor da divisão
    System.out.println(10.0 / 3);

    //Módulo, obtendo o resto da divisão
    System.out.println(10.0 % 3);

    //Exponenciação
    System.out.println(10.0 ** 3);
  }
}
Saída:

13.0
7.0
30.0
3.3333333333333335
1.0
1000.0

Operadores de Atribuição

Acesse o código

public class Java_03_02_00 {
  public static void main(String[] args) {
    double var_double = 10.0;

    //Soma
    System.out.println(var_double += 3);

    var_double = 10.0;
    //Subtração
    System.out.println(var_double -= 3);

    var_double = 10.0;
    //Multiplicação
    System.out.println(var_double *= 3);

    var_double = 10.0;
    //Divisão, obtendo o divisor da divisão
    System.out.println(var_double /= 3);

    var_double = 10.0;
    //Módulo, obtendo o resto da divisão
    System.out.println(var_double %= 3);
  }
}
Saída:

13.0
7.0
30.0
3.3333333333333335
1.0
1000.0

Operadores de Comparação

Acesse o código

public class Java_03_03_00 {
  public static void main(String[] args) {

    //Igual a
    System.out.println(10 == 3);

    //Diferente de
    System.out.println(10 != 3);

    //Menor que
    System.out.println(10 < 3);

    //Maior que
    System.out.println(10 > 3);

    //Menor ou igual a
    System.out.println(10 <= 3);

    //Maior ou igual a
    System.out.println(10 >= 3);
  }
}
Saída:

false
true
false
true
false
true

Operador de Incremento/Decremento

Acesse o código

public class Java_03_04_00 {
  public static void main(String[] args) {

    int var_int = 10;

    // Adiciona 1
    var_int++;
    System.out.println(var_int);

    var_int = 10;
    
    // Reduz 1
    var_int--;
    System.out.println(var_int);
  }
}
Saída:

11
9

Operadores Lógicos

Acesse o código

public class Java_03_05_00 {
  public static void main(String[] args) {
    //e
    System.out.println("true && true => " + (true && true));
    System.out.println("true && false => " + (true && false));
    System.out.println("false && true => " + (false && true));
    System.out.println("false && false => " + (false && false));

    //ou
    System.out.println("true || true => " + (true || true));
    System.out.println("true || false => " + (true || false));
    System.out.println("false || true => " + (false || true));
    System.out.println("false || false => " + (false || false));

    //não
    System.out.println("!true => " + (!true));
    System.out.println("!false => " + (!false));
  }
}
Saída:

true && true => true true && false => false false && true => false false && false => false true || true => true true || false => true false || true => true false || false => false !true => false !false => true


Operador Ternário

O operador ternário é uma maneira eficiente e concisa de lidar com expressões condicionais simples e pode ser útil para atribuir valores com base em uma única condição.

Estrutura:

condicao ? valor_se_verdadeiro : valor_se_falso

Acesse o código

public class Java_03_06_00 {
  public static void main(String[] args) {
    int var_int = 18;
    String var_string = (var_int >= 18) ? "Maior de idade" : "Menor de idade";
    System.out.println(var_string);
  }
}

Operadores Bit a Bit

Lógica básica

Acesse o código

public class Java_03_07_00 {
  public static void main(String[] args) {
    // e (Bit a Bit)
    System.out.println("10 & 3 => " + (10 & 3)); // 1010 (10) & 0011 (3) = 0010 (2)

    // ou (Bit a Bit)
    System.out.println("10 | 3 => " + (10 | 3)); // 1010 (10) | 0011 (3) = 1011 (11)

    // não (Bit a Bit) - Positivo
    System.out.println("~ 10 => " + (~ 10)); // 0 1010 (10) -> 1 0101 (-11)
    System.out.println("~ 3 => " + (~ 3)); // 0 0011 (3) -> 1 1100 (-4)

    // não (Bit a Bit) - Negativo
    System.out.println("~ -10 => " + (~ -10)); // 1 0110 (-10) -> 0 1001 (9)
    System.out.println("~ -3 => " + (~ -3)); // 1 1101 (-3) -> 0 0010 (2)
  }
}
Saída:

10 & 3 => 2
10 | 3 => 11
~ 10 => -11
~ 3 => -4
~ -10 => 9
~ -3 => 2


Deslocamento Bit a Bit (<< , >> e >>>)

Este operador é usado para operações de deslocamento de bits em números inteiros, a esquerda (<<), a direita apenas (>>) e a direita, junto com inserção de zeros equivalentes a esquerda (>>>).

Acesse o código

public class Java_03_07_01 {
  public static void main(String[] args) {

    int var_int1 = 2; // Exemplo para <<
    int var_int2 = -16; // Exemplo para >> e >>>
    int var_result1, var_result2, var_result3; // Os tres resultados

    // As operações
    var_result1 = var_int1 << 3;
    var_result2 = var_int2 >> 2;
    var_result3 = var_int2 >>> 2;

    // Para vermos o binário
    String var_string_bin1 = Integer.toBinaryString(var_int1);
    String var_string_bin2bin3 = Integer.toBinaryString(var_int2);
    String var_result_bin1 = Integer.toBinaryString(var_result1);
    String var_result_bin2 = Integer.toBinaryString(var_result2);
    String var_result_bin3 = Integer.toBinaryString(var_result3);

    // Printando na tela
    System.out.println("2 << 3 => " + var_result1 + ", Binário: " + var_string_bin1 + " << 3 => " + var_result_bin1);

    System.out.println("-16 >> 2 => " + var_result2 + ", Binário: " + var_string_bin2bin3 + " >> 2 => " + var_result_bin2);

    System.out.println("-16 >>> 2 => " + var_result3 + ", Binário: " + var_string_bin2bin3 + " >>> 2 => " + var_result_bin3);
  }
}
Saída:

2 << 3 => 16, Binário: 10 << 3 => 10000
-16 >> 2 => -4, Binário: 11111111111111111111111111110000 >> 2 => 11111111111111111111111111111100
-16 >>> 2 => 1073741820, Binário: 11111111111111111111111111110000 >>> 2 => 00111111111111111111111111111100

Ordem de Precedencia dos Operadores

Por fim, como vimos diferentes precedencias nos exemplos acima, aqui ficará claro a ordem geral dos operadores que foram apresentados anteriormente:

Acesse o código

//1 - Parenteses

//2 - Operadores unários (-, +, !, ~)

//3 - Operadores de exponenciação (**)

//4 - Operadores de multiplicação, divisão e módulo (*, /, %)

//5 - Operadores de adição e subtração (+, -)

//6 - Operadores de deslocamento (<<, >>)

//7 - Operadores de comparação (<, >, <=, >=, ==, !=, ===)

//8 - Operadores lógicos de alta precedencia (&&, ||, !)

//9 - Operadores lógicos de baixa precedencia (and, or, not)

//10 - Operadores de atribuição (=, +=, -=, *=, /=, %=, **=)

//11 - Operador de índice "[]" e acesso a propriedades "[] e {}"

2.4 - Conversão de Valores

Conversão de valores refere-se à transformação de um tipo de dado em outro. Isso é útil para adequar dados a contextos específicos, realizar operações com tipos compatíveis e garantir que as informações sejam processadas corretamente.

Elas podem ser implícitas (Casting Implícito), explícitas (Casting Explícito):

Acesse o código

public class Java_04_00_00 {
  public static void main(String[] args) {
    int var_int = 5;
    double var_double1 = 3.0;

    double var_result1 = var_int + var_double1; // Conversão implícita de int para double

    double var_double2 = 3.1415;
    int var_result2 = (int) var_double2; // Conversão explícita de double para int

    System.out.println(var_result1 + ", " + var_result2);


    Object var_object = "Turtle";
    String var_string = (String) var_object
  }
}
Saída:

8.0, 3

Converter valores para byte

Converter valores para short

Converter valores para Inteiro (int)

Acesse o código

public class Java_04_01_00 {
  public static void main(String[] args) {
    byte var_byte = 5;
    short var_short = 55;
    long var_long = 150500;
    float var_float = 1.5f;
    double var_double = 842.248;
    String var_string = "50";
    char var_char = 'A';
    boolean var_boolean = true;

    int var_int;

    var_int = var_byte;
    System.out.println("byte " + var_byte + " para int: " + var_int);

    var_int = var_short;
    System.out.println("short " + var_short + " para int: " + var_int);

    var_int = (int) var_long;
    System.out.println("long " + var_long + " para int: " + var_int);

    var_int = (int) var_float;
    System.out.println("float " + var_float + " para int: " + var_int);

    var_int = (int) var_double;
    System.out.println("double " + var_double + " para int: " + var_int);

    var_int = Integer.parseInt(var_string);
    System.out.println("String " + var_string + " para int: " + var_int);

    var_int = (int) var_char;
    System.out.println("char " + var_char + " para int: " + var_int);

    var_int = var_boolean ? 1 : 0;
    System.out.println("boolean " + var_boolean + " para int: " + var_int);

  }
}
Saída:

byte => 5 para int => 5 short => 55 para int => 55 long => 150500 para int => 150500 float => 1.5 para int => 1 double => 842.248 para int => 842 String => 50 para int => 50 char => A para int => 65 boolean => true para int => 1


Converter valores para long

Converter valores para float

Acesse o código

public class Java_04_02_00 {
  public static void main(String[] args) {
    
  }
}
Saída:

3.14


Converter valores para double

Converter valores para String

Acesse o código

#Passado um inteiro "1"
var_int = 1

#Usando metodo to_s para converter inteiro em string
var_result = 10 - var_int

#A soma é agora entre strings, alterando a função para juntar em vez de somar
puts var_result.to_s + " restantes"
Saída:

9 restantes


Converter valores para char

Converter valores para Array

Acesse o código

#Converte o objeto var_range em um array
var_range = 1..5
p var_array1 = var_range.to_a

#Converte o hash var_hash em um array
var_hash = {"nome" => "Jabuti", "idade" => 50}
p var_array2 = var_hash.to_a

#Converte cada algorismo do inteiro var_int em um array
var_int = 124816
p var_array3 = var_int.to_s.chars.map(&:to_i)
Saída:

[1, 2, 3, 4, 5]
[["nome", "Jabuti"], ["idade", 50]]
[1, 2, 4, 8, 1, 6]


2.5 - Formatação de texto

Concatenação

Acesse o código

var_string = "Jabuti"
var_int = 50

puts "Um " + var_string
puts "Um " + var_string + " pode viver mais do que " + var_int + " anos!"
Saída:

Um Jabuti
Um Jabuti pode viver mais do que 50 anos!


Interpolação

Maneira 1 - Simples

Acesse o código

var_string = "Jabuti"
var_int = 50

puts "Um #{var_string}"
puts "Um #{var_string} pode viver mais do que #{var_int} anos!"
Saída:

Um Jabuti
Um Jabuti pode viver mais do que 50 anos!


Maneira 2 - Com expressões

Acesse o código

var_string = "Jabuti"
var_int = 50

puts "Um #{var_string}"
puts "Um #{var_string} pode viver mais do que #{var_int} anos!"
puts "Já alguns poucos #{var_string}s pode viver mais do que #{var_int + 70} anos!"
Saída:

Um Jabuti
Um Jabuti pode viver mais do que 50 anos!
Já alguns poucos Jabutis podem viver mais do que 120 anos!


Maneira 3 - Com bloco

Acesse o código

var_array = ["Jabuti", "Cágado", "Tartaruga"]

puts "Um #{var_array}"
puts "Nomes: #{var_array.map{ |nome| nome.upcase }.join(", ")}"
Saída:

Um Jabuti
Um Jabuti pode viver mais do que 50 anos!
Já alguns poucos Jabutis podem viver mais do que 120 anos!


Formatação direta

Maneira 1

Acesse o código

var_string = "Jabuti"
var_int = 50

printf("Um %s", var_string)
printf("Um %s pode viver mais do que %d anos!", var_string, var_int)
Saída:

Um JabutiUm Jabuti pode viver mais do que 50 anos!


Maneira 2

Acesse o código

var_string = "Jabuti"
var_int = 50

puts "Um %s" % [var_string]
puts "Um %s pode viver mais do que %d anos!" % [var_string, var_int]
Saída:

Um Jabuti
Um Jabuti pode viver mais do que 50 anos!


2.6 - Funções básicas

Funções são blocos de código reutilizáveis que realizam uma tarefa específica. As funções são usadas para modularizar o código, tornando-o mais organizado, legível e fácil de manter, uma vez que permitem que partes do programa sejam isoladas e reutilizadas em diferentes partes do código, promovendo a eficiência e a reutilização de lógica.

Existem vários tipos de funções, onde neste primeiro momento, é apresentado de forma sucinta 3 das formas mais básicas, utilizando de 5 formas diferentes de expressar as mesmas.

Função sem Retorno

Acesse o código

#Usando métodos
def salutation(func_var_string)
  puts "Olá, #{func_var_string}!"
end

salutation("Mundo")

#Usando procs
salutation = Proc.new do |func_var_string| puts "Olá, #{func_var_string}!" end
salutation.call("Mundo")

#Usando procs (simplificado)
salutation = Proc.new {|func_var_string| puts "Olá, #{func_var_string}!"}
salutation.call("Mundo")

#Usando lambdas
salutation = lambda {|func_var_string| puts "Olá, #{func_var_string}!"}
salutation.call("Mundo")

#Usando funções anônimas (lambda simplificado)
salutation = -> (func_var_string) {puts "Olá, #{func_var_string}!"}
salutation.call("Mundo")
Saída (Igual a todos):

Olá, Mundo!


Função com Retorno

Acesse o código

#Usando métodos
def salutation(func_var_string1, func_var_string2)
  return func_var_string1 + func_var_string2
end

puts salutation("Olá, ", "Mundo!")

#Usando procs
salutation = Proc.new do |func_var_string1, func_var_string2| func_var_string1 + func_var_string2 end
puts salutation.call("Olá, ", "Mundo!")

#Usando procs (simplificado)
salutation = Proc.new {|func_var_string1, func_var_string2| func_var_string1 + func_var_string2}
puts salutation.call("Olá, ", "Mundo!")

#Usando lambdas
salutation = lambda {|func_var_string1, func_var_string2| func_var_string1 + func_var_string2}
puts salutation.call("Olá, ", "Mundo!")

#Usando funções anônimas (lambda simplificado)
salutation = -> (func_var_string1, func_var_string2) {func_var_string1 + func_var_string2}
puts salutation.call("Olá, ", "Mundo!")
Saída:

Olá, Mundo!


Função com Valores Padrão

Acesse o código

#Usando métodos
def salutation(func_var_string = "Mundo")
  puts "Olá, #{func_var_string}!"
end

salutation
salutation("Amigo")

#Usando procs
salutation = Proc.new do |func_var_string = "Mundo"| "Olá, #{func_var_string}!" end
puts salutation.call
puts salutation.call("Amigo")

#Usando procs (simplificado)
salutation = Proc.new {|func_var_string = "Mundo"| "Olá, #{func_var_string}!"}
puts salutation.call
puts salutation.call("Amigo")

#Usando lambdas
salutation = lambda {|func_var_string = "Mundo"| "Olá, #{func_var_string}!"}
puts salutation.call
puts salutation.call("Amigo")

#Usando funções anônimas (lambda simplificado)
salutation = -> (func_var_string = "Mundo") {"Olá, #{func_var_string}!"}
puts salutation.call
puts salutation.call("Amigo")
Saída:

Olá, Mundo!
Olá, Amigo!


Conclusão