[OCPJP6] 005 – Declarações e controle de acesso

Controles de acesso em métodos e variáveis

Um pouco diferente das classes, os métodos e variáveis podem ser declarados como:

  • public
  • private
  • default (lembrando que default é oculto)
  • protected

Segue abaixo um pouco de cada controlador de acesso.

public

Quando um método ou variável é declarado como public, significa que todas as classes que a enxergam (independente do caminho do pacote) podem acessar. Vejamos 3 diferentes formas de acessar:

  • A partir de um método declarado na mesma classe.
  • A partir de um método usando uma referência da classe.
  • A partir de um método herdado.

private

Quando um método ou variável é declarado como private, significa que apenas a classe que a declarou pode acessar. Más, é importante lembrar que as variáveis podem ser alteradas por outros métodos public (ex: setters).

Brincando um pouco com private 🙂

Dentro de uma classe “A” existe um método private com o nome de fazAlgumaCoisa(), e uma outra classe “B” estende (extends) a classe “A”, e essa classe também tem um método fazAlgumaCoisa().

 – A classe “B” vai compilar?

Esse método sobrescreveu o método da classe “A”? (resposta no final)

default

Quando declaramos os métodos ou as variáveis como default, significa que apenas a classe que a declarou + as classes do mesmo pacote podem acessar.

 protected

Esse controle de acesso… esse sim (muahahahahaha)… esse tem muitas pegadinhas.

A primeira vista é simples =) Só acessam os métodos e variáveis protected as classes que estão no mesmo pacote ou através de herança.

Brincando um pouco mais =)

Agora com alguns exemplos:

package certificacao;
// A super classe (Generelização)
public class Fruta {
    private String nome;
    protected String getNome() { return nome; }
    protected void setNome(String nome) { this.nome = nome; }
}
package certificacao.citrica;
import certificacao.Fruta;
// Classe específica
public class FrutaCitrica extends Fruta {
    private String vitaminaC;
    String getVitaminaC() { return vitaminaC; }

    @Override
    public String toString() {
        // Acessando um método protected
        return super.getNome();
    }
}
package certificacao.citrica.plus;
import certificacao.citrica.FrutaCitrica;
// Classe mais específica
public class FrutaCitricaPlus extends FrutaCitrica {
    private String[] arrayVitaminaC;
    public String[] getArrayVitaminaC() { return arrayVitaminaC; }

    public String getFirstVitaminaC() {
        // NÃO COMPILA, o método getVitaminaC() tem um
        // controlador default e está em um pacote diferente.
        return super.getVitaminaC();
    }
}

Um plus no assunto =)

Será que podemos modificar o nível do controle de acesso de um método em herança, sobrescrevendo-o?

– Sim, mas apenas pode aumentando o nível do controle de acesso.

 E agora a resposta da brincadeirinha com private =)

Sim, o código irá compilar!

É possível criar um método com o mesmo nome do método private da classe “A” que não irá sobrescrever, porque a classe “B” nem sabe que existe o método fazAlgumaCoisa() da classe “A”.

Comentem, estendam o assunto… Compartilhem =)