Curso de Curso de Java | Fundamentos da Linguagem + Programação Orientada Objetos
Categorias
Fundamentos da Linguagem + Programação Orientada Objetos
Informações do Curso
Carga Horária
2h
Nota Mínima para Aprovação
60%
O Java continua sendo uma das linguagens mais populares mais utilizadas no mercado de hoje em dia, podendo ser usada em uma em várias aplicações, desde sistemas corporativos até soluções modernas em microserviços e computação em nuvem. Se você já programa e quer iniciar sua jornada no universo do Java, este curso é para você! Nesse curso de programação Java para iniciantes nós vamos explorar os conceitos fundamentais da linguagem de forma clara e prática, te ajudando a dar os primeiros passos e avançar para o próximo nível na programação. Aproveite esse curso de Java para fortalecer suas habilidades e expandir seu conhecimento de conceitos como Programação Orientada Objetos, JVM e JDK! Esse vídeo tem tudo que você precisa para aprender Java.
Faça login e adquira créditos para se inscrever e fazer a prova
Material complementar
Curso de Java | Fundamentos da Linguagem + Programação Orientada a Objetos
Antes de colocar a mão no código, vale entender quatro características que definem o Java, porque elas influenciam diretamente a forma como a gente pensa ao escrever um programa:
- Orientada a objetos, toda a sintaxe gira em torno de classes e objetos. Diferente de linguagens multiparadigma como JavaScript (que permite procedural, funcional ou OO), o Java te força a seguir esse paradigma.
- Fortemente tipada, toda variável, parâmetro e retorno tem um tipo declarado, e esse tipo não muda ao longo da execução. Em JavaScript você pode reatribuir uma string com um número; em Java isso é erro de compilação.
- Independente de plataforma, um mesmo código compilado roda em diferentes sistemas operacionais e arquiteturas ("write once, run anywhere"), algo que o Java foi um dos precursores em popularizar.
- Compilada e interpretada ao mesmo tempo, você compila o
.javapara bytecode (.class), e a JVM interpreta esse bytecode em tempo de execução.
javac Main.java # compila para bytecode (.class)
java Main # executa o bytecode na JVM
JVM, JDK e bytecode
A JVM (Java Virtual Machine) é o ambiente de execução: ela interpreta o bytecode (o "código de máquina da JVM"), converte para as instruções do sistema operacional/hardware onde está rodando, e ainda faz o gerenciamento de memória, a coleta de lixo e o isolamento/segurança do programa. É a JVM que torna o Java independente de plataforma. Diferente do C, que é compilado direto para código de máquina e só roda na arquitetura para a qual foi compilado.
Para executar Java você precisa da JVM. Mas para desenvolver e compilar, você precisa do JDK (Java Development Kit), que inclui o compilador (javac) e ferramentas de build, além da própria JVM. Só a JVM não te deixa compilar.
Estrutura básica
Todo arquivo .java precisa declarar pelo menos uma classe, e a classe principal (pública) tem que ter o mesmo nome do arquivo. Você pode ter outras classes no mesmo arquivo, mas só uma pode ser public, e é ela que dá nome ao arquivo (parecido com o export default do JavaScript).
// arquivo: Main.java
public class Main {
public static void main(String[] args) {
System.out.println("Olá, mundo!");
}
}
O método public static void main(String[] args) é o ponto de entrada do programa: é o primeiro método que a JVM aciona ao executar. Ele se chama main por convenção (não por causa do nome da classe). Tudo que não for acionado a partir dele não roda.
Declaração de variáveis
Uma variável é um espaço na memória para guardar um valor. Existem duas formas de declarar no Java:
// 1) explícita: tipo + nome + valor
int idade = 20;
idade = 21; // pode atualizar o valor, mas NUNCA o tipo
// 2) var: o Java infere o tipo a partir do valor (só em escopo local)
var nome = "Fernanda"; // inferido como String
Tipos primitivos
Java tem 8 tipos primitivos (guardam o valor diretamente). 4 deles são para números inteiros e a única diferença entre eles é a faixa de representação, ou seja, quanta memória ocupam:
| Tipo | Bits | Faixa aproximada |
|---|---|---|
byte | 8 | -128 a 127 |
short | 16 | -32.768 a 32.767 |
int | 32 | ~ -2,1 bi a 2,1 bi |
long | 64 | enorme (números muito grandes) |
byte pequeno = 100;
int idade = 25; // o mais usado no dia a dia
long grande = 10_000_000L; // long precisa do sufixo L
double preco = 19.90; // ponto flutuante, dupla precisão
float taxa = 5.5f; // float precisa do sufixo f (precisão simples)
char letra = 'A'; // UM caractere, aspas SIMPLES
boolean ativo = true;
Condicionais e laços
A sintaxe é em inglês e parecida com a de outras linguagens: if ("se"), else ("senão") e else if ("senão se"). A condição vai entre parênteses e deve resultar em um booleano.
if (idade > 99) {
System.out.println("maior");
} else if (idade == 99) {
System.out.println("igual");
} else {
System.out.println("menor");
}
// comparar Strings é com .equals(), não com ==
if (nome.equals("Fernanda")) { /* ... */ }
if (nome.isBlank()) { /* string vazia */ }
Para repetições, os dois laços principais são o for e o while:
// for clássico: variável de iteração, condição de parada, incremento
for (int i = 0; i < nomes.size(); i++) {
System.out.println(nomes.get(i));
}
// while: executa enquanto a condição for verdadeira
int contador = 0;
while (contador < 10) {
System.out.println("estou no while");
contador++; // ATENÇÃO: se esquecer de atualizar, vira loop infinito!
}
// for-each (enhanced for): itera direto sobre os elementos
for (String nome : nomes) {
System.out.println(nome);
}
Vetores (arrays) x ArrayList
Um vetor (array) armazena uma coleção de valores do mesmo tipo, mas tem tamanho fixo: você define o tamanho na criação e não pode mudar. Os índices começam em zero.
int[] numeros = {1, 2, 3, 4, 5}; // inicialização direta
System.out.println(numeros[0]); // 1 (primeira posição = índice 0)
System.out.println(numeros.length); // tamanho do array
int[] outros = new int[5]; // vazio, mas com tamanho 5 fixo
outros[5] = 6; // ERRO: ArrayIndexOutOfBoundsException
Quando você não sabe quantos elementos vão aparecer (entrada do usuário, banco de dados...), o array fixo é um problema. Para uma lista dinâmica que cresce e diminui, usamos o ArrayList, uma classe da biblioteca padrão java.util:
import java.util.ArrayList;
ArrayList<String> nomes = new ArrayList<>();
nomes.add("Fernanda"); // adiciona
nomes.add("Léo");
System.out.println(nomes.get(0)); // acessa por get(índice)
nomes.remove(0); // remove por índice (ou pelo objeto)
System.out.println(nomes.size()); // tamanho (size, não length!)
Casting (conversão de tipos)
Casting é converter um valor de um tipo para outro. Como o tipo de uma variável não muda, na prática você cria uma variável nova com o valor convertido. Há dois casos:
// CASTING IMPLÍCITO: automático, quando "cabe" (int -> double)
int idade1 = 22;
double idade2 = idade1; // o Java só aumenta a faixa de representação
// CASTING EXPLÍCITO: você avisa que aceita "perder" representação
double resultado = 22.50;
int inteiro = (int) resultado; // vira 22 (corta o que vem após a vírgula)
Quando a conversão não é só ampliar/cortar a faixa (ex.: String ↔ número), usamos métodos auxiliares das classes:
int n = Integer.parseInt("10"); // String -> int
String s = String.valueOf(10); // int -> String
String texto = String.valueOf('A'); // char -> String
char c = "Java".charAt(0); // String -> char
Programação Orientada a Objetos (POO)
A POO organiza o código em torno de objetos, que combinam dados (atributos, as variáveis da classe) e comportamento (métodos, as funções da classe). Uma classe é o molde que define a estrutura; o objeto é a instância criada com new.
public class Carro {
private String modelo; // atributo
public void acelerar() { // método
System.out.println("acelerando o carro " + this.modelo);
}
}
Carro meuCarro = new Carro(); // instância (objeto) do tipo Carro
meuCarro.acelerar();
static: pertence à classe, não à instância
Um membro static pertence à classe em si, não aos objetos criados a partir dela. Por isso o main é static: a JVM o chama sem precisar instanciar a classe. Um método static não consegue acessar atributos de instância (só outros membros static).
public class Main {
String nome; // atributo de instância
static String titulo; // atributo de classe (compartilhado)
public static void main(String[] args) {
// System.out.println(nome); // ERRO: nome não é estático
System.out.println(titulo); // ok
}
}
Os 4 pilares da POO
1. Encapsulamento
Esconder os detalhes internos e expor apenas o necessário. Atributos ficam private e o acesso é feito por métodos (getters/setters), o que protege o estado do objeto.
public class Pessoa {
private String nome;
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
}
2. Herança
Uma classe (subclasse) pode herdar atributos e métodos não privados de outra (superclasse) com extends, reaproveitando código. A relação é "é um tipo de": uma Pessoa é um Ser, mas nem todo Ser é uma Pessoa.
public class Ser {
protected String nome;
protected int idade;
public Ser(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}
}
public class Pessoa extends Ser {
private String sobrenome;
public Pessoa(String nome, int idade, String sobrenome) {
super(nome, idade); // chama o construtor da superclasse
this.sobrenome = sobrenome;
}
}
3. Polimorfismo
Objetos de classes diferentes respondem à mesma mensagem de formas diferentes. Conseguimos isso sobrescrevendo métodos da superclasse com @Override.
public class Ser {
public String saudacao() { return ""; }
}
public class Cachorro extends Ser {
@Override
public String saudacao() { return "au au"; }
}
public class Pessoa extends Ser {
@Override
public String saudacao() { return "Olá, meu nome é " + this.nome; }
}
Ser animal = new Cachorro();
System.out.println(animal.saudacao()); // "au au"
animal = new Pessoa("Fernanda", 30, "Kipper");
System.out.println(animal.saudacao()); // "Olá, meu nome é Fernanda" - decidido em tempo de execução
4. Abstração Expor o que um objeto faz, escondendo como ele faz. Conseguimos com classes abstratas e interfaces.
// interface: um contrato. Só ASSINATURAS de métodos, sem implementação.
public interface Carro {
void acelerar();
void frear();
void parar();
}
public class Fusca implements Carro {
@Override public void acelerar() { System.out.println("acelerando"); }
@Override public void frear() { System.out.println("freando"); }
@Override public void parar() { System.out.println("parado"); }
}
Classe abstrata x Interface
- Classe abstrata (
abstract): pode ter métodos com e sem implementação e atributos de estado. Uma classe só pode estender uma classe abstrata. Use quando há uma relação "é um tipo de". - Interface: define um contrato (o quê), e uma classe pode implementar várias interfaces. Use para definir capacidades ("é capaz de").
Construtores
São métodos especiais, com o mesmo nome da classe, chamados automaticamente quando um objeto é criado (new), usados para inicializar o estado. Você pode ter vários construtores com parâmetros diferentes (overload), permitindo criar o objeto de formas distintas.
public class Produto {
private String nome;
private double preco;
public Produto(String nome) { // só com nome
this.nome = nome;
}
public Produto(String nome, double preco) { // nome e preço
this.nome = nome;
this.preco = preco;
}
}
Produto p1 = new Produto("Café");
Produto p2 = new Produto("Café", 25.0);
Modificadores de acesso e pacotes
Os modificadores de acesso controlam a visibilidade de classes, atributos e métodos. Para entendê-los, é preciso entender pacotes (package): eles agrupam classes em namespaces lógicos e respeitam a estrutura de diretórios (uma classe no pacote util.redes precisa estar na pasta util/redes).
package javacurso; // declarado no topo do arquivo, espelha a pasta
| Modificador | Visível em |
|---|---|
public | qualquer lugar |
protected | mesmo pacote + subclasses |
| (padrão / default) | apenas no mesmo pacote |
private | apenas na própria classe |
Resumo
- Java é orientada a objetos, fortemente tipada, independente de plataforma e compila para bytecode que roda na JVM.
- JDK = ferramentas de desenvolvimento + compilador (
javac) + JVM; só a JVM executa, mas não compila. - 8 tipos primitivos; os 4 inteiros (
byte/short/int/long) diferem só na faixa de representação (memória).Stringé classe, não primitivo. varinfere o tipo pelo valor (só em escopo local, exige atribuição imediata).- Array tem tamanho fixo (
.length,[]); ArrayList é lista dinâmica (.add/.get/.size). - Casting pode ser implícito (automático) ou explícito (
(int) x,Integer.parseInt,String.valueOf). - POO: classe é o molde, objeto é a instância;
staticpertence à classe. - Pilares: encapsulamento, herança (
extends/super), polimorfismo (@Override), abstração (interfaces/classes abstratas). - Construtores inicializam o objeto e podem ser sobrecarregados; modificadores de acesso + pacotes controlam a visibilidade.
Sobre este Curso Gratuito de Curso de Java | Fundamentos da Linguagem + Programação Orientada Objetos
Este curso de Curso de Java | Fundamentos da Linguagem + Programação Orientada Objetos é oferecido gratuitamente pela Kipper Dev, fundada por Fernanda Kipper. O objetivo é democratizar o acesso ao conhecimento de programação e desenvolvimento, permitindo que qualquer pessoa aprenda sem custos.
Após assistir ao curso completo no YouTube, você pode validar seu conhecimento através de uma prova rigorosa. Ao ser aprovado com nota mínima de 60%, você receberá um certificado válido que pode ser usado como horas complementares em universidades brasileiras.
O certificado é emitido pela KipperDev Marketing e Treinamentos e possui uma chave de validação única que permite verificar sua autenticidade a qualquer momento.