domingo, 24 de outubro de 2010

Classes e seus Controles de Acesso

O que são Controladores ou Modificadores de Acesso?
Com certeza você já os viu, aqui mesmo neste blog. O projeto JSF, jReMSN, Hibernate e até mesmo o projeto Webservice estão cheios deles, mas o que são?

  • default
  • public
  • private
  • protected
  • final
  • abstract

Como pode ver, essas são palavras que sempre nos acompanham nas declarações de classes, métodos e variáveis, aqui vamos ver uma breve descrição de cada uma.

Classes
Para criar classes, só podemos utilizar dois controladores de acesso, na verdade um controlador (default) e um modificador (public).
É possível adicional à declaração da classe, junto com o public ou default, alguns outros modificadores como final eabstract.
Esses e todos os outros modificadores são acessíveis também à métodos e variáveis.

default
O controlador de acesso default é, como o próprio nome diz, padrão, ele está presente em TODAS as classes que não possuam um modificador, ele não é uma palavra que você indica na declaração da classe, na verdade, para utilizá-lo você não deve dizer nada para a classe!
Vejamos um exemplo básico:

class MinhaClasse{
}

Viu? Essa classe acima está utilizando o controlador de acesso default, esse controlador está presente em todas as classes que não tem uma declaração implícita (public), e ele define que esta classe está acessível à todas as classes DO MESMO PACOTE. Se você tentar instanciar ou extender esta classe de qualquer outra classe do mesmo pacote irá conseguir, porém se tentar fazer isso com uma classe de outro pacote não conseguirá!

public
O modificador de acesso public é exatamente isso, um modificador de acesso, quando declaramos uma classe comopublic estamos modificando o acesso, permitindo que todas as classes do projeto, indiferente do pacote consigam enxergar esta classe.
Exemplo:

public class MinhaClasse{
}

Esta classe acima conseguirá ser instanciada ou extendida por qualquer outra classe, indiferente do pacote que a instanciadora esteja!

final
O modificador final indica que está classe/método/variável termina aqui, esta é a ultima instancia, deste ponto em diante não muda mais!
Quando utilizado em classes, o final não deixa esta classe ser extendida (herdada), ela pode apenas ser instanciada. Desta forma você garante que os métodos desta classe serão utilizados sempre da mesma forma e nunca serão sobreescritos.

abstract
Abstract funciona de forma contrária ao final, uma classe abstract pode ser herdada, porém nunca poderá ser instanciada, funcionando apenas como "matéria prima" para a criação de uma nova subclasse que à extender.
A classe abstract pode possuir métodos abstracts, e estes não precisam possuir conteúdo, apenas a "assinatura", quando um método for marcado como abstract, ele deverá obrigatóriamente ser reescrito na subclasse e ai sim irá possuir um conteúdo.
Exemplo:

abstract class MinhaClasse{
public abstract String meuMetodo();
}

Repare que o método não possui conteúdo, nem ao menos possui chaves "{}", e termina com ponto-e-vírgula! Que absurdo!
Mas não é nenhum absurdo, esse código irá compilar sem problema algum e está 100% correto, isso por que esta é uma classe abstract e o método também é um método abstract, ou seja a classe só pode ser extendida, e a classe que fizer isso será obrigada a possuir um método com o nome meuMetodo() e retorno String.
Uma classe abstract pode também possuir métodos e variáveis normais, que também serão herdados para as subclasses.

private
Quando você declara um método ou variável como private, você o está escondendo do resto do mundo, nenhuma outra classe do seu projeto conseguirá enxergar os métodos e variáveis private, eles só serão acessíveis dentro da própria classe!

protected
Este é o primo de segundo  grau do acesso default, quando declaramos um método ou variável com acesso protectedestamos informando que para instancias, este método ou variável só está acessível à classes do mesmo pacote (idêntico ao acesso default), porém note que eu destaquei o trecho "para instancias" e isso tem um motivo, a diferença do protected para o default é em casos de herança, se a classe que possui o tal método protected for extendida por outra classe, mesmo que de pacote diferente, o método protected estará acessível à esta subclasse.

0 comentários:

Postar um comentário

Alguma dúvida?

 

© 2009Java Erro | by TNB