Sunday, June 10, 2007

Tutorial[parte3-repost]

2- Acessibilidade á Membros

Antes de falar de modificadores, devemos lembrar que se uma classe não está acessível para outra, seus membros também não estarão, não importando os modificadores usados para eles.
Vamos aos principais modificadores (não só de variáveis, como de classes e métodos também):

-Modificador de classe, método e atributo public:
Classes public podem ser instanciadas por qualquer objeto livremente.
Métodos e atributos são acessados sem restrições.

-Modificador de classe e método abstract:
Só se aplica a classes, interfaces e métodos.
Classes com o modificador abstract não permitem ser instanciadas por qualquer objeto, sendo indicado para definir superclasses genéricas.

Obs.: Toda interface é implicitamente pública e abstrata;
métodos abstratos não possuem corpo, mas devem ser implementados na classe que implementa a interface.

-Modificador de classe, método e variável final:
Uma classe final, é uma classe que não permite que seja criada subclasses dela.Ou seja, não permite herança.
Métodos final impedem que um método seja subscrito na subclasse que extende a classe a qual este método faz parte.
Variáveis declaradas final não podem possuir valor ou referências que sejam alteradas (são uma constante), incluso nisso argumentos passados a métodos.

Obs.: No caso de objetos, a referência para eles que é final, não o próprio objeto.

-Modificador de classe default:
É quando não é declarado explicitamente nenhum dos outros modificadores, sendo acessível por classes contidas no mesmo pacote.
Obs.: Variáveis com escopo de método(locais) continuam locais a onde foram declaradas, e não podem ser acessadas fora deles.

-Modificador de método e atributo protected:
Permite que um método somente possa ser invocado na classe em que é definido e nas suas subclasses. O mesmo vale para o acesso aos atributos.

-Modificador de método e atributo private:
O modificador private permite a invocação do método somente na classe a qual foi definido.
Um atributo private possui somente escopo de classe, não podendo ser acessado diretamente de qualquer classe ou subclasse que implemente a classe a qual está definido.

-Modificador de método, classes aninhadas e variáveis de classe static:
O modificador static permite que um método possa ser invocado sem a utilização de um objeto.
O uso de static permite que uma variável de classe possua uma única referência em memória.
Métodos static não conseguem acessar diretamente variáveis ou métodos não static, não podem ser sobrescritos, mas podem ser redefinidos.

Variáveis e métodos static são membros unicamente da classe a qual estão inseridos, não fazendo parte de nenhuma instância em particular.

Obs.(1): As variáveis estáticas(static) não são estáticas no sentido que não podem ser mudadas(isso seria final), mas sim por não permitirem serem criadas dinamicamente (leia-se em execução) para uma dada instância de um objeto.
Obs.(2): Uma classe aninhada é uma classe definida dentro de outra classe.
Há muitos outros modificadores como
synchronized (para permitir acesso de apenas uma thread por vez a um método ou bloco), transient (permite a JVM excluir uma variável de instância da lista de seriação (muito importante para se poupar memória quando não se deseja persistir esse atributo em disco), entre outros. Mas os mostrados aqui são os principais para quem está começando com o Java.


Depois dessa carga teórica, está na hora de fixarmos os conceitos aqui comentados, pois serão úteis na sua vida de programador.Vamos a prática observando as três classes a seguir:

 
package acessibilidade;
 
 public class Membros{
         private static String tipoDoUsuario= "";
        
         protected static String verificarStatus(int id){
                if(id==1)
               tipoDoUsuario= "Administrador";
                else
              if(id<=10)
                tipoDoUsuario= "Moderador";
              else
                tipoDoUsuario= "Usuario";
                 
                return tipoDoUsuario;             }        
                                         

}

package acessibilidade; 
import java.io.*;
 
 public class Arquivo extends Membros{
        
    private  static PrintWriter grava;
    private  static BufferedReader lerArq;
    private  static String arquivo;
    
    public Arquivo(String arquivo){
       this.arquivo=arquivo;      } 
    
 // método gravarArquivo();
  public static void gravarArquivo(String nome,int id){
 
    try
         {          
              grava = 
              new PrintWriter(new BufferedWriter(
                      new FileWriter("c:\\"+(arquivo),true),1*1024*1024));
              /* crio um arq no dir C para receber um nome dado pelo usuário */            
              grava.println("Nome:"+nome);
              grava.println("Id:"+id);
              grava.println("Status:"+verificarStatus(id));                             
            grava.close();
         }
    catch (IOException erro)
         {   System.err.println("Erro ao Gravar Arquivo!!!");
             erro.printStackTrace();
             System.exit(1);
         }
                                      } //fim de grava arquivo
 
 
 // método exibeArquivo();
  public static void exibirArquivo(){
     
     try
          {    lerArq=new BufferedReader(new FileReader(arquivo));
               String linha= null;       
                // le linha por linha do arquvo e mostra na tela 
               while ((linha = lerArq.readLine()) != null) 
                  System.out.println(linha); 
           
               lerArq.close(); 
           } 
     catch (IOException erro) { 
                System.err.println("Erro de Leitura!!!: "+ erro); 
                 erro.printStackTrace(); 
           } 
  } 

} //fim da classe Arquivo

import acessibilidade.Arquivo;
 
 public class Principal{
         public static void main(String []guj){
                Arquivo a=new Arquivo("guj.txt");
                a.gravarArquivo("Paulo",1);
                a.gravarArquivo("Daniel",10);
                a.gravarArquivo("Ana",100);
                a.exibirArquivo();
        }

} //fim da classe Principal

Observando a classe Membros, logo na primeira linha está escrito:

package acessibilidade;

O que é isso?
Um pacote(package) serve para agrupar classes relacionadas, ao compilar um dos seus componentes (por exemplo Membros.java)será criado um diretório com o nome do pacote criado(no caso acessibilidade), com o .class do membro compilado. Para compilar um package:

javac pacote/Programa.Java

e para rodar:

java pacote.Programa (no nosso caso será necessário compilar Principal, que contém nosso método main).

Nota: a instrução import nome.Do.Package.Classe; permite uma classe utilizar uma classe dentro desse package (no caso de nome Classe).

Depois de compilar os 3 arquivos e rodar Principal.java veremos a saída no prompt de comando(tela):

Nome:Paulo
Id:1
Status:Administrador
Nome:Daniel
Id:10
Status:Moderador
Nome:Ana
Id:100
Status:Usuario
Press any key to continue...

Veremos também, que foi criado no diretório C: um arquivinho de nome guj.txt com os mesmos itens mostrados no prompt. Analisando a classe Membros, notamos uma variável de classe tipoDoUsuario , que é privada, logo nenhuma outra classe ou subclasse poderá acessá-la!

-Qual será a vantagem disso?

É simples: -Além do acesso, quanto mais restritivo for um atributo, maior será o controle de um programador sobre ele, evitando uma futura inconsistência nos dados do seu programa.

Continuando, temos nessa mesma classe, um método protegido chamado verificarStatus() que retornará o tipo de usuário de acordo com o Id(que seria o número de registro) passado para o método. O fato de ser protegido permite ao método ser visível apenas para suas subclasses e classes no mesmo pacote (no caso Arquivo que herda de Membros).

Observando a classe Arquivo, temos 3 variáves de classe(grava,lerArq e arquivo) e 2 métodos de classe, gravarArquivo e exibirArquivo (obs.:métodos de classe possuem o modificador static, métodos de instância, não).Note o construtor da classe recebendo arquivo como parâmetro.Isso deixa nossa variável inicializável quando criarmos uma instância de Arquivo(o que será feito na classe Principal).Observando o método gravarArquivo, vemos que ele recebe 2 parâmetros(um nome e um id) e que dentro de um bloco try-catch esses dados serão persistidos para o disco.O bloco dentro desse método é quase igual ao dentro da classe Variaveis (de tópicos anteriores), exceto pela presença de um BufferedWriter e dos parâmetros true e 1*1024*1024 passados a FileWriter e BufferedWriter respectivamente.

O que é um buffer?Buffer é uma área reservada da memória que armazena temporariamente os dados que serão persistidos pelo seu arquivo. Ela é muito mais rápida do que gravar/ler diretamente do disco, o que gera uma otimização na sua entrada/saída para o disco. Por isso usamos um BufferedWriter e um BufferedReader. O valor true em FileWriter permite o modo append(anexar) no arquivo guj.txt. Se executarmos esse programa 2 vezes veremos que o arquivo foi duplicado e não sobscrito!O valor 1*1024*1024 especifica o valor de BufferedWriter.Quando o buffer se enche, os dados são realmente persistidos em disco.É importante notar a chamada de á verificarStatus(id) dentro de grava.println(); pois isso fará que seja persistida o retorno do método da classe Membros que é o nosso atributo privado tipoDoUsuario!Algo que o mecanismo de herança de Java sabe aproveitar muito bem!
Vejamos o método exibirArquivo(): temos um leitor de caracteres(FileReader) que lerá nosso arquivo guj.txt e usamos a variável lerArq,que é uma instância de BufferedReader que através de seu método readLine() nos permite ler linha a linha guj.txt e mostrar na tela o seu conteúdo, o que é feito no trecho:

while ((linha = lerArq.readLine()) != null)
System.out.println(linha);

Depois temos nossa classe Principal, que contém o método main() aonde criaremos a instância de Arquivo a,que recebe guj.txt como parâmetro, e chamamos 3 vezes gravarArquivo() passando diferentes parâmetros(o que fará verificarStatus() de Membros trabalhar!). Depois exibiremos seu conteúdo na tela através de a.exibirArquivo(). Veja que na primeira linha importamos acessibilidade.Arquivo; que nos permite trabalhar com os métodos dessa classe.O leitor pode estar se perguntando:

-Se eu importar acessibilidade.Membros; e criar uma instância de classe:
Membros m=new Membros();

Chamando:
m.verificarStatus(10);

Posso acessar diretamente o método verificarStatus() certo?

ERRADO!Será recebida uma msg do tipo:

verificarStatus(int) has protected access in acessibilidade.Membros

A instanciação (criação) só funcionaria se verificarStatus() tivesse acesso público (public).
Como não custa nada lembrar, só conseguimos acessar membros protegidos no mesmo pacote ou via herança! Jamais por instância!(Isso serve para atributos e métodos!).

6 comments:

Anonymous said...

I found this site using [url=http://google.com]google.com[/url] And i want to thank you for your work. You have done really very good site. Great work, great site! Thank you!

Sorry for offtopic

Anonymous said...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!

Anonymous said...

[url=http://www.hugalliance.com/]Buy Cialis Online Purchase[/url]

Anonymous said...

73078.....44155

Anonymous said...

Pleased New Year[url=http://pavuyume.tripod.com/] everybody under the sun! :)

Anonymous said...

Видео ютуб улётное http://youtu.be/knL93B57iiI
Прикольное видео секс http://youtu.be/X2sdWXysJIc
[youtube]knL93B57iiI[/youtube]
[youtube]X2sdWXysJIc[/youtube]
video youtube http://www.youtube.com/user/aeytovaresch/
Вот ещё прикольное Видео
http://www.youtube.com/watch?v=hhOFLbVNXp4

video Видео кончила видео