Programação Orientada a Objetos - Modificadores de acesso
Autor: Guilherme Viterbo Galvão | Publicado: 2012-04-21T15:46:00-07:00



Para explicar como funcionam os modificadores de acesso vou precisar doseguinte código: 

//exemplo em C# 


public class Pessoa { &nbsp;&nbsp; private string nome; &nbsp;&nbsp; private string rg; &nbsp;&nbsp; private string cpf; &nbsp;&nbsp; private string endereco; &nbsp;&nbsp; private int idade;&nbsp;&nbsp; private string dataNascimento; &nbsp;&nbsp; public string Nome { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nome = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return nome; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; } &nbsp;&nbsp; public string Rg { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rg = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rg; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; } &nbsp;&nbsp; public string Cpf { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpf = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cpf; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; } &nbsp;&nbsp; public string Endereco { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endereco = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return endereco; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public int Idade { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idade = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return idade; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; public string DataDeNascimento { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataDeNascimento = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return dataDeNascimento; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } } //exemplo em C# public class Aluno : Pessoa{ &nbsp;&nbsp; private string ra; &nbsp;&nbsp; public string Ra { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ra = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ra; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; } } 



Com ele em mãos, vamos poder dar continuidade. Abaixo vou explicar os principáis modificadores: *public: ele dá acesso total ao método, propriedade ou até mesmo classe. Quando sua classe se tornar um objeto, o objeto passará a ter acesso à esses métodos ou propriedades. Exemplo: 


//classe Main public static void main(string[] args){ &nbsp;&nbsp; Aluno aluno = new Aluno(); &nbsp;&nbsp; aluno.Nome = "José"; &nbsp;&nbsp; // o objeto aluno têm acesso aos métodos e propriedades public. } 


*private: somente a classe têm acesso aos métodos ou propriedades com esse modificador. Um bom exemplo é a propria classe Pessoa, onde o acessor de prorpiedade "Nome" têm acesso à propriedade "nome". Os acessor de prorpiedade "Nome" é "public", mas pertencem a classe Pessoa, logo têm acesso às propriedades "private". *protected: ele faz com que as classes que possuam algum tipo de herança possa acessar seus métodos ou propriedades. Exemplo, se colocássemos que a propriedade "nome" da classe Pessoa fosse "protected", por estar herdando de Pessoa, a classe Aluno poderia acessar a propriedade nome.Exemplo: 


//classe Pessoa protected string nome; //resto da classe //classe Aluno //no caso criei esse método para exemplo. public void setSobrenome(String sobrenome){ &nbsp;&nbsp; this.nome += sobrenome; } //resto da classe Aluno 


*static: o static é um modificador de acesso que pode ser usado em conjunto com os demais citados acima (exemplo: "public static", "private static", "protected static"). Ele faz com que o método ou propriedade possa ser chamado sem instanciar a classe. Dizemos que os métodos ou propriedades "static" pertencem a classe e não à instância do objeto. Exemplo: 


public class Pessoa { &nbsp;&nbsp; public static string nome; &nbsp;&nbsp; private int idade; &nbsp;&nbsp; public int Idade { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idade = value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return idade; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; public static void main(String[] args){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa pessoa1 = new Pessoa(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa1.Idade = 10; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa1.nome = "Pedrinho"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa pessoa2 = new Pessoa(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa2.Idade = 20; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa2.nome = "José"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //não precisei instanciar a classe Pessoa para ter acesso à propriedade nome &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa.nome = "Ana"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Writeln("Nome e idade da pessoa1 " + pessoa1.nome + "\t" + pessoa1.Idade); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Writeln("Nome e idade da pessoa2 " + pessoa2.nome + "\t" + pessoa2.Idade); &nbsp;&nbsp;&nbsp; } } 


Qual será a saída? Será: Nome e idade da pessoa1 Ana 10; Nome e idade da pessoa2 Ana 20; Mas porque? Vamos lá, nós criamos 2 objetos em memória que são do tipo Pessoa, são eles "pessoa1" e "pessoa2", eles possuem posições em memŕoia diferentes (exemplo pessoa1, posição 0x00234j e pessoa2 0x00236b). Colocamos que a pessoa1 tem idade 10 e se chama "Pedrinho" logo após colocamos que a pessoa2 se chama "José" e tem 20 anos. Ok as idades apareceram de maneira correta mas os nomes não, isso porque o modificador "static" estava na propriedade nome, logo os objetos pessoa1 e pessoa2 compartilhavam a mesma posição de memória. Se fôssemos usar o Debug, iríamos perceber que ele atribui à propriedade nome com "Pedrinho", quando chega na pessoa2 ele substitui por "José" e depois substitui por "Ana". Exemplo de como ficaria a memória em relação ao exemplo acima:

*const: Ele pode ser usado em conjunto com os demais citados acima, excepto o static (exemplo: "public const, "private const", "protected const"). Ele é usado pra expressar algum valor constante ou tornar método ou classe como inalterável.
Exemplo:



const int i = 100;



O valor de "i" sempre será 100. Usando o "const" não poderemos mais mudar esse valor, afinal ele é uma constante.

No próximo post vou revisar quando uma Classe se torna um objeto, sobre o método construtor e abstração.
Abraço!!!

 prettyPrint();