domingo, 30 de junho de 2013

Dicas de Programação: 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" :P ) 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!) :P

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 herancaUtil = new HerancaUtil();
                      herancaUtil.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.defaultNothing(); //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... :P

Até mais!

Um comentário:

Levi Cícero disse...

Olá Takemura, podes me adicionar no skype ou no gmail ? Se sim lá vai os contatos de ambas as redes - Skype: Leviarados / E-mail: levicicero@gmail.com - Valeu meu querido, aguardo seu contato.