Modificador de acesso - private

Estava fazendo alguns testes e encontrei algo que achei estranho.

Criei a classe Pessoa abaixo:

[code]public class Pessoa {

private String nome;

public Pessoa(String nome) {
	this.nome = nome;
}

public void print(Pessoa p) {
	System.out.println(p.nome);
}

}[/code]
e uma classe principal:

[code]public class Main {

public static void main(String[] args) {
	
	Pessoa p1 = new Pessoa("P1");
	Pessoa p2 = new Pessoa("P2");
	
	p1.print(p2);
	System.out.println(p1.equals(p2));
}

}[/code]
Ao executar a classe principal, tem-se a seguinte saida:

P2
false

Repare que o método print está acessando uma variável privada de Pessoa. Apesar de serem ambos da classe Pessoa, são objetos diferentes. Isso é comprovado pela verificação com o equals.
Como é possível um objeto Pessoa acessar uma variável privada de outro objeto Pessoa?

a atributo nome é privado o metodo é publico
o pessoa.equals(pessoa)
vai sempre retornar false pois você não o sobreescreveu

[quote=Mark_Ameba]a atributo nome é privado o metodo é publico
o pessoa.equals(pessoa)
vai sempre retornar false pois você não o sobreescreveu[/quote]

Acho que o que ele quis dizer foi desse método:

public void print(Pessoa p) { System.out.println([b]p.nome[/b]); }

T+

[quote=diego2005][quote=Mark_Ameba]a atributo nome é privado o metodo é publico
o pessoa.equals(pessoa)
vai sempre retornar false pois você não o sobreescreveu[/quote]

Acho que o que ele quis dizer foi desse método:

public void print(Pessoa p) { System.out.println([b]p.nome[/b]); }

T+[/quote]

Volto a repetir(com mais explicações)
o atributo nome é privado e só pode ser visivel na propria classe
o metodo print é publico e da mesma classe que a variavel nome
sendo assim
outras classes podem chamar o metodo print
apenas a classe Pessoa pode usar a variavel nome
e print esta na classe Pessoa entãoela pode usar nome

sobre o que falei do equals é porque ele usou de referencia para mostrar a nós que são objetos diferentes, mas ele não sobrecarregou o equals da classe Object então qualquer comparação como aquela retornaria false

Exatamente Diego.

Eu não sobrescrevi o método equals propositalmente. Assim ele utilizará o equals da classe Object, ou seja, só será igual ser for o mesmo objeto.

Agora, o fato do método ser público ou não me dá o direito de acessar uma variável privada. Exemplo:

[code]public class Fool{

public void print(Pessoa p) {
	System.out.println(p.nome);
}

}[/code]
O eclipse reclama, pois não há visibilidade.

Ps: eu falei sobre o overloa do equals ^^

E agora, nesse caso, você ta tentando usar a variavel privada fora da classe

olha meus exemplos

public class Pessoa{
private String nome;//Variavel apenas vista pela classe
public void print(){//metodo publico pode ser usado em outras classes
System.out.println(nome);//como esse metodo ta dentro da classe do atributo privado ele pode usalo
}
}

agora em outro arquivo

public class Teste{ public void print(Pessoa p){ System.out.println(p.nome);//private - não é visivelpara essa classe } }

uma solução seria isso

public class Pessoa{ private String nome;//Variavel apenas vista pela classe public String getNome(){//metodo publico pode ser usado em outras classes que retorna o nosso nome return nome; } } public class Teste{ public void print(Pessoa p){ System.out.println(p.getNome());//nome ainda nãoé visivel mais você pode ter a referencia com metodo publico } }

Alias são os Getters and Setters

Quanto a função dos modificadores de acesso + getters + setters. Ok. Nenhum problema. Não é esta a dúvida.
A minha questão foi pensando na seguinte linha de raciocínio.
Uma pessoa só deseja que saibam sua idade (private), digamos, se for questionada (get).
Neste caso, uma outra pessoa consegue esta informação sem perguntar.
Apesar de ambos serem pessoas, são pessoas diferentes.
Meu pensamento foi que a “privacidade” deveria ser mantida!

Sobre isso é a questão da classe mas vocêsó deixa uma pessoa deixar saber a idade da outra se você pediroutra pessoa como parametro

exemplo

public String getNome(){
return this.nome;
}
public String getNome(Pessoa p){//Aqui deixo claro que qualqer pessoa pode pegar o nome de outra
return p.nome;
}
public static void main(String[] args){
Pessoa p = new Pessoa("Eu");
Pessoa pp = new Pessoa("Voce");
p.getNome(p);//Não teria sentido isso, teria?
p.getNome();//mais façil não é?
}

Saudações!

Pelo que entendi, a questão é por que um atributo privado de um instância pode ser acessado dentro daquela classe, mesmo se tratando de diferentes instâncias da mesma classe, não é isso? Em outras palavras, se temos duas instâncias diferentes de PESSOA, digamos P1 e P2, por que um método de P1 que recebe P2 como parâmetro pode acessar um atributo privado de P2?

Eu dei uma olhada no livro “The Java Programming Language” (de Ken Arnold e outros) e ele faz o seguinte comentário:

"It is important to realize that access control is performed on a per-class (or interface) level not on a per-object level. This means that members of a class are always accessible from all code written in that class regardless of which instance the code is being applied to. "

Ou seja, dentro de uma classe você pode acessar qualquer coisa privada daquela mesma classe, independente da instância em questão!

Falou…

Valeu Benvenuti.
Agora sim.
Era exatamente essa minha dúvida.