Palavra-chave protected em Java

A palavra-chave protected em Java é um modificador de acesso que fornece um nível de visibilidade intermediário entre private e public. Ela é usada para permitir que membros (variáveis, métodos e construtores) de uma classe sejam acessados dentro do mesmo pacote e também por subclasses, mesmo que estejam em pacotes diferentes.

Sintaxe:

class MinhaClasse {
protected int numero; // Variável protegida

protected void metodoProtegido() { // Método protegido
System.out.println("Este é um método protegido.");
}
}

Exemplo:

class Animal {
protected String nome;

// Construtor protegido
protected Animal(String nome) {
this.nome = nome;
}

// Método protegido
protected void fazerSom() {
System.out.println(nome + " está fazendo um som.");
}
}

class Cachorro extends Animal {
public Cachorro(String nome) {
super(nome); // Acessando o construtor protegido da classe pai
}

public void latir() {
System.out.println(nome + " está latindo.");
}
}

public class Main {
public static void main(String[] args) {
Cachorro cachorro = new Cachorro("Rex");
cachorro.fazerSom(); // Acessando o método protegido da classe pai
cachorro.latir();
}
}

Regras de visibilidade de protected:

  1. Dentro do mesmo pacote:
    • Membros protected são acessíveis por qualquer classe dentro do mesmo pacote.
  2. Acesso por subclasses:
    • Subclasses, mesmo que em pacotes diferentes, podem acessar membros protected da classe pai.
  3. Fora do pacote:
    • Membros protected não são acessíveis por classes que não são subclasses e que estão fora do pacote da classe original.

Características da palavra-chave protected:

  • Visibilidade no mesmo pacote: Permite acesso completo aos membros protected por todas as classes dentro do mesmo pacote.
  • Herança: Subclasses de uma classe protected podem acessar seus membros, mesmo estando em pacotes diferentes.
  • Não acessível diretamente fora do pacote: Qualquer classe fora do pacote da classe pai não pode acessar diretamente membros protected, a menos que seja uma subclasse.

Comparação com outros modificadores de acesso:

ModificadorDentro da ClasseDentro do PacoteEm SubclassesFora do Pacote
privateSimNãoNãoNão
defaultSimSimNãoNão
protectedSimSimSimNão*
publicSimSimSimSim

*Subclasses podem acessar membros protected mesmo estando em pacotes diferentes.

Vantagens de usar protected:

  • Herança controlada: protected é útil para permitir que subclasses acessem membros da classe pai, mantendo uma separação entre as classes externas.
  • Encapsulamento parcial: Membros protected são acessíveis dentro de um pacote, mas seu acesso é restrito fora dele, exceto para subclasses.

Exemplo de subclasses acessando membros protected:

class Veiculo {
protected int velocidade;

protected void acelerar() {
velocidade += 10;
System.out.println("Velocidade: " + velocidade + " km/h");
}
}

class Carro extends Veiculo {
public void acelerarMais() {
acelerar(); // Acessando método protegido da classe Veiculo
}
}

public class Main {
public static void main(String[] args) {
Carro carro = new Carro();
carro.acelerarMais(); // Acessando método de Carro que usa método protegido
}
}

Resumo:

  • A palavra-chave protected permite que membros de uma classe sejam acessados por outras classes no mesmo pacote e por subclasses em pacotes diferentes.
  • É um modificador de acesso intermediário, oferecendo mais flexibilidade que private e menos exposição que public.