Private: acessa de uma classe mas não de outra?

[code]class Data {
private int dia = 0;
private int mes = 0;
private int ano = 0;

public Data(int d, int m) {
	if (verificaData(d,m)) {
		System.out.println("Data inserida com sucesso");
	} else {
		System.out.println("A data não pode ser inserida");
	}
}

public boolean verificaData(int dia, int mes) {
	if (dia == 31 && mes == 02) {
		return false;
	} else {
		this.dia = dia;
		this.mes = mes;
		return true;
	}
}

}[/code]

[code]class Funcionario {

private String nome;
private String departamento;
private String rg;

private Data dataEntrada;

public void setDataEntrada(int d, int m) {
	this.dataEntrada = new Data(d,m);
}

public void getDataEntrada() {
	System.out.println(this.dataEntrada.dia + "/" + this.dataEntrada.mes);
}

}[/code]

[code]class Teste {
public static void main(String args[]){
Funcionario f1 = new Funcionario();
f1.setSalario(1000);
f1.setDataEntrada(28,02);
f1.getDataEntrada();

	/*
	Data d = new Data(28,02);
	System.out.println(d.dia + " / " + d.mes);
	*/
}

}[/code]

Bom dia pessoal!

Por que consigo acessar os atributos da classe Data a partir da classe Funcionario e não consigo a partir da classe Teste?

Nota: Código todo desorganizado porque fiz diversos testes. Estou estudando java básico da apostila da caelum conforme recomendado.

[]´s

Seguinte:

modificadores de acesso private, só se pode acessar o atributo dentro da mesma classe.

A partir da instancia de Data em outra classe qualquer, você não terá acesso diretamente aos atributos.

Para fazê-los, crie os metodos getters e setters, por exemplo:

[code]class Data {
private int dia = 0;

//para alterar o falor do atributo
public void setDia(int dia) {
this.dia = dia;
}

//para acessar o valor do dia
public int getDia(){return dia;}
[/code]

na sua classe funcionario por exemplo, você fará assim:

Data d = new Data(); d.setDia(13); //para obter o valor atribuito a esta instancia int diaAtribuido = d.getDia();

Mas por que na classe Funcionario eu consegui alterar o dia e o mes? Por causa do método construtor invocado?
Caso contrário eu não conseguiria?

Porque na classe funcionário está insntancia Data e passando estes valores logo no construtor da classe data.

Toda classe tem um construtor, mesmo que vc não o declare, toda vez que vc cria um objeto de uma classe, o construtor é o responsável por fazer uma chamada implicita ao construtor da classe pai (super()) e inicializar algum atributo daquela classe.

Está correto, mas se vc precisar acessar os dados passados sem os metodos getters e setters para cada atributo você não terá acesso.

Espero que tenha conseguido explicar, qualquer coisa, poste ai.

Fiz o teste é é isso mesmo. Passei os valores pelo construtor.
Tentei fazer direto e deu o erro de atributo private. Fiz os testes com métodos e funcionou.

Entendi o conceito.

Obrigado.

Isso aí shinzo,

Procure encapsular os atributos de suas classes, e fazer o acesso a eles por meio dos getters e setters.

Legal dar uma lida em algum design pattern tambem, pode contribuir mto com suas aplicações.
Qualquer dúvida, poste ai.