Classes e Objetos

Programação Orientada a Objetos (OOP) é fundamental para Java. Esta lição cobre o básico de classes e objetos.

O que é Programação Orientada a Objetos

OOP é um paradigma de programação que agrupa dados e métodos que operam nesses dados juntos.

OOP vs Programação Procedural

Característica Procedural Orientada a Objetos
Estilo de pensamento Execução passo a passo Organizar por objetos
Estrutura de código Funções Classes e objetos
Melhor para Tarefas simples Sistemas complexos

Definindo uma Classe

Uma classe é um template para objetos, definindo seus atributos e métodos.

Sintaxe

JAVA
public class NomeDaClasse {
    // Atributos (variáveis de membro)
    tipoDado nomeAtributo;
    
    // Métodos (métodos de membro)
    tipoRetorno nomeMetodo(listaParâmetros) {
        // Corpo do método
    }
}

Exemplo: Definir uma Classe Student

JAVA
public class Student {
    // Atributos
    String name;
    int age;
    double score;
    
    // Métodos
    public void study() {
        System.out.println(name + " está estudando");
    }
    
    public void showInfo() {
        System.out.println("Nome: " + name + ", Idade: " + age + ", Pontuação: " + score);
    }
}
▶ Experimente

Criando Objetos

Use a palavra-chave new para criar objetos.

Sintaxe

JAVA
NomeDaClasse nomeObjeto = new NomeDaClasse();

Exemplo: Criar e Usar Objetos

JAVA
public class StudentTest {
    public static void main(String[] args) {
        // Criar objeto
        Student stu1 = new Student();
        
        // Definir atributos
        stu1.name = "Alice";
        stu1.age = 20;
        stu1.score = 95.5;
        
        // Chamar métodos
        stu1.study();      // Alice está estudando
        stu1.showInfo();   // Nome: Alice, Idade: 20, Pontuação: 95.5
        
        // Criar outro objeto
        Student stu2 = new Student();
        stu2.name = "Bob";
        stu2.age = 22;
        stu2.score = 88.0;
        
        stu2.study();      // Bob está estudando
        stu2.showInfo();   // Nome: Bob, Idade: 22, Pontuação: 88.0
    }
}
▶ Experimente

Construtores

Construtores são usados para inicializar atributos ao criar objetos.

Características

Característica Descrição
Mesmo nome que a classe Obrigatório
Sem tipo de retorno Nem mesmo void
Chamado automaticamente com new Não precisa chamar manualmente
Pode ser sobrecarregado Múltiplos construtores

Construtor Sem Argumentos

JAVA
public class Student {
    String name;
    int age;
    
    // Construtor sem argumentos
    public Student() {
        System.out.println("Objeto Student criado");
    }
}

Construtor Parametrizado

JAVA
public class Student {
    String name;
    int age;
    
    // Construtor parametrizado
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Exemplo: Construtores

JAVA
public class Student {
    String name;
    int age;
    double score;
    
    // Construtor sem argumentos
    public Student() {
        this.name = "Desconhecido";
        this.age = 0;
        this.score = 0;
    }
    
    // Construtor parametrizado
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // Construtor completo
    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
    
    public void showInfo() {
        System.out.println("Nome: " + name + ", Idade: " + age + ", Pontuação: " + score);
    }
}

public class ConstructorDemo {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.showInfo();  // Nome: Desconhecido, Idade: 0, Pontuação: 0
        
        Student s2 = new Student("Alice", 20);
        s2.showInfo();  // Nome: Alice, Idade: 20, Pontuação: 0.0
        
        Student s3 = new Student("Bob", 22, 95.5);
        s3.showInfo();  // Nome: Bob, Idade: 22, Pontuação: 95.5
    }
}
▶ Experimente
⚠️ Nota: Se nenhum construtor for definido, Java fornece automaticamente um construtor sem argumentos. Se você definir um construtor parametrizado, o construtor sem argumentos não é fornecido automaticamente.

A Palavra-chave this

this é uma referência ao objeto atual.

Uso 1: Distinguir Variáveis de Membro de Variáveis Locais

JAVA
public class Student {
    String name;
    
    public void setName(String name) {
        this.name = name;  // this.name é a variável de membro, name é o parâmetro
    }
}

Uso 2: Chamar Outros Construtores

JAVA
public class Student {
    String name;
    int age;
    
    public Student() {
        this("Desconhecido", 0);  // Chamar construtor parametrizado
    }
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Exemplo: Usando this

JAVA
public class Point {
    int x, y;
    
    public Point() {
        this(0, 0);
    }
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public void move(int x, int y) {
        this.x += x;
        this.y += y;
    }
    
    public void show() {
        System.out.println("Ponto: (" + x + ", " + y + ")");
    }
    
    public static void main(String[] args) {
        Point p = new Point(3, 5);
        p.show();       // Ponto: (3, 5)
        p.move(2, -1);
        p.show();       // Ponto: (5, 4)
    }
}
▶ Experimente

Modelo de Memória de Objetos

Alocação de Memória

JAVA
Student stu = new Student("Alice", 20);

Exemplo: Múltiplas Referências ao Mesmo Objeto

JAVA
public class MemoryDemo {
    public static void main(String[] args) {
        Student s1 = new Student("Alice", 20);
        Student s2 = s1;  // s2 e s1 apontam para o mesmo objeto
        
        System.out.println(s1.name);  // Alice
        System.out.println(s2.name);  // Alice
        
        s2.name = "Bob";
        
        System.out.println(s1.name);  // Bob (s1 também é modificado)
        System.out.println(s2.name);  // Bob
    }
}
▶ Experimente

Múltiplos Objetos

JAVA
public class MultiObject {
    public static void main(String[] args) {
        // Criar múltiplos objetos
        Student[] students = new Student[3];
        
        students[0] = new Student("Alice", 20);
        students[1] = new Student("Bob", 22);
        students[2] = new Student("Charlie", 21);
        
        // Percorrer
        for (Student s : students) {
            s.showInfo();
        }
    }
}

Objetos como Parâmetros de Método

JAVA
public class StudentUtil {
    // Objeto como parâmetro
    public static void printStudent(Student stu) {
        System.out.println(stu.name + " - " + stu.age);
    }
    
    // Retornar objeto
    public static Student createStudent(String name, int age) {
        return new Student(name, age);
    }
    
    public static void main(String[] args) {
        Student alice = new Student("Alice", 20);
        printStudent(alice);  // Alice - 20
        
        Student bob = createStudent("Bob", 22);
        bob.showInfo();
    }
}

❓ Perguntas Frequentes

P: Qual é a diferença entre classe e objeto? R: Uma classe é um template. Um objeto é uma instância. A classe define a estrutura de atributos e métodos. Um objeto é uma instância concreta.

P: Um construtor pode ter um valor de retorno? R: Não. Construtores não têm tipo de retorno—nem mesmo void.

P: this pode ser omitido? R: Sim, quando variáveis de membro e variáveis locais não compartilham o mesmo nome. Mas adicionar this torna o código mais claro.

📖 Resumo

📝 Exercícios

  1. Classe Rectangle: Defina uma classe retângulo com atributos de comprimento e largura, e métodos para calcular área e perímetro
  2. Classe BankAccount: Defina uma classe de conta bancária com métodos para depositar, sacar e verificar saldo
  3. Array de objetos: Crie 5 objetos student e encontre o que tem a maior pontuação

Próxima Lição

Na próxima lição, aprenderemos sobre Encapsulamento — como proteger dados de objetos.

100%