Sobes.tech
Junior

Quais são os tipos de classes em Java?

sobes.tech IA

Resposta da IA

Em Java, existem os seguintes tipos principais de classes:

  1. Classe padrão (Standard Class)

    • Pode conter campos, métodos, construtores.
    • Pode ser herdada por outras classes, se não for declarada como final.
    • Pode implementar interfaces.
    • Declarada com modificadores de acesso (public, protected, default, private).
  2. Classe abstrata (Abstract Class)

    • Declarada com a palavra-chave abstract.
    • Não pode ser instanciada diretamente.
    • Pode conter métodos abstratos (sem implementação) e métodos normais.
    • Destinada a ser herdada; as subclasses devem fornecer a implementação dos métodos abstratos.
    // Classe abstrata para uma figura
    abstract class Shape {
        abstract double area(); // Método abstrato para calcular a área
    
        void display() { // Método normal
            System.out.println("This is a shape.");
        }
    }
    
  3. Classe final (Final Class)

    • Declarada com a palavra-chave final.
    • Não pode ser herdada por outras classes.
    • Usada para prevenir a extensão da classe, garantir a segurança ou a imutabilidade da implementação.
    // Classe final que não pode ser herdada
    final class ImmutableString {
        private final String value;
    
        public ImmutableString(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    }
    
  4. Enumerações (Enum)

    • Um tipo especial de classe, destinado a representar um conjunto fixo de constantes.
    • Declarado com a palavra-chave enum.
    • As constantes da enumeração são public static final por padrão.
    • Pode ter campos, métodos e construtores (com modificador private).
    // Enum para os dias da semana
    enum DayOfWeek {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }
    
  5. Classes anônimas (Anonymous Class)

    • Classe sem nome, criada e instanciada ao mesmo tempo.
    • Geralmente usadas para implementar interfaces ou estender classes "on the fly", quando é necessária uma única utilização.
    • Não podem ter construtores explícitos.
    // Criando uma classe anônima que implementa Runnable
    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println("Running in an anonymous class.");
        }
    };
    
  6. Classes internas (Nested Class)

    • Classes declaradas dentro de outra classe.
    • Existem dois tipos:
      • Classes internas estáticas (Static Nested Class): declaradas com static. Não têm acesso direto aos membros não estáticos da classe exterior. São instanciadas como classes normais.
      • Classes internas (Inner Class): não são declaradas como static. Têm acesso a todos os membros da classe exterior, incluindo private. Requerem uma instância da classe exterior para criar sua instância.
    // Classe exterior
    class OuterClass {
        private String outerField = "Outer";
    
        // Classe interna estática
        static class StaticNestedClass {
            void display() {
                System.out.println("Inside StaticNestedClass.");
                // Sem acesso direto a outerField
            }
        }
    
        // Classe interna
        class InnerClass {
            void display() {
                System.out.println("Inside InnerClass. outerField: " + outerField); // Acesso a outerField
            }
        }
    }
    
  7. Clases record (Record - desde Java 14)

    • Declaradas com a palavra-chave record.
    • Destinadas a armazenar dados. O compilador gera automaticamente o construtor, métodos de acesso aos campos (accessor methods), equals(), hashCode() e toString().
    • Os campos do record são implicitamente final.
    // Record para representar um ponto em um espaço 2D
    record Point(int x, int y) {
        // O compilador gerará o construtor, métodos x(), y(), equals(), hashCode(), toString()
    }