1
resposta

Conteúdo errado

No exemplo do modificador "private" está mostrando o código sendo alterado pela classe Pricipal, sem usar o get. O exemplo do modificador default não deu para enteder poque os códigos estão parecidos com todos

1 resposta

Olá, Luis. Como vai?

Excelente observação! É muito comum surgir essa dúvida no início dos estudos de Orientação a Objetos em Java, pois a diferença entre os modificadores de acesso pode parecer sutil nos exemplos de código.

Vamos alinhar esses conceitos diretamente para corrigir qualquer mal-entendido e deixar clara a diferença prática de cada um.


O Modificador private

Você tem toda razão em estranhar: se uma classe Principal conseguiu alterar um atributo diretamente sem usar um método set ou get, esse atributo não estava protegido pelo modificador private naquele momento, ou as duas classes estavam estruturadas de uma forma que quebrou o conceito de encapsulamento.

A regra absoluta do Java é: quando declaramos um atributo como private, nenhuma outra classe (incluindo a Principal) consegue acessá-lo ou modificá-lo diretamente usando o operador ponto (ex: objeto.atributo = valor;). O acesso só é permitido de dentro da própria classe onde o atributo foi criado. Para interagir com ele de fora, somos obrigados a usar os métodos públicos get e set.


O Modificador default (Padrão ou Pacote)

O modificador default (que você não digita palavra nenhuma, apenas deixa sem public ou private) é muito parecido com os outros se todas as suas classes estiverem dentro da mesma pasta (package).

A diferença do default só aparece de verdade quando o seu projeto começa a crescer e você divide seus códigos em pastas diferentes.

Para entender de forma simples e definitiva:

  • public: Libera o acesso para qualquer classe de qualquer pasta do projeto.
  • default (padrão): Libera o acesso apenas para as classes que estão na mesma pasta (package). Se uma classe estiver em outra pasta, ela não consegue enxergar o atributo.
  • private: Bloqueia o acesso para todo mundo de fora. Só a própria classe pode mexer.

Exemplo Prático:

Imagine que você tem duas pastas no seu projeto Java: br.com.alura.cinema e br.com.alura.autenticacao.

package br.com.alura.cinema;

public class Filme {
    public string nomePublico;
    string nomeDefault; // Sem modificador escrito
    private string nomePrivate;
}

Se a sua classe Principal estiver na pasta br.com.alura.cinema (mesma pasta de Filme), ela conseguirá acessar o nomePublico e o nomeDefault, mas não o nomePrivate.

Agora, se a classe Principal for movida para a pasta br.com.alura.autenticacao, ela só conseguirá acessar o nomePublico. O nomeDefault ficará bloqueado porque mudou de pasta, e o nomePrivate continuará bloqueado porque é de uso exclusivo da classe Filme.

Espero que possa ter lhe ajudado!