Qual é a diferença entre métodos public, protected, private e “default” no Java?

Dúvida de um pessoal aqui, que vou tentar (eu disse “tentar” 😛 ) explicar.

No Java, existem quatro tipos de “permissões” de acesso a métodos (isso também vale para classes e propriedades, com algumas exceções ) que, dependendo de sua escolha, parte do seu código-fonte vai ou não “enxerga-la” durante a execução/compilação deste. São elas:

public : A mais fácil de explicar, pois todo código tem acesso a ela! 🙂
Exemplo:

Arquivo: Util.java

package teste.util;
_
_

public class Util {

           public void nothing() {
                    System.out.printf(“Estou fazendo %s\n”,“Nada”);
           }
}

Arquivo: Main.java

package teste.main;
_
_ import teste.util.Util;
_
_ public class Main {
           public static void main(String args) {
                      Util util = new Util();
                      util.nothing();
           }
}

private : A mais restrita das quatro, onde somente a classe que a declarou tem acesso:

Arquivo: Util.java

package teste.util;
_
_ public class Util {
            //Este método é chamado somente dentro desta classe
           private void privateNothing() {
                    System.out.printf(“Estou fazendo %s\n”,“Nada”);
           }
_
_            public void publicNothing() {
                    System.out.println(“Será que chamo?”);
                    this.privateNothing();
           }
}

Arquivo: Main.java

package teste.main;
_
_ import teste.util.Util;
_
_ public class Main {
           public static void main(String args) {
                      Util util = new Util();
                      //util.privateNothing(); //NÃO FUNCIONA
                      util.publicNothing();
           }
}

(Até aqui, foi bem simples explicar. Mas a partir de agora que vem o problema :P)

protected : Este “acesso” é meio estranho, mas vamos lá: a classe que declarou, as classes que estão no mesmo pacote e a classe que herdou desta, tem acesso a ela.
Putz Confuso não? Melhor pedir ajuda ao exemplo. (universitários? nem pensar!) 😛

Arquivo: Util.java

package teste.util;
_
_ public class Util {
           protected void protectedNothing() {
                    System.out.printf(“Estou fazendo %s\n”,“Nada”);
           }
}
_
_ Arquivo: Inutil.java

package teste.util;
_
_ //Não herdou mas esta no mesmo pacote (isto funciona!)
public class Inutil {
           public void nothing() {
_                   __Util util = new Util();_
_                   util.__protectedNothing();_
_           }_
_}_
_
_ Arquivo: HerancaUtil.java

package teste.heranca;
import teste.util.Util;
_
_ //Herdou, mas não esta no mesmo pacote (isto funciona!)
public class HerancaUtil extends Util {
           public void nothing() {
_                   super__.__protectedNothing();_
_           }_
_}_

Arquivo: Main.java

package teste.main;

__import teste.heranca.HerancaUtil;

import teste.util.Inutil;

import teste.util.Util;
_
_ public class Main {
           public static void main(String args) {
                      Util util = new Util();
                      //util.protectedNothing(); //NÃO FUNCIONA
                      Inutil inutil = new __Inutil();_
_                      inutil.nothing();_
_                      __HerancaUtil
 h__erancaUtil__ = new HerancaUtil();

                      h__erancaUtil.nothing();
           }
}

(Só falta uma 🙂 )

default : O acesso é restrito as classes que estão no mesmo pacote, ou seja, classes que não estejam no mesmo pacote, mesmo as que herdam da que declarou o método, não o acessam.

Arquivo: Util.java

package teste.util;
_
_ public class Util {
           void defaultNothing() {
                    System.out.printf(“Estou fazendo %s\n”,“Nada”);
           }
}
_
_ Arquivo: Inutil.java

package teste.util;
_
_ //Não herdou mas esta no mesmo pacote (isto funciona!)
public class Inutil {
           public void nothing() {
                   Util util = new Util();_
_                   util.__defaultNothing
();

           }
}
_
_ Arquivo: HerancaUtil.java

package teste.heranca;
import teste.util.Util;
_
_ //Herdou, mas não esta no mesmo pacote (NÃO funciona!)
public class HerancaUtil extends Util {
           public void nothing() {
                   //super__.default__Nothing(); //NÃO FUNCIONA
           }
}

Arquivo: Main.java

package teste.main;

__import teste.heranca.HerancaUtil;

import teste.util.Inutil;

import teste.util.Util;
_
_ public class Main {
           public static void main(String args) {
                      Util util = new Util();
                      //util.defaultNothing(); //NÃO FUNCIONA
_                      __Inutil inutil = new __Inutil();_
_                      inutil.nothing();_
_           }_
_}_

(Ufa, terminou! 🙂 )

Espero que alguém compreenda o que esta escrito 😛

Programação Java é aqui. Acesse as o blog para ficar atualizado sobre o mundo da **Linguagem Java. Dicas, informações e muitos truques para se usar no dia-a-da do **programador java.